[转]Servlet 3.0 新特性详解

原文地址:http://blog.csdn.net/xiazdong/article/details/7208316

Servlet 3.0 新特性概览

1.Servlet、Filter、Listener无需在web.xml中进行配置,可以通过Annotation进行配置;

2.模块化编程,即将各个Servlet模块化,将配置文件也分开配置。

3.Servlet异步处理,应对复杂业务处理;

4.异步Listener,对于异步处理的创建、完成等进行监听;

5. 文件上传API简化;

tomcat 7.0.X 支持Servlet 3.0

一、Annotation支持

 

1.Servlet

 

原本Servlet开发完后,必须在web.xml中配置如下代码:

 

[html] view plaincopy

  1. <servlet>
  2. <servlet-name></servlet-name>
  3. <servler-class></servlet-class>
  4. <load-on-startup></load-on-startup>
  5. <init-param>
  6. <param-name></param-name>
  7. <param-value></param-value>
  8. </init-param>
  9. </servlet>
  10. <servlet-mapping>
  11. <servlet-name></servlet-name>
  12. <url-pattern></url-pattern>
  13. </servlet-mapping>

现在只需要在java源文件的Servlet类前面加上:

@WebServlet(name="",urlPatterns={""},initParams={@WebInitParam(name="",value=""),loadOnStartup=1})

public class FirstServlet extends HttpServlet{}

代码示例:

实现一个最简单的Servlet。

[java] view plaincopy

  1. package org.servlet;
  2. import java.io.*;
  3. import javax.servlet.*;
  4. import javax.servlet.http.*;
  5. import javax.servlet.annotation.*;
  6. /*
  7. name == <servlet-name>
  8. urlPatterns == <url-pattern>,
  9. loadOnStartup == <load-on-startup>
  10. initParam == <init-param>
  11. name == <param-name>
  12. value == <param-value>
  13. */
  14. @WebServlet(name="HelloServlet" ,urlPatterns={"/HelloServlet"},loadOnStartup=1,
  15. initParams={
  16. @WebInitParam(name="name",value="xiazdong"),
  17. @WebInitParam(name="age",value="20")
  18. })
  19. public class HelloServlet extends HttpServlet{
  20. public void init(ServletConfig config)throws ServletException{
  21. super.init(config);
  22. }
  23. public void service(HttpServletRequest request,HttpServletResponse response)throws ServletException,IOException{
  24. request.setCharacterEncoding("GBK");
  25. ServletConfig config = getServletConfig();
  26. PrintWriter out = response.getWriter();
  27. out.println("<html>");
  28. out.println("<body>");
  29. out.println("Hello world"+"<br />");
  30. out.println(config.getInitParameter("name"));
  31. out.println("</body>");
  32. out.println("</html>");
  33. }
  34. }

这样的话只需要将class文件放入WEB-INF\classes 中,不需要再web.xml中作任何改动就完成部署;

2.Filter

原本Filter的配置如下:

[html] view plaincopy

  1. <filter>
  2. <filter-name></filter-name>
  3. <filter-class></filter-class>
  4. <filter>
  5. <filter-mapping>
  6. <filter-name></filter-name>
  7. <url-pattern></url-pattern>
  8. </filter-mapping>

现在只需要在java源文件的Filter类前面加上

@WebFilter(filterName="",urlPattern={"/"});

3.Listener

原本在web.xml中配置如下:

[html] view plaincopy

  1. <listener>
  2. <listener-class></listener-class>
  3. </listener>

现在只需要在java源文件的Listener类前面加上@WebListener即可;

二、web模块化

原本一个web应用的任何配置都需要在web.xml中进行,因此会使得web.xml变得很混乱,而且灵活性差,因此 Servlet 3.0可以将每个Servlet、Filter、Listener打成jar包,然后放在WEB-INF\lib中;注意各自的模块都有各自的配置文件, 这个配置文件的名称为  web-fragment.xml ;

制作一个Servlet模块的步骤:

1.编写Servlet,并编译;

2.将此编译class文件及所在包通过jar包命令打成jar包;

3.将此jar包用winrar打开,并将其中的META-INF中的manifest删除并添加 web-fragment.xml;

4.将此jar包放入WEB-INF\lib中即可;

web-fragment.xml注意点:

1.根元素为<web-fragment>;

2.<name></name>表示模块名称;

3.<ordering></ordering>是此模块的加载顺序;

4.<before><others/></before>表示第一个加载;

5.<after><name>A</name></after>表示比A后面加载;

6.可以在里面部署listener、filter、servlet

当然可以不设置任何的模块加载顺序;

代码示例:

配置两个listener模块;

FirstListener.java

