JavaWeb开发与代码的编写(二十三)

JavaWeb开发与代码的编写(二十三)

Servet3新特性

Servlet3.0介绍

  Servlet3.0是Java EE6规范的一部分,Servlet3.0提供了注解(annotation),使得不再需要在web.xml文件中进行Servlet的部署描述,简化开发流程。

开发Servlet3.0程序的所需要的环境

  开发Servlet3.0的程序需要一定的环境支持。MyEclipse10和Tomcat7都提供了对Java EE6规范的支持。Tomcat需要Tomcat7才支持Java EE6,Tomcat7需要使用JDK1.6以上的版本。

  所以开发Servlet3.0的程序需要以下的开发环境支持

  • IDE:MyEclipse 10+
  • JDK:JDK 1.6+
  • tomcat:tomcat 7+

  如果使用的 MyEclipse的版本较低,例如MyEclipse8.5,没有提供Java EE6的支持,可以到Oracle官方网站下载JavaEE6的SDK进行安装,或者从Tomcat7的解压目录下的lib文件夹中的【annotations-api.jar、el-api.jar、jasper.jar、jasper-el.jar、jsp-api.jar、servlet-api.jar】这几个jar文件引用到我们的项目路径下。(例如:先建一个Java EE5的web项目,然后把Tomcat7的解压目录下的lib文件夹中的【annotations-api.jar、el-api.jar、jasper.jar、jasper-el.jar、jsp-api.jar、servlet-api.jar】这几个jar文件引入到项目中,再删除Java EE5的库引用,最后从Tomcat7的解压目录下的conf文件夹下把web.xml模板拷贝到项目,替换掉原来的web.xml)。

使用MyEclipse8.5+Tomcat7+JDK1.7开发Servlet3.0程序

创建WebProject

  1、使用MyEclipse8.5新建一个Web Project,选择最高版本的Java EE5.0,如下图所示:

  

  创建好的项目如下所示:

  

  项目的web.xml文件内容如下:

 <?xml version="1.0" encoding="UTF-8"?>
 <web-app version="2.5" 
     xmlns="http://java.sun.com/xml/ns/javaee" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
     http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
 <welcome-file-list>
     <welcome-file>index.jsp</welcome-file>
   </welcome-file-list>
 </web-app>

  注意web.xml文件中的version信息,version="2.5"和http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd。这里就表示当前使用的是Servlet2.5的版本。

 

将Web项目的开发环境改造成支持Servlet3.0

  1、打开Tomcat7的解压目录下的lib文件夹中,如下图所示:

  

   找到我们需要的【annotations-api.jar、el-api.jar、jasper.jar、jasper-el.jar、jsp-api.jar、servlet-api.jar】这几个jar文件,然后加入到我们的Web项目的lib文件夹下,如下图所示:

  

  2、删除Java EE5的库引用

  

  经过上面的两步操作,Web应用里面的jar包引用工作就算是完成了,如下图所示:

  

  3、修改项目中的web.xml文件的声明部分

  找到Tomcat7的解压目录下的conf文件夹下的web.xml,如下图所示:

  

  使用文本编辑器打开web.xml文件,如下图所示:

  

  改造好的Web.xml文件如下所示:

 <?xml version="1.0" encoding="UTF-8"?>
 <web-app xmlns="http://java.sun.com/xml/ns/javaee"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
                       http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
   version="3.0">
   <welcome-file-list>
     <welcome-file>index.jsp</welcome-file>
   </welcome-file-list>
 </web-app>

  注意web.xml文件中的version信息,version="3.0"和http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd 这就是表示当前使用的是Servlet3.0的版本。经过这样改造之后,我们的Web应用的开发环境就支持Servlet3.0的程序开发了。

 

开发Servlet3.0程序

创建Servlet

  新建一个Servlet,写上Servlet的Name,然后Next,如下所示:

  

  取消【Generate/Map web.xml file】复选框的选中状态,直接点击【Finish】按钮完成Servlet的创建工作,我们要使用Servlet3.0提供的注解来配置Servlet,因此不需要MyEclipse帮我们在web.xml文件中生成Servlet的配置信息,如下图所示:

  

  这样建好一个Servlet后,在web.xml文件中没有任何关于这个Servlet的描述信息,如下图所示:

  

