Bootstrap

Servlet注解和可插拔性(第八篇)

8.1、注解和可插拔性

  • WEB-INF/classes 目录 编译java类
  • WEB-INF/lib jar库
  • 兼容Servlet 3.0的注解

8.1.1、@WebServlet 注解

  • 支持web请求,被注释类必须实现javax.servlet.http.HttpServlet

  • 例子

  • // 拦截/foo 的URI
    @WebServlet("/foo")
    public class CalculatorServlet extends HttpServlet{
         
      // ...
    }
    
    // 注解属性, 拦截/foo 或 /bar,  实现doGet方法
    @WebServlet(name="MyServlet", urlPatterns={
         "/foo", "/bar"})
    public class SampleUsingAnnotationAttributes extends HttpServlet{
         
      public void doGet(HttpServletRequest req, HttpServletResponse res)	{
         
        
      }
    }
    

8.1.2、@WebFilter (web过滤器)

  • 不能同时配置value和urlPatterns属性

  • 被@WebFilter 必须要实现javax.servlet.Filter接口

  • 例子

    • @WebFilter("/foo")
      public class MyFilter implements Filter{
             
        public void doFilter(HttpServletRequest req, HttpServletResponse res){
             
          // 实现doFilter方法
        }
      }
      

8.1.3、@WebInitParam

  • 初始化参数,它是WebServlet 和WebFilter的参数

8.1.4、@WebListener

  • web监听器,监听某些特定事件

  • 被@WebListener修饰的类,必须实现其中一个接口

    • javax.servlet.ServletContextListener
    • javax.servlet.ServletContextAttributeListener
    • javax.servlet.ServletRequestListener
    • javax.servlet.ServletRequestAttributeListener
    • javax.servlet.http.HttpSessionListener
    • javax.servlet.http.HttpSessionAttributeListener
    • javax.servlet.http.HttpSessionIdListener
  • 例子

    • @WebListener
      public class MyListener implements ServletContextListener{
             
        public void contextInitialized(ServletContextEvent sce){
             
          ServletContext sc = sce.getServletContext();
          sc.addServlet("myServlet", "Sample servlet","foo.bar.MyServlet", null, -1);
          sc.addServletMapping("myServlet", new String[]{
             
            "/urlpattern/*"
          })
        }
      }
      

8.1.5、@MultipartConfig

  • 如果用这个注解,需要支持mime/multipart 类型, 同时Servlet必须实现getParts和getPart方法
  • 配置中属性是绝对路径,如果配置相对路径,是相对于javax.servlet.context.tempdir, 这些路径都是需要通过java.io.File.isAbsolute的方法测试。

8.1.6、其他注解和约定

  • 其他全部注解都在15章
  • 每个应用都有默认的首页(index.htm(1) 和 index.jsp) ,这个配置在welcome-file-list中

8.2、可插拔性

8.2.1、模块化web.xml

  • 多个web-fragment.xml 组成一个web.xml 模块化

  • web-fragment.xml需要在jar的WEB-INF/lib目录下

  • 例子

  • <web-fragment> 
      <servlet>
    		<servlet-name>welcome</servlet-name>
       	 	<servlet-class>WelcomeServlet </servlet-class>
       </servlet>
       <listener>
    			<listener-class> RequestListener</listener-class> 
      </listener>
    </web-fragment>
    
    

8.2.2、web.xml 和web-fragment.xml的顺序

  1. 绝对顺序 在web.xml 有且只有一个 元素

    • 通过name去确定web-fragment.xml, 就算name不存在,也会处理
    • 可以配置
    • 重复name异常
  2. 相对顺序:web-fragment.xml有且只有一个元素

    • web.xm. 和WEB-INF/classes 必须在web-fragment标识ordering元素之前执行
    • 重复的name异常,需要打印错误日志,报错,部署失败,提示修复,可以使用绝对路径排序
  3. 例子

    • //web-fragment.xml
      <web-fragment>
      	<name>MyFragment1</name>
        <ordering>
        	<after>
          	<name>MyFragment2</name>