[java] view plaincopy

  1. package org.listener;
  2. import javax.servlet.annotation.*;
  3. import javax.servlet.http.*;
  4. import javax.servlet.*;
  5. import java.util.*;
  6. import java.sql.*;
  7. import javax.naming.*;
  8. public class FirstListener implements ServletRequestListener{
  9. public void requestInitialized(ServletRequestEvent event){
  10. System.out.println("FirstListener created");
  11. }
  12. public void requestDestroyed(ServletRequestEvent event){
  13. System.out.println("FirstListener destroyed");
  14. }
  15. }

FirstListener 的 web-fragment.xml内容:

[html] view plaincopy

  1. <?xml version="1.0" encoding="ISO-8859-1"?>
  2. <web-fragment xmlns="http://java.sun.com/xml/ns/javaee"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
  5. <A href="http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"">http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
  6. version="3.0">
  7. <name>FirstListener</name>
  8. <listener>
  9. <listener-class>org.listener.FirstListener</listener-class>
  10. </listener>
  11. <ordering>
  12. <before>
  13. <others/>
  14. </before>
  15. </ordering>
  16. </web-fragment>

SecondListener.java

[java] view plaincopy

  1. package org.listener;
  2. import javax.servlet.annotation.*;
  3. import javax.servlet.http.*;
  4. import javax.servlet.*;
  5. import java.util.*;
  6. import java.sql.*;
  7. import javax.naming.*;
  8. public class SecondListener implements ServletRequestListener{
  9. public void requestInitialized(ServletRequestEvent event){
  10. System.out.println("SecondListener created");

[java] view plaincopy

  1. }
  2. public void requestDestroyed(ServletRequestEvent event){
  3. System.out.println("SecondListener destroyed");
  4. }
  5. }

SecondListener的 web-fragment.xml内容是:

[html] view plaincopy

  1. <?xml version="1.0" encoding="ISO-8859-1"?>
  2. <web-fragment xmlns="http://java.sun.com/xml/ns/javaee"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
  5. <A href="http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"">http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
  6. version="3.0">
  7. <name>SecondListener</name>
  8. <listener>

[html] view plaincopy

  1. <listener-class>org.listener.SecondListener</listener-class>
  2. </listener>
  3. <ordering>
  4. <after>
  5. <name>FirstListener</name>
  6. </after>
  7. </ordering>
  8. b-fragment>

然后分别打成jar包,放入 WEB-INF\lib中即可;

随便访问一个web应用,然后发现 tomcat控制台输出:

看出先加载FirstListener,再加载SecondListener;

三、Servlet 异步处理

Servlet在MVC中作为控制器,控制器负责分发任务给MODEL完成,然后把结果交给JSP显示;

而如果有许多MODEL,其中有一个MODEL处理时间很长,则会导致整个页面的显示很慢;

异步处理关键点:将复杂业务处理另外开一个线程,而Servlet将执行好的业务先送往jsp输出,等到耗时业务做完后再送往JSP页面;

一句话:先显示一部分,再显示一部分;

异步处理Servlet的注意点是:

1.需要在Annotation中注明 asyncSupported=true;

[java] view plaincopy

  1. package org.sync;
  2. import javax.servlet.*;
  3. import javax.servlet.http.*;
  4. import javax.servlet.annotation.*;
  5. import java.io.*;
  6. @WebServlet(name="AsyncServlet",urlPatterns={"/AsyncServlet"},asyncSupported=true)
  7. public class AsyncServlet extends HttpServlet{
  8. public void service(HttpServletRequest request,HttpServletResponse response)throws ServletException,IOException{
  9. request.setCharacterEncoding("GBK");
  10. response.setContentType("text/html;charset=GBK");
  11. PrintWriter out = response.getWriter();
  12. out.println("<html>");
  13. out.println("<body>");
  14. out.println("====页面开始====<hr />");
  15. AsyncContext actx = request.startAsync();
  16. actx.setTimeout(30*3000);
  17. actx.start(new MyThread(actx));
  18. out.println("====页面结束====<hr />");
  19. out.println("</body>");
  20. out.println("</html>");
  21. out.flush();
  22. }
  23. }
  24. class MyThread implements Runnable{
  25. private AsyncContext actx;
  26. public MyThread(AsyncContext actx){
  27. this.actx = actx;
  28. }
  29. public void run(){
  30. try{
  31. Thread.sleep(5*1000); //消耗5秒
  32. actx.dispatch("/1.jsp");
  33. }
  34. catch(Exception e){}
  35. }
  36. }

1.jsp

[html] view plaincopy

  1. <%@ page contentType="text/html;charset=GBK" pageEncoding="GBK" session="false"%>
  2. <html>
  3. <body>
  4. <%
  5. out.println("======复杂业务方法====");
  6. %>
  7. </body>
  8. </html>

四、异步监听器

