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