Servlet3.0新特性全解
tomcat 7以上的版本都支持Servlet 3.0
Servlet 3.0 新增特性
Servlet3.0的注解
示例代碼片:
修飾過濾器Filter:
修飾servlet:
@WebServlet(name="test",urlPatterns={"/basic.do"},initParams={@WebInitParam(name="userName",value="peter"),@WebInitParam(name="age",value="100")}) public class TestServlet extends HttpServlet{//內容省略.... }修飾監聽器Listener:
@WebListener public class MyRequestListener implements ServletRequestListener{//內容省略... }Servlet3.0的Web模塊支持
制作一個Servlet模塊的步驟:
web-fragment.xml說明:
如何用myEclipse打jar包(有些人不知道)
右鍵你web項目里的編寫的servlet(或filter或listener)類——>Export…——>JAR file——>NEXT——>(Browse)填寫導出名字和存放位置——>finish
這樣就生成了我們需要的jar包了
servlet類代碼片:
web-fragment.xml代碼片
<web-fragment 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-fragment_3_0.xsd"> <!-- 指定模塊名稱 :唯一標識--> <name>mySerModule</name> <!-- 加載順序 --> <ordering> <!-- 在其它模塊之前加載 --> <before> <others/> </before> </ordering> </web-fragment>在web-fragment.xml里的配置和之前的web.xml里類似,如果是注解實現的servlet的配置,則在web-fragment.xml里就將不再寫配置了,如果不是,則還需要寫配置。
打成jar包放在一個項目里面啟動后,就可通過上面servlet注解配置的/basic.do路徑訪問上面的servle了。
servlet3.0提供的異步處理
* 提供異步原因*
在以前的servlet中,如果作為控制器的servlet調用了一個較為耗時的業務方法,則servlet必須等到業務執行完后才會生成響應,這使得這次調用成了阻塞式調用,效率比較差
實現異步原理
重新開一個線程單獨去調用耗時的業務方法。
配置servlet類成為異步的servlet類
具體實現
java代碼:
@WebServlet(name="AsyncServlet",urlPatterns={"/testAsyn.do"},asyncSupported=true) public class AsyncServlet extends HttpServlet{ public void service(HttpServletRequest request,HttpServletResponse response)throws ServletException,IOException{ //解決亂碼request.setCharacterEncoding("GBK"); response.setContentType("text/html;charset=GBK"); //通過request獲得AsyncContent對象AsyncContext actx = request.startAsync(); //重點方法**//設置異步調用超時時長actx.setTimeout(30*3000); //啟動異步調用的線程actx.start(new MyThread(actx));//重點方法**// 直接輸出到頁面的內容(不等異步完成就直接給頁面)//但這些內容必須放在標簽內,否則會在頁面輸出錯誤內容,這兒反正我測試是這樣,具體不知對不對??PrintWriter out = response.getWriter();out.println("<h1>不等異步返回結果就直接返到頁面的內容</h1>"); out.flush(); } } //異步處理業務的線程類 public class MyThread implements Runnable {private AsyncContext actx; //構造public MyThread(AsyncContext actx){ this.actx = actx; } public void run(){ try{ //等待5秒,模擬處理耗時的業務Thread.sleep(4*1000); //獲得request對象,添加數據給頁面ServletRequest req = actx.getRequest();req.setAttribute("content","異步獲得的數據");//將請求dispath到index.jsp頁面,該頁面的session必須設為falseactx.dispatch("/index.jsp"); }catch(Exception e){e.printStackTrace();} } }頁面代碼(頁頭里session設為false,表時該頁面不會再創建session):
<%@ page language="java" import="java.util.*" pageEncoding="utf-8" session="false"%> <% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; %> <html> <body><a href="<%=basePath%>/testAsyn.do">測試異步調用</a>異步結果:${content}</body> </html>異步監聽器
異步監聽器用來監聽異步Servlet的異步處理事件,通過實現AsyncListener接口實現,代碼如下:
public class MyAsyncListener implements AsyncListener{//異步調用完成時觸發@Overridepublic void onComplete(AsyncEvent event) throws IOException {// 省略.... }//異步調用出錯時觸發@Overridepublic void onError(AsyncEvent event) throws IOException {// 省略.... }//異步調用開始觸發@Overridepublic void onStartAsync(AsyncEvent event) throws IOException {// 省略.... }//異步調用超時觸發@Overridepublic void onTimeout(AsyncEvent event) throws IOException {// 省略.... }}還需要在異步Servlet里注冊異步監聽器,即添加如下代碼即可:
actx.addListener(new MyAsyncListener());Filter異步調用與Servlet一樣。
改進的ServletAPI(上傳文件)
ServletContext提供了如下方法動態注冊Servlet、Filter
addServlet(); 動態注冊Servlet
addFilter(); 動態注冊Filter
addListener(); 動態注冊Listener
setInitParameter(String name ,String value); 為Web應用設置初始化參數。
總結
以上是生活随笔為你收集整理的Servlet3.0新特性全解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java如何使用Listener
- 下一篇: 给solr配置中文分词器