文章目录
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的顺序
-
绝对顺序 在web.xml 有且只有一个 元素
- 通过name去确定web-fragment.xml, 就算name不存在,也会处理
- 可以配置
- 重复name异常
-
相对顺序:web-fragment.xml有且只有一个元素
- web.xm. 和WEB-INF/classes 必须在web-fragment标识ordering元素之前执行
- 重复的name异常,需要打印错误日志,报错,部署失败,提示修复,可以使用绝对路径排序
-
例子
-
//web-fragment.xml <web-fragment> <name>MyFragment1</name> <ordering> <after> <name>MyFragment2</name>
-