异步监听器用来监听异步处理事件;即“三”中讲到的知识点;

此监听器类似于ServletContextListener的机制;

只需要实现AsyncListener接口即可;

此接口有4个方法:
public void onStartAsync(AsyncEvent event)throws IOException;

public void onComplete(AsyncEvent event);

public void onTimeout(AsyncEvent event);

public void onError(AsyncEvent event);

以下是监听器实现的代码:

[java] view plaincopy

  1. package org.listener;
  2. import javax.servlet.annotation.*;
  3. import javax.servlet.http.*;
  4. import javax.servlet.*;
  5. import java.util.*;
  6. import java.sql.*;
  7. import javax.naming.*;
  8. import java.io.*;
  9. public class MyListener implements AsyncListener{
  10. public void onStartAsync(AsyncEvent event)throws IOException{}
  11. public void onComplete(AsyncEvent event){
  12. System.out.println("-----------------------Complete");
  13. }
  14. public void onTimeout(AsyncEvent event){
  15. }
  16. public void onError(AsyncEvent event){}
  17. }

在Servlet异步处理处添加:

actx.addListener(new MyListener());就可以添加监听器,每当异步处理完成时就会触发onComplete()事件,输出Complete;

五、文件上传改进API

原本文件上传时通过 common-fileupload或者SmartUpload,上传比较麻烦,在Servlet 3.0 中不需要导入任何第三方jar包,并且提供了很方便进行文件上传的功能;

注意点:

1. html中 <input type="file">表示文件上传控件;

2. form的 enctype="multipart/form-data";

3.在Servlet类前加上 @MultipartConfig

4.request.getPart()获得;

下面是一个文件上传的例子:

upload.html

[html] view plaincopy

  1. <html>
  2. <body>
  3. <form method="post" enctype="multipart/form-data" action="upload">
  4. <input type="file" id="file" name="file"/>
  5. <input type="text" id="name" name="name"/>
  6. <input type="submit" value="提交"/>
  7. </form>
  8. </body>
  9. </html>

UploadServlet.java

[java] view plaincopy

  1. package org.servlet;
  2. import java.io.*;
  3. import javax.servlet.*;
  4. import javax.servlet.http.*;
  5. import javax.servlet.annotation.*;
  6. @WebServlet(name="UploadServlet" ,urlPatterns={"/upload"})
  7. @MultipartConfig
  8. public class UploadServlet extends HttpServlet{
  9. public void init(ServletConfig config)throws ServletException{
  10. super.init(config);
  11. }
  12. public void service(HttpServletRequest request,HttpServletResponse response)throws ServletException,IOException{
  13. Part part = request.getPart("file");
  14. PrintWriter out = response.getWriter();
  15. out.println("此文件的大小:"+part.getSize()+"<br />");
  16. out.println("此文件类型:"+part.getContentType()+"<br />");
  17. out.println("文本框内容:"+request.getParameter("name")+"<br />");
  18. out.println(UploadUtil.getFileName(part)+"<br />");
  19. part.write("F:\\1."+UploadUtil.getFileType(part));
  20. }
  21. }

UploadUtil.java

由于在Servlet 3.0中很难获取上传文件的类型,因此我写了两个工具类,可以方便开发;

[java] view plaincopy

    1. /**
    2. * 此工具类只适用于Servlet 3.0
    3. * 为了弥补 Servlet 3.0 文件上传时获取文件类型的困难问题
    4. *
    5. * @author xiazdong
    6. */
    7. import javax.servlet.http.*;
    8. public class UploadUtil{
    9. public static String getFileType(Part p){
    10. String name = p.getHeader("content-disposition");
    11. String fileNameTmp = name.substring(name.indexOf("filename=")+10);
    12. String type = fileNameTmp.substring(fileNameTmp.indexOf(".")+1,fileNameTmp.indexOf("\""));
    13. return type;
    14. }
    15. public static String getFileName(Part p){
    16. String name = p.getHeader("content-disposition");
    17. String fileNameTmp = name.substring(name.indexOf("filename=")+10);
    18. String fileName = fileNameTmp.substring(0,fileNameTmp.indexOf("\""));
    19. return fileName;
    20. }
    21. }
时间: 2024-12-25 18:19:50

[转]Servlet 3.0 新特性详解的相关文章

Servlet 3.0 新特性详解

转自:https://www.ibm.com/developerworks/cn/java/j-lo-servlet30/ Servlet 3.0 新特性详解 张 建平2010 年 4 月 23 日发布 WeiboGoogle+用电子邮件发送本页面 6 Servlet 3.0 新特性概述 Servlet 3.0 作为 Java EE 6 规范体系中一员,随着 Java EE 6 规范一起发布.该版本在前一版本(Servlet 2.5)的基础上提供了若干新特性用于简化 Web 应用的开发和部署.其