使用注解描述Servlet

  前面介绍过,Servlet3.0提供了注解(annotation),使得不再需要在web.xml文件中进行Servlet的部署描述,下面我们就来使用一下Servlet3.0提供的注解来描述Servlet3Demo这个Servlet,代码如下:

  package me.gacl.web.controller;
  
  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用来描述一个Servlet
  * 属性name描述Servlet的名字,可选
  * 属性urlPatterns定义访问的URL,或者使用属性value定义访问的URL.(定义访问的URL是必选属性)
  */
 @WebServlet(name="Servlet3Demo",urlPatterns="/Servlet3Demo")
 public class Servlet3Demo extends HttpServlet {
     
     public void doGet(HttpServletRequest request, HttpServletResponse response)
             throws ServletException, IOException {
         response.getWriter().write("Hello Servlet3.0");
     }
 
     public void doPost(HttpServletRequest request, HttpServletResponse response)
             throws ServletException, IOException {
         this.doGet(request, response);
     }
 }
 
 /*
  * 完成了一个使用注解描述的Servlet程序开发。
   使用@WebServlet将一个继承于javax.servlet.http.HttpServlet的类定义为Servlet组件。
   @WebServlet有很多的属性:
       1、asyncSupported:    声明Servlet是否支持异步操作模式。
       2、description:      Servlet的描述。
       3、displayName:       Servlet的显示名称。
       4、initParams:        Servlet的init参数。
       5、name:           Servlet的名称。
       6、urlPatterns:     Servlet的访问URL。
       7、value:           Servlet的访问URL。
   Servlet的访问URL是Servlet的必选属性,可以选择使用urlPatterns或者value定义。
   像上面的Servlet3Demo可以描述成@WebServlet(name="Servlet3Demo",value="/Servlet3Demo")。
   也定义多个URL访问:
   如@WebServlet(name="Servlet3Demo",urlPatterns={"/Servlet3Demo","/Servlet3Demo2"})
   或者@WebServlet(name="AnnotationServlet",value={"/Servlet3Demo","/Servlet3Demo2"})
  *
  */

  在Servlet3.0中,可以使用@WebServlet注解将一个继承于javax.servlet.http.HttpServlet的类标注为可以处理用户请求的Servlet。

@WebServlet注解的相关属性
NO.属性名描述
1asyncSupported声明Servlet是否支持异步操作模式
2descriptionServlet的描述信息
3displayNameServlet的显示名称
3initParamsServlet的初始化参数
5nameServlet的名称
6urlPatternsServlet的访问URL
7valueServlet的访问URL

  Servlet的访问URL是Servlet的必选属性,可以选择使用urlPatterns或者value定义。
  像上面的Servlet3Demo可以描述成@WebServlet(name="Servlet3Demo",value="/Servlet3Demo")。
  也定义多个URL访问:
  如@WebServlet(name="Servlet3Demo",urlPatterns={"/Servlet3Demo","/Servlet3Demo2"})
  或者@WebServlet(name="AnnotationServlet",value={"/Servlet3Demo","/Servlet3Demo2"})

 

部署Web应用到Tomcat7

  由于我们使用的是MyEclipse8.5的版本、而MyEclipse8.5只支持tomcat6.x的版本,因为我们开发的是基于Servlet3.0的程序,因此将Web应用部署到Tomcat6.x版本的服务器是无法正常运行的,必须要使用tomcat7以上的服务器,所以首先我们要在MyEclipse8.5中配置tomcat7.x,如下图所示:

  

  要想在MyEclipse8.5中正常使用Tomcat7.x,除了配置这个地方之外,还需要配置一下Paths,如下图所示:

  

  如果不这样做,那么将项目部署好后,启动tomcat时就会报错,java.lang.NoClassDefFoundError: org/apache/juli/logging/LogFactory,之前就是因为这个莫名其妙的错误折腾了好久,直到看到网上这一篇文章http://xuejiangtao.iteye.com/blog/882585才解决启动报错的问题的。

   把项目发布到Tomcat7,启动Tomcat7。在浏览器访问:http://localhost:8080/Servlet3.0Study/Servlet3Demo

  可以看到,我们已经成功访问到了Servlet3Demo,我们在MyEclipse8.5中开发的第一个Servlet3.0程序成功了。

 

