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学习完毕!.