小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

Servlet 3.0 新特性詳解

 simplelam 2014-09-19


Servlet 3.0 新特性概覽

 

1.Servlet、Filter、Listener無需在web.xml中進行配置,可以通過Annotation進行配置;

2.模塊化編程,即將各個Servlet模塊化,將配置文件也分開配置。

3.Servlet異步處理,應對復雜業(yè)務處理;

4.異步Listener,對于異步處理的創(chuàng)建、完成等進行監(jiān)聽;

5. 文件上傳API簡化;

 

tomcat 7.0.X 支持Servlet 3.0

 

一、Annotation支持

 

1.Servlet

 

原本Servlet開發(fā)完后,必須在web.xml中配置如下代碼:

 

  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>  

現(xiàn)在只需要在java源文件的Servlet類前面加上:

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

public class FirstServlet extends HttpServlet{}

 

代碼示例:

實現(xiàn)一個最簡單的Servlet。

 

  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的配置如下:

 

  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.    

現(xiàn)在只需要在java源文件的Filter類前面加上

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

 

3.Listener

 

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

 

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

現(xiàn)在只需要在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

 

  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內(nèi)容:

 

  1. <?xml version="1.0" encoding="ISO-8859-1"?>  
  2. <web-fragment xmlns="http://java./xml/ns/javaee"  
  3.   xmlns:xsi="http://www./2001/XMLSchema-instance"  
  4.   xsi:schemaLocation="http://java./xml/ns/javaee  
  5.                       <A href="http://java./xml/ns/javaee/web-app_3_0.xsd"">http://java./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 

  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");  
  1.        }  
  2.        public void requestDestroyed(ServletRequestEvent event){  
  3.              System.out.println("SecondListener destroyed");  
  4.        }  
  5. }  

SecondListener的 web-fragment.xml內(nèi)容是:

 

  1. <?xml version="1.0" encoding="ISO-8859-1"?>  
  2. <web-fragment xmlns="http://java./xml/ns/javaee"  
  3.   xmlns:xsi="http://www./2001/XMLSchema-instance"  
  4.   xsi:schemaLocation="http://java./xml/ns/javaee  
  5.                       <A href="http://java./xml/ns/javaee/web-app_3_0.xsd"">http://java./xml/ns/javaee/web-app_3_0.xsd"  
  6.  version="3.0">    
  7.        <name>SecondListener</name>  
  8.        <listener>  
  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應用,然后發(fā)現(xiàn) tomcat控制臺輸出:

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

 

三、Servlet 異步處理

 

Servlet在MVC中作為控制器,控制器負責分發(fā)任務給MODEL完成,然后把結(jié)果交給JSP顯示;

而如果有許多MODEL,其中有一個MODEL處理時間很長,則會導致整個頁面的顯示很慢;

異步處理關鍵點:將復雜業(yè)務處理另外開一個線程,而Servlet將執(zhí)行好的業(yè)務先送往jsp輸出,等到耗時業(yè)務做完后再送往JSP頁面;

一句話:先顯示一部分,再顯示一部分;

異步處理Servlet的注意點是:

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

 

  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("====頁面結(jié)束====<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

  1. <%@ page contentType="text/html;charset=GBK" pageEncoding="GBK" session="false"%>  
  2. <html>  
  3.        <body>  
  4.        <%  
  5.               out.println("======復雜業(yè)務方法====");  
  6.        %>  
  7.       </body>  
  8. </html>  


四、異步監(jiān)聽器

 

異步監(jiān)聽器用來監(jiān)聽異步處理事件;即“三”中講到的知識點;

此監(jiān)聽器類似于ServletContextListener的機制;

只需要實現(xiàn)AsyncListener接口即可;

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

public void onComplete(AsyncEvent event);

public void onTimeout(AsyncEvent event);

public void onError(AsyncEvent event);

 

以下是監(jiān)聽器實現(xiàn)的代碼:

 

  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());就可以添加監(jiān)聽器,每當異步處理完成時就會觸發(fā)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

 

  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

 

  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("文本框內(nèi)容:"+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中很難獲取上傳文件的類型,因此我寫了兩個工具類,可以方便開發(fā);

 

  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.    

 

    本站是提供個人知識管理的網(wǎng)絡存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多