最新版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
Servlet的init参数。
name
Servlet的名称。
urlPatterns
Servlet的访问URL。
value
Servlet的访问URL。
Servlet的访问URL是Servlet的必选属性,可以选择使用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> 标签。
表示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有如下可选属性:
1 0
- 最新版Servlet3.1规范--注解
- servlet3.1规范翻译:第8章 注解和可插拔性
- servlet3.1规范: 第8章 注解和可插拔性
- servlet3.1规范翻译:前言
- servlet3.1规范翻译:词汇表
- servlet3注解
- Servlet3.1规范翻译——词汇表
- servlet3.1规范: 第13章 安全
- servlet3.0规范
- servlet3.0 使用注解
- Servlet3.0注解
- 注解&servlet3.0
- servlet3注解和可插拔性
- servlet3.1规范翻译:第1章 概述
- servlet3.1规范: 第1章 Servlet概览
- servlet3.1规范翻译:第2章 Servlet接口
- servlet3.1规范翻译:第3章 请求
- servlet3.1规范翻译:第4章 Servlet上下文
- android_109_旋转菜单
- poj 3984 迷宫问题(简单迷宫)
- hdu 2546 饭卡 01背包
- java中的StringBuilder和StringBuffer
- LINQ
- 最新版Servlet3.1规范--注解
- 1075. PAT Judge (25)-排序(难)
- NODE基础(三)
- 正则表达式元字符 限定符 括号
- 算法训练 排序
- 算法相关——Java排序算法之桶排序(一)
- opencv Canny边缘检测用法
- python pip 安装出现Microsoft Visual C++ 10.0 is required错误
- 第四章 进程的调度