Servlet3.0規範的新特性主要是為了3個目的:
1.簡化開發
2.便於布署
3.支援Web2.0原則
為了簡化開發流程,Servlet3.0引入了註解(annotation),這使得web布署描述符web.xml不在是必須的選擇。
Pluggability可插入性
當使用任何第三方的架構,如Struts,JSF或Spring,我們都需要在web.xml中添加對應的Servlet的入口。這使得web描述符笨重而難以維護。Servlet3.0的新的可插入特性使得web應用程式模組化而易於維護。通過webfragment實現的可插入性減輕了開發人員的負擔,不需要再在web.xml中配置很多的Servlet入口。
Asynchronous Processing 非同步處理
另外一個顯著的改變就是Servlet3.0支援非同步處理,這對AJAX應用程式非常有用。當一個Servlet建立一個線程來建立某些請求的時候,如查詢資料庫或訊息串連,這個線程要等待直到獲得所需要的資源才能夠執行其他的操作。非同步處理通過運行線程執行其他的操作來避免了這種阻塞。
Apart from the features mentioned here, several other enhancementshave been made to the existing API. The sections towards the end ofthe article will explore these features one by one in detail.
除了這些新特性之外, Servlet3.0對已有的API也做了一些改進,在本文的最後我們會做介紹。
Annotations in Servlet Servlet中使用註解
Servlet3.0的一個主要的改變就是支援註解。使用註解來定義Servlet和filter使得我們不用在web.xml中定義相應的入口。
@WebServlet
@WebServlet用來定義web應用程式中的一個Servlet。這個註解可以應用於繼承了HttpServlet。這個註解有多個屬性,例如name,urlPattern,initParams,我們可以使用者的屬性來定義Servlet的行為。urlPattern屬性是必須指定的。
例如我們可以象下面的例子這樣定義:
@WebServlet(name = "GetQuoteServlet", urlPatterns = {"/getquote"})public class GetQuoteServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request,HttpServletResponse response)throws ServletException, IOException {PrintWriter out = response.getWriter();try {String symbol = request.getParameter("symbol");out.println("<h1>Stock Priceis</h1>" +StockQuoteBean.getPrice(symbol);} finally {out.close();}}}public class StockQuoteBean {private StockQuoteServiceEntity serviceEntity = newStockQuoteServiceEntity();public double getPrice(String symbol) {if(symbol !=null ) {return serviceEntity.getPrice(symbol);} else {return 0.0;}}}
在上面的例子中,一個Servlet只對應了一個urlPattern。實際上一個Servlet可以對應多個urlPattern,我們可以這樣定義:
@WebServlet(name = "GetQuoteServlet", urlPatterns = {"/getquote","/stockquote"} )public class GetQuoteServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request,HttpServletResponse response)throws ServletException, IOException {PrintWriter out = response.getWriter();try {String symbol = request.getParameter("symbol");out.println("<h1>Stock Priceis</h1>" +StockQuoteBean.getPrice(symbol);} finally {out.close();}}}@WebFilter我們可以使用@WebFilter註解來定義filter。這個註解可以被應用在實現了javax.servlet.Filter介面的類上。同樣的,urlPattern屬性是必須指定的。下面就是一個例子。@WebFilter(filterName = "AuthenticateFilter", urlPatterns ={"/stock.jsp", "/getquote"})public class AuthenticateFilter implements Filter {public void doFilter(ServletRequest request, ServletResponseresponse,FilterChain chain) throws IOException, ServletException {String username = ((HttpServletRequest)request).getParameter("uname");String password = ((HttpServletRequest)request).getParameter("password");if (username == null || password == null) {((HttpServletResponse) response).sendRedirect("index.jsp"); }if (username.equals("admin") && password.equals("admin")){chain.doFilter(request, response); }else {((HttpServletResponse) response).sendRedirect("index.jsp"); }}public void destroy() {}public void init(FilterConfig filterConfig) {}}