servlet3.1规范翻译:第8章 注解和可插拔性 .
这是Servlet3.0的新特性之一:这是Servlet3.0的新特性之一:
通过Annotation(注解)配置Servlet之前版本的Servlet配置是需要在web.xml中配置:
?servlet> ? servlet-name>
?servler-class>
?load-on-startup> ?init-param> ?param-name>
?param-value> ?/init-param>
?/servlet>
?servlet-mapping> ?servlet-name>
?
url-pattern>
?/url-pattern>
?/servlet-mapping>
而使用Annotation的方式
只需要在java源文件的Servlet类前面加上:
@WebServlet(name=”",urlPatterns={“”},initParams={@WebInitParam(name=”",value=”"),loadOnStartup=1})
这样可以避免了每创建一个Servlet都需要去web.xml中去配置的麻烦,也避免了项目整合是漏掉某些配置。
第8章 注解和可插拔性
本章讨论在web应用中使用的Servlet
3.0规范定义的注解和启用框架和库的可插拔性增强。
8.1 注解和可插拔性
在web应用中,使用注解的类仅当它们位于WEB-INF/classes目录中,或它们被打包到位于应用的WEB-INF/lib中的jar文件中时它们的注解才将被处理。
Web应用部署描述符的web-app元素包含一个新的“metadata-complete”属性。“metadata-complete”属性定义了web描述符是否是完整的,或是否应该在部署时检查jar包中的类文件和web
fragments。如果“metadata-complete”设置为“true”,部署工具必须忽略存在于应用的类文件中的所有servlet注解和web
fragments。如果metadata-complete属性没有指定或设置为“false”,部署工具必须检查应用的类文件的注解,并扫描web
fragments。
兼容Servlet3.0的web容器必须支持下面的注解。
8.1.1 @WebServlet
该注解用于在Web应用中定义Servlet组件。该注解在一个类上指定并包含关于声明的Servlet的元数据。必须指定注解的urlPatterns或value属性。所有其他属性是可选的默认设置(请参考javadoc获取更多细节)。当注解上唯一属性是url模式时推荐使用value,当使用了其他属性时使用urlPatterns属性。在同一注解上同时使用value
和
urlPatterns属性是非法的。如果没有指定Servlet名字则默认是全限定类名。被注解的sevlet必须指定至少一个url模式进行部署。如果同一个Servlet类以不同的名字声明在部署描述符中,必须实例化一个新的Servlet实例。如果同一个Servlet类使用定义在4-35页的4.4.1节
“编程式添加和配置Servlet”
的编程式API添加到ServletContext,使用@WebServlet注解声明的值必须被忽略,必须创建一个指定名字的Servlet的新的实例。
@WebServlet注解的类必须继承javax.servlet.http.HttpServlet类。
下面是如何使用该注解的一个示例。
代码示例8-1 @WebServlet
注解示例
@WebServlet(”/foo”)
public class CalculatorServlet extends
HttpServlet{
//...
}
下面是如何使用该注解指定更多的属性的一个示例。
代码示例 8-2 @WebServlet
注解示例使用其它指定的注解属性
@WebServlet(name=”MyServlet”,
urlPatterns={"/foo", "/bar"})
public class
SampleUsingAnnotationAttributes extends HttpServlet{
public void doGet(HttpServletRequest
req, HttpServletResponse res) {
}
}
8.1.2 @WebFilter
该注解用于在Web应用中定义Filter。该注解在一个类上指定且包含关于声明的过滤器的元数据。如果没有指定Filter名字则默认是全限定类名。注解的urlPatterns属性,
servletNames 属性 或 value
属性必须被指定。所有其他属性是可选的默认设置(请参考javadoc获取更多细节)。当注解上唯一属性是url模式时推荐使用value,当有使用其他属性时使用urlPatterns属性。在同一注解上同时使用value
和 urlPatterns属性是非法的。
@
WebFilter注解的类必须实现javax.servlet.Filter。
下面是如何使用该注解的一个示例。
代码示例 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
WebListener注解用于注解获得特定web应用上下文中的各种操作事件的监听器。@WebListener注解的类必须实现以下接口:
■javax.servlet.ServletContextListener
■javax.servlet.ServletContextAttributeListener
■javax.servlet.ServletRequestListener
■javax.servlet.ServletRequestAttributeListener
■javax.servlet.http.HttpSessionListener
■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
@WebServlet(name="AnnotationServlet",urlPatterns="/AnnotationServlet")
完成了一个使用注解描述的Servlet程序开发。
Serlvet3.0新特性注解@WebServlet
@WebServlet 用于将一个类声明为
Servlet,该注解将会在部署时被容器处理,容器将根据具体的属性配置将相应的类部署为
Servlet。该注解具有下表给出的一些常用属性(以下所有属性均为可选属性,但是 vlaue 或者 urlPatterns
通常是必需的,且二者不能共存,如果同时指定,通常是忽略 value 的取值)
@WebServlet有很多的属性:
asyncSupported:声明Servlet是否支持异步操作模式。
description: Servlet的描述。
displayName: Servlet的显示名称。
initParams: Servlet的init参数。
name: Servlet的名称。
urlPatterns: Servlet的访问URL。
value: Servlet的访问URL。
Servlet的访问URL是Servlet的必选属性,可以选择使用urlPatterns或者value定义。
像上面的AnnotationServlet可以描述成:
@WebServlet(name="AnnotationServlet",value="/AnnotationServlet")。
也定义多个URL访问:
如@WebServlet(name="AnnotationServlet",urlPatterns=
{"/AnnotationServlet","/AnnotationServlet2"})
或者@WebServlet(name="AnnotationServlet",value=
{"/AnnotationServlet","/AnnotationServlet2"})
再举一例://注解配置
@WebServlet(displayName = "UserServlet" //描述
, name = "UserServlet", //servlet名称
urlPatterns = { "/user" }, //url
loadOnStartup = 1, //启动项
initParams = { @WebInitParam(name = "username", value = "张三")
})//初始化参数
Servlet3.0新特性注解(annotation)登陆示例
该版本新增了若干注解,用于简化 Servlet、过滤器(Filter)和监听器(Listener)的声明,这使得 web.xml
部署描述文件从该版本开始不再是必选的了
下载所需开发环境
JDK7
Eclipse
Apache Tomcat7.0
打开Eclipse,创建一个动态web工程:login
配置tomcat服务器,选择JDK
选择Servlet的版本
编写登陆页面
步骤阅读
编写Servlet
开发Servlet3的程序需要一定的环境支持。Servlet3是Java
EE6规范的一部分,MyEclipse10和Tomcat7都提供了对Java EE6规范的支持。
Tomcat需要Tomcat7才支持Java EE6,Tomcat7需要使用JDK6。
如果使用的MyEclipse的版本较低,没有提供Java
EE6的支持,可以到Oracle官方网站下载JavaEE6的SDK进行安装,或者从Tomcat7的解压目录下的lib文件夹中把所有jar文件引用到我们的项目路径下。(例如:先建一个Java
EE5的web项目,然后把Tomcat7的解压目录下的lib文件夹中的所有jar引入到项目中,再删除Java
EE5的库引用,最后从Tomcat7的解压目录下的conf文件夹下把web.xml模板拷贝到项目,替换掉原来的web.xml)。
Servlet3.0提供了注解(annotation),使得不再需要在web.xml文件中进行Servlet的部署描述,简化开发流程。
1、新建一个Web Project,直接选择Java EE6.0。
web.xml文件
注意version="3.0"和http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd。
新建一个Servlet。写上Servlet的Name,然后Next
不需要在web.xml文件中生成Servlet的相关信息。Finish。
这样建好一个Servlet后,在web.xml文件中没有任何关于这个Servlet的描述信息。
使用注解描述Servlet。
@WebServlet(name="AnnotationServlet",urlPatterns="/AnnotationServlet")
完成了一个使用注解描述的Servlet程序开发。
--------------------------------------------------------------------------------
使用@WebServlet将一个继承于javax.servlet.http.HttpServlet的类定义为Servlet组件。