Servlet3.0(java ee6)中加入了新增的标注支持,用于简化Servlet、Filter、Listener的声明,这使得web.xml部署描述文件从该版本开始不再是必选的了。
Servlet3.0的部署描述文件web.xml的顶层标签<web-app>有一个metadata-complete属性,该属性为true,则容器在部署时只依赖部署描述文件,忽略所有标注,如果不配置该属性,或者将其设置为false,则表示启动标注支持。
采用标注方式配置Servlet类是通过在Servlet类定义之前的位置添加标注信息来实现:
package javaee.servlet;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.annotation.*;
//说明该类是一个Servlet
@WebServlet(
urlPatterns = {"/sayHello"},//Servlet的路径
initParams = {//初始化参数,以名-值对的形式定义
@WebInitParam(name="language", value="english")
})
public class HelloWorldServlet extends HttpServlet{
//处理Http请求
public void service(HttpServletRequest request, HttpServletResponse response)
throws IOException,ServletException{
//使输出页面支持中文
response.setContentType("text/html;charset=utf-8");
//获得输出对象
PrintWriter out = response.getWriter();
//获得初始化参数
String language = getInitParameter("language");
out.println("<p>语言是 "+language+"<p>");
}
}
该标注具有下表给出的一些常用属性
下面总结采用标注方式配置Servlet报404错误的几种原因
- 采用了java EE5或以前的版本,只有java EE5才支持Servlet 3.0版本的特性
- 在xml.web中web-app标签的version属性不为3.0,导致容器没有按照Servlet 3.0版本正确配置
- Tomcat7之后的版本才会支持该特性,使用MyEclipse自带的tomcat可能导致失败
注意:当metadata-complete="false"时,web.xml和注解对于Servlet的影响同时起作用,两种方法定义的url-partten都可以访问到该Servlet,但是当通过web.xml定义的url-partten访问时,注解定义的属性(初始化参数等)将失效。