最新版Servlet3.1规范--注解

来源:互联网 发布:电脑绘图板软件 编辑:程序博客网 时间:2024/06/14 07:28

Servlet3.0规范提供了注解(annotation),使得不再需要在web.xml文件中进行Servlet的部署描述,现对最新版官方文档中5个注解详细整理总结。

链接:Servlet3.1官方文档

1.@WebServlet注解Servlet
1.1示例代码:

import java.io.IOException;import javax.servlet.ServletException;import javax.servlet.annotation.WebServlet;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse; @WebServlet("/ServletDemo")public class ServletDemo extends HttpServlet {    public void doGet(HttpServletRequest request, HttpServletResponse response)            throws ServletException, IOException {        response.getWriter().write("Hello Servlet!");    }     public void doPost(HttpServletRequest request, HttpServletResponse response)            throws ServletException, IOException {        this.doGet(request, response);    }}
1.2详细说明:

  使用@WebServlet将一个继承于javax.servlet.http.HttpServlet的类定义为Servlet组件。

  @WebServlet有很多的属性:

asyncSupported
声明Servlet是否支持异步操作模式。
description
Servlet的描述。
displayName
Servlet的显示名称。
initParams
Servletinit参数。
name
Servlet的名称。
urlPatterns
Servlet的访问URL
value
Servlet的访问URL


Servlet的访问URLServlet的必选属性,可以选择使用urlPatterns或者value定义。
像上面的ServletDemo可以描述成@WebServlet("/ServletDemo");

也可描述成@WebServlet(name="ServletDemo",value="/ServletDemo")

也定义多个URL访问:

@WebServlet(name="ServletDemo",urlPatterns={"/ServletDemo","/ServletDemo2"})

或者@WebServlet(name="AnnotationServlet",value={"/ServletDemo","/ServletDemo2"})

2.@WebFilter注解过滤器
2.1代码示例:

import java.io.IOException;import javax.servlet.Filter;import javax.servlet.FilterChain;import javax.servlet.FilterConfig;import javax.servlet.ServletException;import javax.servlet.ServletRequest;import javax.servlet.ServletResponse;import javax.servlet.annotation.WebFilter;@WebFilter("/*")public class Servlet3Filter implements Filter {    @Override    public void destroy() {        System.out.println("过滤器销毁");    }    @Override    public void doFilter(ServletRequest request, ServletResponse response,            FilterChain chain) throws IOException, ServletException {        System.out.println("执行过滤操作");        chain.doFilter(request, response);    }    @Override    public void init(FilterConfig config) throws ServletException {        System.out.println("过滤器初始化");    }}
2.2详细说明

@WebFilter 的属性:

属性名
类型
描述
filterName  
String
指定过滤器的 name 属性,等价于 <filter-name>。
value
 String[]
该属性等价于 urlPatterns 属性。但是两者不应该同时使用。
urlPatterns 
String[]
指定一组过滤器的 URL 匹配模式。等价于 <url-pattern> 标签。
servletNames
String[]
指定过滤器将应用于哪些 Servlet。取值是 @WebServlet 中的 name 属性的取值,或者是 web.xml 中 <servlet-name> 的取值。
dispatcherTypes
DispatcherType
指定过滤器的转发模式。具体取值包括: ASYNC、ERROR、FORWARD、INCLUDE、REQUEST。
initParams
WebInitParam[]
指定一组过滤器初始化参数,等价于 <init-param> 标签。
asyncSupported
boolean
声明过滤器是否支持异步操作模式,等价于 <async-supported> 标签。
description
String
该过滤器的描述信息,等价于 <description> 标签。
displayName
String

该过滤器的显示名,通常配合工具使用,等价于 <display-name> 标签。











