标签:servlet 特性 webservlet
- Servlet3.0规范是JavaEE6.0规范中的子规范。其要求运行环境最低是JDK6.0,Tomcat7.0。而之前学习的是Servlet2.5版本的规范,其是JavaEE5.0规范的子规范。其要求运行环境最低是JDK5.0,Tomcat5.0。
- 在Eclipse中使用Serlvet3.0规范,则需要在创建动态Web工程时就要指定。其具体用法是,在Eclipse中创建动态Web工程时,指定创建的“动态Web模块版本”为3.0版本。此时创建的Web工程中默认是没有web.xml文件的。
1、Servlet3.0的注解:
- Servlet3.0中允许在定义Servlet、Filter与Listener三大组件时使用注解,而不用在web.xml进行注册。Servlet3.0规范允许Web项目没有web.xml配置文件。
a、Servlet3.0规范中使用@WebServlet()注解来注册自定义的Servlet类。该注解具有多个属性,常用属性的类型与意义如下表所示:(需要注意的是,能够省略的只有value属性,其他属性一概不能够省略)
- 示例代码:
- 使用@WebServlet()注解自定义Servlet类:
package com.geeklicreed.servlet; import java.io.IOException; import java.io.PrintWriter; import java.util.Enumeration; 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; //@WebServlet("/someServlet") 此处完整写法为:@WebServlet(value="/someServlet") /* @WebServlet(value={"/some","/xxx", "/yyy"}) 这种写法可以使用http://localhost:8080/annotation-servlet/xxx、 http://localhost:8080/annotation-servlet/yyy和 http://localhost:8080/annotation-servlet/yyy三种方式访问这个Servlet */ @WebServlet(value="/some", //设置属性urlPattern与属性value功能相同 name="some-servlet", //设置ServletName initParams={@WebInitParam(name="username", value="geeklicreed"), //设置初始化参数 @WebInitParam(name="password", value="888888")}, loadOnStartup=2 //默认是-1,如果设置为大于0,则在应用启动时创建Servlet实例(参看之前专题) ) public class SomeServlet extends HttpServlet { private static final long serialVersionUID = 1L; protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //获取ServletName String servletName = this.getServletName(); //获取初始化参数 Enumeration<String> names = this.getInitParameterNames(); response.setContentType("text/html;charset=UTF-8"); PrintWriter out = response.getWriter(); out.append("Servlet at Servlet3.0 <br/>"); out.append("servletName = " + servletName + "<br/>"); while(names.hasMoreElements()){ String name = names.nextElement(); String value = this.getInitParameter(name); out.print(name + " = " + value + "<br/>"); } } }
- 启动web应用,访问该servlet,在浏览器中的显示结果如下:
- 需要注意的是,如果注解编写错误(如value="some"),则会无法启动tomcat服务器。
b、Servlet3.0规范中使用@WebFilter()注解来注册自定义的Filter类。该注解具有多个属性,常用属性的类型与意义如下表所示:
- 示例代码:
- 使用@WebFilter()注解自定义Filter类:
package com.geeklicreed.fillter; import java.io.IOException; import javax.servlet.DispatcherType; 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; @WebFilter(value = "/*", dispatcherTypes = DispatcherType.REQUEST) public class SomeFilter implements Filter { public SomeFilter() { } public void destroy() { } public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { //System.out.println("执行Servlet前的请求过滤代码"); chain.doFilter(request, response); //System.out.println("执行Servlet后的响应过滤代码"); } public void init(FilterConfig fConfig) throws ServletException { } }
- 启动web应用,可以发现已经在控制台中打印如下内容:
c、Servlet3.0规范中使用@WebListener注解来注册自定义的Listener类。(该注解没有任何属性,在自定义Listener类中使用@WebListener注解即可)
- 示例代码:
- 使用@WebListener注解自定义Listener类:
package com.geeklicreed.listener; import javax.servlet.ServletContextEvent; import javax.servlet.ServletContextListener; import javax.servlet.annotation.WebListener; @WebListener public class MyServletContextListener implements ServletContextListener { public MyServletContextListener() { } public void contextDestroyed(ServletContextEvent sce) { } public void contextInitialized(ServletContextEvent sce) { System.out.println("应用启动"); } }
- 当应用启动时,可以看到控制台打印如下信息,说明该Listener已经起作用:
d、采用Servlet2.5规范的web.xml配置和Servlet3.0的注解两种方式同时存在的情况,需要注意的问题:
- 注册Servlet:若两种方式的url-pattern值相同,则应用无法启动;若两种方式的url-pattern值不同,那么相当于该Servlet具有两个url-pattern。
- 注册Filter:若对于Filter采用这两种方式同时进行注册,无论url-pattern的值是否相同,其都是作为两个独立的Filter出现的。
- 注册Listener:若对于Listener采用这两种方式同时进行注册,其仅仅相当于一个Listener。
- <web-app/>中的属性metadata-complete的值若为true,则表示对三大组件的注册方式,只有web.xml的注册起作用,将忽略注解的注册;若为false,则表示两种注册方式同时起作用。(默认)
本文出自 “12392717” 博客,请务必保留此出处http://12402717.blog.51cto.com/12392717/1977779
标签:servlet 特性 webservlet
原文地址:http://12402717.blog.51cto.com/12392717/1977779