20. Servlet3.0 新特性 - 注解 - JSP
原创
©著作权归作者所有:来自51CTO博客作者咸咸瑜瑜的原创作品,请联系作者获取转载授权,否则将追究法律责任
servlet3.0新特性之注解
在JavaEE6规范中添加了了Servlet3.0 规范,该规范中允许在定义 Servlet、Filter 与 Listener 三大组件时使用注解,而不用在web.xml 进行注册了。Servlet3.0 规范允许 Web 项目没有 web.xml 配置文件。
使用servlet3.0时需要jdk6+,tomcat7+
servlet注解
在3.0规范中使用@WebServlet()注解注册一个servlet,该注解中有多个属性,常用属性如下:
属性名
| 类型
| 说明
|
urlPatterns
| String[]
| 相当于url-pattern的值
|
value
| String[]
| 与 urlPatterns 意义相同,不能与 urlPatterns 属性同时使用
|
name
| String
| 相当于servlet-name的值
|
loadOnStartup
| int
| 相当于loadOnStartup,默认值为-1
|
initParams
| WebInitParam[]
| 相当于init-param标签。其类型为另一个注解 WebInitParam 数组
|
例: 之前都是讲解2.5版本的 现在我们版本选择3.0,Eclipse 也可以打上勾勾让其允许创建web.xml :
简单版:
package Servlet;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/servlet3") //允许这样 相当于只设置了urlPatterns
public class servlet3 extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
}
允许这样 相当于只设置了urlPatterns ,如果这样的话,那么如果有 getServletName 默认返回类名【全路径】 -可以自己试试
例2:
package Servlet;
import java.io.IOException;
import java.util.Enumeration;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebInitParam;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
//value 和 urlPatterns 意义相同,但不能一起使用 二选一咯! 我们学过了 url是可以多个的。
//下面注解对应着表 自己认真看 和XML中的配置也是意义对应的 但是注意格式就好
@WebServlet(value = {"/servlet3","/servlet/33"},
name = "ServletName",
loadOnStartup = 1,
initParams= {@WebInitParam(name = "user",value = "abc"),@WebInitParam(name = "name",value = "bi-hu")}
)
public class servlet3 extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//我们可以尝试上面注解的各参数:
ServletConfig config = this.getServletConfig();
System.out.println("Servlet名称:" + config.getServletName());
Enumeration<String> iniparaments = config.getInitParameterNames();
while (iniparaments.hasMoreElements()) {
String name = iniparaments.nextElement();
System.out.println("Servlet初始化参数:Name:" + name + " Value:" + config.getInitParameter(name));
}
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
}
运行后是可以打印的 所以说 注解很方便
filter注解
在3.0 规范中使用@WebFilter()注解来注册当前的 Filter 类。目前使用注解无法指定filter的执行顺序,其会默认根据filter的名字的字母顺序执行。该注解常用属性的类型与意义如下表所示:
属性名
| 类型
| 说明
|
urlPatterns
| String[]
| 相当于url-pattern的值
|
value
| String[]
| 与 urlPatterns 意义相同,不能与 urlPatterns 属性同时使用
|
filterName
| String
| 相当于filter-name的值
|
servletNames
| String[]
| 相当于filter-mapping的子标签servlet-name,用于指定要过滤的Servlet 名称
|
initParams
| WebInitParam[]
| 相当于init-param标签。其类型为另一个注解 WebInitParam 数组
|
package Servlet;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;
import javax.servlet.annotation.WebListener;
//@WebFilter("/*") 允许这样的啊 和Servlet 差不多的 这个意思是过滤全部网站
@WebFilter(value = {"/*"},
filterName = "过滤器的名字"
)
public class fliter3 implements Filter {
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
chain.doFilter(request, response);
}
public void init(FilterConfig fConfig) throws ServletException {
}
}
这玩意和Servlet的差不多 都差不多 甚至一样啊 这里不演示了
Listener注解
Servlet3.0 规范中使用@WebListener()注解来注册当前的 Listener 类。在 Web 工程中创建好 Listener 后,直接在类上添加@WebListener 注解即可完成 Listener 的注册。
该注解有一个属性 value,表示对该监听器的描述,使用不多。
因为这玩意只有一个value属性 所以呢 我们还是演示一下吧:
package Servlet;
import javax.servlet.ServletRequestEvent;
import javax.servlet.ServletRequestListener;
import javax.servlet.annotation.WebListener;
//@WebListener //默认这样就完了 价格备注就下面那样:
@WebListener(value = "我是备注监听器的一个备注 次例子随便监听给个Request~~~")
public class Listener implements ServletRequestListener {
public void requestDestroyed(ServletRequestEvent sre) {
}
public void requestInitialized(ServletRequestEvent sre) {
System.out.println("saasddlaskdoiwj");
}
}
最后的最后 我们来讲一下
web.xml文件
在创建项目时注意选择servlet版本,创建时可以通过勾选生成web.xml文件,默认是不会生成的。
在生成的web.xml文件中的标签中有一个属性 metadata-complete,是布尔类型。其值为 true,表示可以完全使用 web.xml 中的注册信息,对 Servlet3.0 的注解将忽略。若值为 false,则表示可以使用注解, 但 web.xml 中的注册信息也起作用。若一个组件类(Servlet、Filter 或 Listener)既使用了注解,又在 web.xml 中进行了注册,则对于不同的组件,其效果是不同的:
- 使用两种方式对于同一个 Servlet 进行注册,要求 web.xml 与注解中的 url-pattern 是不能重复的。否则,服务器无法启动。
- 使用两种方式对于同一个 Filter 进行注册,无论 url-pattern 值是否相同,其效果都相当于一个 Filter。
- 使用两种方式对于同一个 Listener 进行注册,其效果与使用一种方式注册完全相同。
认真看下上面三种不同 但是!!!!!!!!!!!!
最最最主要的还是 没人人会两个一起 一般现在后面学框架的话 我就直接学注解了 不回去***的去配置那个emmmmmWeb.xml了啊!! JSP学习完毕!.
作者:咸瑜