过滤器中使用了@WebFilter("/*"),等价于@WebFilter(filterName="ServletFilter",urlPatterns="/*")进行配置,Filter的名字是ServletFilter,
表示urlPatterns="/*"该Filter拦截所有的请求。
使用@WebFilter注解,我们可以将一个实现了javax.servlet.Filte接口的类定义为过滤器,用urlPatterns属性或者value属性指定要过滤的URL模式。
可以指定多种过滤模式@WebFilter(filterName="ServletFilter",urlPatterns={"/UserManagerServlet","/index.jsp"})。有了@WebFilter注解之后,我们的

web.xml就无需任何配置了。

3. WebInitParam  初始化属性
3.1示例代码:
import java.io.IOException;  import java.io.PrintWriter;  import javax.servlet.ServletConfig;  import javax.servlet.ServletException;  import javax.servlet.annotation.WebServlet;  import javax.servlet.annotation.WebInitParam;  import javax.servlet.http.HttpServlet;  import javax.servlet.http.HttpServletRequest;  import javax.servlet.http.HttpServletResponse;  @WebServlet(      name = "WebInitParamExample", urlPatterns = {"/hello"}      ,initParams = {      @WebInitParam(name= "Site :", value="http://roseindia.net"),      @WebInitParam(name= "Rose", value= "India"),      }  )  public class WebInitParamExample extends HttpServlet{      public void doGet(HttpServletRequest request, HttpServletResponse response)      throws ServletException, IOException      {          response.setContentType("text/html");          PrintWriter out = response.getWriter();          out.println("<h2>Init Param Servlet Example</h2>");          ServletConfig config= getServletConfig();          String pValue= config.getInitParameter("Site :");          out.println("Param Value : "+pValue);          String pValue1= config.getInitParameter("Rose");          out.println("<br>Param Value : "+pValue1);          out.close();      }  }  
3.2详细说明
在以前的servlet中我们初始化一些参数都是配置在web.xml中的,自从servlet3.0标准之后给我们提供了注解@WebServlet和@WebInitParam,@WebServlet是用来配置servlet的属性的,@WebInitParam是用来配置一些初始化属性的。

4. @WebListener 注解监听器
4.1 示例代码:

import javax.servlet.ServletContextEvent;import javax.servlet.ServletContextListener;import javax.servlet.annotation.WebListener;@WebListenerpublic class MyServletContextListener implements ServletContextListener {    @Override    public void contextDestroyed(ServletContextEvent sce) {        System.out.println("ServletContex销毁");    }    @Override    public void contextInitialized(ServletContextEvent sce) {     System.out.println("ServletContex初始化");    System.out.println(sce.getServletContext().getServerInfo());    }}

4.2 详细说明:

Servlet3.0规范之后提供@WebListener注解将一个实现了特定监听器接口的类定义为监听器,这样我们在web应用中使用监听器时,也不再需要在web.xml文件中配置监听器的相关描述信息了。