Servlet 3.0 新特性详解 (转载)

原文地址:https://www.ibm.com/developerworks/cn/java/j-lo-servlet30/ Servlet 3.0 新特性概述 Servlet 3.0 作为 Java EE 6 规范体系中一员,随着 Java EE 6 规范一起发布.该版本在前一版本(Servlet 2.5)的基础上提供了若干新特性用于简化 Web 应用的开发和部署.其中有几项特性的引入让开发者感到非常兴奋,同时也获得了 Java 社区的一片赞誉之声: 异步处理支持:有了该特性,Servlet

JavaWeb学习之Servlet3.0新特性详解

异步处理支持:有了该特性,Servlet 线程不再需要一直阻塞,直到业务处理完毕才能再输出响应,最后才结束该 Servlet 线程.在接收到请求之后,Servlet 线程可以将耗时的操作委派给另一个线程来完成,自己在不生成响应的情况下返回至容器.针对业务处理较耗时的情况,这将大大减少服务器资源的占用,并且提高并发处理速度. 新增的注解支持:该版本新增了若干注解,用于简化 Servlet.过滤器(Filter)和监听器(Listener)的声明,这使得 web.xml 部署描述文件从该版本开始不再

Android群英传笔记——第十二章:Android5.X 新特性详解,Material Design UI的新体验

Android群英传笔记--第十二章:Android5.X 新特性详解,Material Design UI的新体验 第十一章为什么不写,因为我很早之前就已经写过了,有需要的可以去看 Android高效率编码-第三方SDK详解系列(二)--Bmob后端云开发,实现登录注册,更改资料,修改密码,邮箱验证,上传,下载,推送消息,缩略图加载等功能 这一章很多,但是很有趣,也是这书的最后一章知识点了,我现在还在考虑要不要写这个拼图和2048的案例,在此之前,我们先来玩玩Android5.X的新特性吧!

java10 新特性 详解

引言: 点击-->java9 新特性 详解 点击-->java8 新特性 详解 正题: 1.局部变量var 将前端思想var关键字引入java后段,自动检测所属于类型,一种情况除外,不能为null,因为不能判断具体类型,会报异常. @Test public void test1(){ var number = 10; var str = "i like java"; var list = new ArrayList<>(); var map = new Hash

Servlet 3.0 新特性概述

Servlet 3.0 新特性概述 Servlet 3.0 作为 Java EE 6 规范体系中一员,随着 Java EE 6 规范一起发布.该版本在前一版本(Servlet 2.5)的基础上提供了若干新特性用于简化 Web 应用的开发和部署.其中有几项特性的引入让开发者感到非常兴奋,同时也获得了 Java 社区的一片赞誉之声: 异步处理支持:有了该特性,Servlet 线程不再需要一直阻塞,直到业务处理完毕才能再输出响应,最后才结束该 Servlet 线程.在接收到请求之后,Servlet 线

atitit.j2ee 1.5 1.6 的不同跟 Servlet 3.0新特性总结

atitit.j2ee 1.5 1.6 的不同跟 Servlet 3.0新特性总结 1. jar比较,j2ee 1.6 添加了许多的jar 1 2. ,Servlet 3.0 2 2.1. 可插性  web片段 2 2.2. 异步处理 3 2.3. anno支持filter,sevlet,listen 3 2.4. 三.元数据和通用注释 3 2.5. 现有API的改进 HttpServletRequest,,HttpServletRequest,,ServletContext,,dynac fi

[Android 新特性] 安卓4.4新特性详解

在本月初,谷歌的5太子google  nexus5正式发布了,还给大家带来了全新的安卓android4.4的操作系统,并且官网给大家带来了新的说法,就是安卓4.4会比之前的系统更加省电,这个到底是为什么呢?网侠小编就来说说安卓4.4的为何省电的工作机制. 首先,我们要搞清楚一个问题,那就是什么是Dalvik? 在整个Android 4.4的更新特性中,最引人瞩目的应该就是虚拟机由Dalvik转成ART,也就是“中间件”的变更(Midware).先来看看什么是Dalvik. 如图,Dalvik虚拟

java Servlet 3.0新特性例子

迟到的作业,Servlet3.0 已经出来很久了也没去关注,一直守旧于老的技术,今天抽时间学习了一下补个作业. Servlet3.0  特性: 1.Servlet.Filter.Listener无需在web.xml中进行配置,可以通过Annotation进行配置: 2.模块化编程,即将各个Servlet模块化,将配置文件也分开配置. 3.Servlet异步处理,应对复杂业务处理: 4.异步Listener,对于异步处理的创建.完成等进行监听: 5. 文件上传API简化: 备注:tomcat7.0