Servlet 3.0 新特性详解


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 plain copy

  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 plain copy

  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 plain copy

  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>   
  9.   
  10.    

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

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

 

3.Listener

 

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

 

[html] view plain copy

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

现在只需要在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 plain copy

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

FirstListener 的 web-fragment.xml内容:

 

[html] view plain copy

  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 plain copy

  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 plain copy

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

SecondListener的 web-fragment.xml内容是:

 

[html] view plain copy

  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 plain copy

  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 plain copy

  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 plain copy

  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 plain copy

  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 plain copy

  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 plain copy

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

UploadUtil.java

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

 

[java] view plain copy

  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. }  
  22.   
  23.    
  24.    

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
本系统是应用于企业会议管理的系统,实现自动管理会议室,及时准确得知会议室空闲、预定情况,规范公司会议管理,实现公司信息资源在各部门之间快速有效传递,避免资源的冲突。提高了会议室的使用率,节省会议组织者的时间,妥善保管了会议记录。 学习目标 本系列讲座主要讲述如何利用Servlet3.0+mybatis+bootstrap+mysql构建企业级应用解决方案,主要分为三部分完成 第一部分:技能储备阶段,学习项目所需要的技能知识 第二部分:设计部分,通过需求分析,设计物理模型,画出原型界面(HTML) 第三部分:编码部分,具体实现各个功能模块 学完本系列课程后,学员将会达到以下学习目标: 本课程针对有一定程序开发基础并有志于JAVA WEB开发的学员,理解MVC开发模式,能够熟练使用PowerDesigner 设计数据库,熟练使用mybatis进行开发,熟悉Servlet3.0的一些新特性,掌握bootstrap基本用法 课程大纲 (一)会议管理系统之技能储备 第01课 项目简介、环境搭建 第02课 servlet3.0新特性之@WebServlet(登录示例) 第03课 servlet3.0新特性之@WebServlet_@WebInitParam详解 第04课 servlet3.0新特性之@WebFilter_@WebListener 第05课 JQuery AJAX 注册验证+二级菜单(JSON) 第06课 mybatis 框架搭建 第07课 mybatis 增删改查 第08课 mybatis 动态sql 第09课 bootstrap的搭建+栅格系统+table 第10课 bootstrap 表单 (二)会议管理系统之设计部分 第11课 原型设计_设备管理 第12课 原型设计_会议室管理+预约会议室 第13课 原型设计_会议管理+系统管理 第14课 数据库设计 第15课 框架搭建+html替换成jsp (二)会议管理系统之编码部分 第16课 用户登录 第17课 防止非法登录+个人信息显示 第18课 用信息添加+上传头像 第19课 用户信息管理(查询) 第20课 用户信息管理(修改) 第21课 删除用户+查看用户+权限变更 第22课 设备添加 第23课 设备管理(查询+修改) 第24课 设备管理(删除)+设备信息(多表联查) 第25课 查询设备信息(根据会议室条件查询) 第26课 添加会议室 第27课 会议管理(查询+修改) 第28课 会议室管理(修改+删除) 第29课 会议室查询(查看)+ajax验证会议室编号 第30课 会议室预约(1) 第31课 会议室预约(2) 第32课 会议室预约修改(查询) 第33课 会议室预约修改(1) 第34课 会议室预约修改(2) 第35课 会议室预约审核 第36课 预约审核(2)+预约查询(1) 第37课 预约查询(2) 第38课 预约查询(3)+权限设置 第39课 工作台
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值