5.@MultipartConfig 支持文件上传注解
5.1 示例代码Servlet
import java.io.File;import java.io.IOException;import java.io.PrintWriter;import java.util.Collection;import javax.servlet.ServletException;import javax.servlet.annotation.MultipartConfig;import javax.servlet.annotation.WebServlet;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import javax.servlet.http.Part;//使用@WebServlet配置UploadServlet的访问路径@WebServlet(name = "UploadServlet", urlPatterns = "/UploadServlet")// 使用注解@MultipartConfig将一个Servlet标识为支持文件上传.@MultipartConfigpublic class UploadServlet extends HttpServlet{    public void doGet(HttpServletRequest request, HttpServletResponse response)            throws ServletException, IOException    {        request.setCharacterEncoding("utf-8");        response.setCharacterEncoding("utf-8");        response.setContentType("text/html;charset=utf-8");        // 存储路径        String savePath = request.getServletContext()                .getRealPath("/WEB-INF/uploadFile");        // 获取上传的文件集合        Collection<Part> parts = request.getParts();        // 上传单个文件        if (parts.size() == 1)        {            // Servlet3.0将multipart/form-data的POST请求封装成Part,通过Part对上传的文件进行操作。            // Part part = parts[0]; 从上传的文件集合中获取Part对象            Part part = request.getPart("file");            // 通过表单file控件(<input type="file"name="file">)的名字直接获取Part对象。            // Servlet3.0没有提供直接获取文件名的方法,需要从请求头中解析出来.            // 获取请求头,请求头的格式:form-data; name="file"; filename="snmp4j--api.zip"            String header = part.getHeader("content-disposition");            // 获取文件名            String fileName = getFileName(header);            // 把文件写到指定路径            part.write(savePath + File.separator + fileName);        } else        {            // 一次性上传多个文件            for (Part part : parts)            {// 循环处理上传的文件                // 获取请求头,请求头的格式:form-data; name="file"; filename="snmp4j--api.zip"                String header = part.getHeader("content-disposition");                // 获取文件名                String fileName = getFileName(header);                // 把文件写到指定路径                part.write(savePath + File.separator + fileName);            }        }        PrintWriter out = response.getWriter();        out.println("上传成功");        out.flush();        out.close();    }    /**     * 根据请求头解析出文件名     * 请求头的格式:火狐和google浏览器下:form-data; name="file"; filename="snmp4j--api.zip"     * IE浏览器下:form-data; name="file"; filename="E:\snmp4j--api.zip"     *      * @param header     *            请求头     *      * @return 文件名     */    public String getFileName(String header)    {        /**         * String[] tempArr1 = header.split(";");代码执行完之后,在不同的浏览器下,tempArr1数组里面的内容稍有区别         * 火狐或者google浏览器下:tempArr1={form-data,name="file",filename="snmp4j--api.zip"}         * IE浏览器下:tempArr1={form-data,name="file",filename="E:\snmp4j--api.zip"}         */        String[] tempArr1 = header.split(";");        /**         * 火狐或者google浏览器下:tempArr2={filename,"snmp4j--api.zip"}         * IE浏览器下:tempArr2={filename,"E:\snmp4j--api.zip"}         */        String[] tempArr2 = tempArr1[2].split("=");        // 获取文件名,兼容各种浏览器的写法        String fileName = tempArr2[1]                .substring(tempArr2[1].lastIndexOf("\\") + 1)                .replaceAll("\"", "");        return fileName;    }    public void doPost(HttpServletRequest request, HttpServletResponse response)            throws ServletException, IOException    {        this.doGet(request, response);    } }

jsp页面代码:

<%@ page language="java" pageEncoding="UTF-8"%><!DOCTYPE HTML><html>  <head>    <title>Servlet3.0实现文件上传</title>  </head>  <body>        <fieldset>            <legend>                上传单个文件            </legend>            <!-- 文件上传时必须要设置表单的enctype="multipart/form-data"-->            <form action="${pageContext.request.contextPath}/UploadServlet"                method="post" enctype="multipart/form-data">                上传文件:                <input type="file" name="file">                <br>                <input type="submit" value="上传">            </form>        </fieldset>        <hr />        <fieldset>            <legend>                上传多个文件            </legend>            <!-- 文件上传时必须要设置表单的enctype="multipart/form-data"-->            <form action="${pageContext.request.contextPath}/UploadServlet"                method="post" enctype="multipart/form-data">                上传文件:                <input type="file" name="file1">                <br>                上传文件:                <input type="file" name="file2">                <br>                <input type="submit" value="上传">            </form>        </fieldset>    </body></html>

5.2 详细说明:

 在Servlet2.5中,我们要实现文件上传功能时,一般都需要借助第三方开源组件,例如Apache的commons-fileupload组件,在Servlet3.0规范之后提供了对文件上传的原生支持,我们不需要借助任何第三方上传组件,直接使用Servlet3.0提供的API就能够实现文件上传功能了。 
 @MultipartConfig有如下可选属性:

maxRequestSizelong是针对该 multipart/form-data 请求的最大数量,默认值为 -1,表示没有限制。fileSizeThresholdint是当数据量大于该值时,内容将被写入文件。locationString是存放生成的文件地址。maxFileSizelong是允许上传的文件最大值。默认值为 -1,表示没有限制。




1 0
原创粉丝点击