使用注解标注过滤器(Filter)

  Servlet3.0提供@WebFilter注解将一个实现了javax.servlet.Filter接口的类定义为过滤器,这样我们在web应用中使用过滤器时,也不再需要在web.xml文件中配置过滤器的相关描述信息了。

  下面我们来创建一个过滤器,体验一下使用@WebFilter注解标注过滤器,如下所示:

  

  过滤器的代码如下:

 package me.gacl.web.filter;
 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将一个实现了javax.servlet.Filte接口的类定义为过滤器
  * 属性filterName声明过滤器的名称,可选
  * 属性urlPatterns指定要过滤 的URL模式,也可使用属性value来声明.(指定要过滤的URL模式是必选属性)
  */
 @WebFilter(filterName="Servlet3Filter",urlPatterns="/*")
 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("过滤器初始化");
     }
 }

  过滤器中使用了@WebFilter(filterName="Servlet3Filter",urlPatterns="/*")进行配置,Filter的名字是Servlet3Filter,表示urlPatterns="/*"该Filter拦截所有的请求。

  web服务器启动时就会初始化该Filter,如下图所示:

  

  当有用户访问web应用中的资源时,该过滤器就会进行拦截,如下图所示:

  

  可以看到,使用@WebFilter注解,我们可以将一个实现了javax.servlet.Filte接口的类定义为过滤器,用urlPatterns属性或者value属性指定要过滤的URL模式。

  可以指定多种过滤模式@WebFilter(filterName="Servlet3Filter",urlPatterns={"/UserManagerServlet","/index.jsp"})

  有了@WebFilter注解之后,我们的web.xml就无需任何配置了。

  <?xml version="1.0" encoding="UTF-8"?>
  <web-app version="3.0" 
      xmlns="http://java.sun.com/xml/ns/javaee" 
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
      xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
     http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
   <display-name></display-name>    
   <welcome-file-list>
     <welcome-file>index.jsp</welcome-file>
   </welcome-file-list>
 </web-app>

  这样我们的web.xml文件就非常干净了。可以说,Servlet3.0规范的出现,大大减少了开发Servlet和Filter配置方面的工作量。

 

基于Servlet3.0的文件上传

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

使用Servlet3.0提供的API实现文件上传

编写上传页面

 <%@ 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>

开发处理文件上传的Servlet

  1、使用注解@MultipartConfig将一个Servlet标识为支持文件上传。

  2、Servlet3.0将multipart/form-data的POST请求封装成Part,通过Part对上传的文件进行操作。

  UploadServlet 代码如下: 

 package me.gacl.web.controller;
 
 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标识为支持文件上传
 @MultipartConfig//标识Servlet支持文件上传
 public 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没有提供直接获取文件名的方法,需要从请求头中解析出来
                //获取请求头,请求头的格式: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);
     }
 }

 

使用注解标注监听器(Listener)

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

  下面我们来创建一个监听器,体验一下使用@WebListener注解标注监听器,如下所示:

  

监听器的代码如下:

  package me.gacl.web.listener;
  
  import javax.servlet.ServletContextEvent;
  import javax.servlet.ServletContextListener;
  import javax.servlet.annotation.WebListener;
  
  /**
   * 使用@WebListener注解将实现了ServletContextListener接口的MyServletContextListener标注为监听器
   */
 @WebListener
 public 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());
     }
 }

  Web应用启动时就会初始化这个监听器,如下图所示:

  

  有了@WebListener注解之后,我们的web.xml就无需任何配置了

<?xml version="1.0" encoding="UTF-8"?>
 <web-app version="3.0" 
     xmlns="http://java.sun.com/xml/ns/javaee" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
     http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
   <display-name></display-name>    
   <welcome-file-list>
     <welcome-file>index.jsp</welcome-file>
   </welcome-file-list>
 </web-app>

  Servlet3.0规范的出现,让我们开发Servlet、Filter和Listener的程序在web.xml实现零配置。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wespten

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值