Annotations and pluggability(注解和插件)
这章讨论了servlet 3.0 规范中的注解定义并增强了一个web应用程序中使用的框架和库的可插性。
8.1 Annotations and pluggability(注解和插件)
在一个web应用程序中,使用注解的类将使用注解处理,如果类位于WEB-INF/classes目录,或者打成jar包放入这个应用程序的WEB-INF/lib中。
web应用程序部署描述符在web-app元素下包含了一个新的metadata-complete属性。这个属性定义不管无论web描述符是否完成,或者无论是否jar包的class文件在部署时应该检查注解和web分块。如果这个属性设置为true,部署工具必须忽略这个应用程序的class文件和web分块的现有的任何servlet注解。如果这个属性没有指定或者设置为false,部署工具必须检查应用程序class文件的注解,并且扫描web片段。
下面的注解是支持servlet 3.0规范的。
8.1.1 @WebServlet
这个注解用于定义一个web应用程序的servlet组件。这个注解指定一个类并且包含了声明的servlet的元数据。urlPatterns或者注解的value属性是必须的。所有其他注解是可选的。推荐使用value,当注解的唯一属性是url 模式并且当也用到其他属性时使用urlPatterns属性。同一个注解上使用value和urlPatterns属性石不合法的。一个servlet默认的名字,如果没有指定,是全路径类名。已注解的servlet必须至少指定一个url模式来部署。如果同样servlet在部署描述中以一个不同的名字声明,则必须实例化这个servlet的一个新的实例。如果同样的servlet类通过程序化API添加到ServletContext中,通过@WebServlet声明的值必须忽略调用并且必须创建由这个名字指定的servlet的新的实例。
使用@WebServlet类注解的类必须继承javax.servlet.http.HttpServlet类。
下面的例子演示了这个注解如何使用
CODE EXAMPLE 8-1 @WebServlet 注解例子
@WebServlet(”/foo”)
public class CalculatorServlet extends HttpServlet{
//...
}
下面的例子演示了如何使用注解的多个属性
CODE EXAMPLE 8-2 @WebServlet 注解例子 使用其他指定的属性注解
@WebServlet(name=”MyServlet”, urlPatterns={"/foo", "/bar"})
public class SampleUsingAnnotationAttributes extends HttpServlet{
public void doGet(HttpServletRequest req, HttpServletResponseres) {
}
}
8.1.2 @WebFilter
这个注解用于定义一个web应用程序的过滤器。这个注解指定了一个类并且包含了声明过滤器的元数据。这个过滤器的默认名如果没有指定则是全限定类名。urlPattern属性,servletNames属性或者注解的value属性必须指定。所有其他的属性石可选的。推荐使用value属性,当注解的唯一属性是url 模式并且当也用到其他属性的时候 使用urlPatterns属性。在同一注解上使用这两种属性石非法的。
使用这个注解的类必须实现javax.servlet.Filter类
下面的例子演示了此注解如何使用
CODE EXAMPLE 8-3 @WebFilter注解例子
@WebFilter(“/foo”)
public class MyFilter implements Filter {
public void doFilter(HttpServletRequest req, HttpServletResponse res)
{
。。。
}
}
8.1.3 @WebInitParam
这个注解用于指定初始化参数,这些参数是必须传递给Servlet或者Filter的。其是WebServlet和WebFilter的一个属性。
8.1.4 @WebListener
这个注解用于注解 一个监听器来获取独特的web应用程序上下文上不同操作的事件。使用此注解的类必须实现下面接口中的一个:
1 javax.servlet.ServletContextListener
2 javax.servlet.ServletContextAttributeListener
3 javax.servlet.ServletRequestListener
4 javax.servlet.ServletRequestAttributeListener
5 javax.servlet.http.HttpSessionListener
6 javax.servlet.http.HttpSessionAttributeListener
例子:
@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
这个注解,当指定一个servlet时,表明这个请求是mime/multipart类型的。与这个servlet对应的HttpServletRequest必须是使得mime附件可用,通过getPart和getParts方法来迭代不同的mime附件。javax.servlet.annotation.MultipartConfig的location属性和<multipart-config>的<location>元素被解释为一个绝对路径并默认为javax.servlet.context.tempdir的值。如果指定了一个相对路径,对于tempdir位置也是相对的。路径的相对和绝对是通过java.io.File.isAbsolute来判定的。
8.1.6 Other annotations / conventions(其他注解/惯例)
默认地 所有的程序在其welcome-file-list的列表中有index.htm(1)和index.jsp。描述符可能用于重写这些默认的设置。
当使用注解的时候,来自不同框架,jar包的Servlet,Listeners的加载顺序是不指定的。如果这个顺序很重要,就查看web.xml和web-fragment.xml文件的模块顺序。顺序只能在部署描述符中指定。