Servlet3.0新特性剖析
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 {
@Override
protected 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; } } } </pre>在上面的例子中,一個Servlet只對應了一個urlPattern。實際上一個Servlet可以對應多個urlPattern,我們可以這樣定義:<pre class="brush:java; toolbar: true; auto-links: false;"> @WebServlet(name = "GetQuoteServlet", urlPatterns = {"/getquote","/stockquote"} ) public class GetQuoteServlet extends HttpServlet { @Override protected 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) { } } </pre>@WebInitParam<br />
可以使用@WebInitParam注解來制定Servlet或filter的初始參數。當然我們也可以使用@WebServlet或@WebFileter的initParam屬性來指定初始參數。下面是使用@WebInitParam的例子:
@WebServlet(name = "GetQuoteServlet", urlPatterns ={"/getquote"}) @WebInitParam(name = "default_market", value = "NASDAQ") public class GetQuoteServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html;charset=UTF-8"); PrintWriter out = response.getWriter(); try { String market = getInitParameter("default_market"); String symbol = request.getParameter("symbol"); out.println("<h1>Stock Price in " +market + " is</h1>" +StockQuoteBean.getPrice(symbol, market)); } finally { out.close(); } } }下面是使用initParam屬性的例子:@WebServlet(name = "GetQuoteServlet", urlPatterns = {"/getquote"}, initParams={@WebInitParam(name="default_market",value="NASDAQ")} ) public class GetQuoteServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html;charset=UTF-8"); PrintWriter out = response.getWriter(); try { String market = getInitParameter("default_market"); String symbol = request.getParameter("symbol"); out.println("<h1>Stock Price in " +market + " is</h1>" +StockQuoteBean.getPrice(symbol, market)); } finally { out.close(); } } }@WebListener
@WebListener注解被應用在作為listener監聽web應用程序事件的類上,所以@WebListener能夠被應用在實現了ServletContextListener,ServletContextAttributeListener,ServletRequestListener,ServletRequestAttributeL istener,HttpSessionListener和HttpSessionAttributeList ener接口的類上。在下面的例子中,該類實現了ServletContextListener接口。
@WebListener public class QuoteServletContextListener implementsServletContextListener { public void contextInitialized(ServletContextEvent sce) { ServletContext context = sce.getServletContext(); context.setInitParameter(“default_market”, “NASDAQ”); } public void contextDestroyed(ServletContextEvent sce) { } }<strong>@MultipartConfig
使用@MultipartConfig注解來指定Servlet要求的multipartMIME類型。這種類型的MIME附件將從request對象中讀取。
The Metadata and Common Annotations元數據與通用的注解
除了以上的Servlet特定的注解之外,Servlet3.0還支持JSR175(Java元數據規范)和JSR250(Java平臺通用注解)所規定的注解,包括:
- 安全相關的注解,如 @DeclareRoles 和 @RolesAllowed
- 使用EJB的注解,如 @EJB 和 @EJBs
- 資源注入相關的注解,如 @Resource 和 @Resources
- 使用JPA的注解,如 @PersistenceContext, @PersistenceContexts,@PersistenceUnit, 和 @PersistenceUnits
- 生命周期的注解,如 @PostConstruct和 @PreDestroy
- 提供WebService引用的注解,如 @WebServiceRef and @WebServiceRefs
注解和web.xml哪個會生效
注解的引入使得web.xml變成可選的了。但是,我們還是可以使用web.xml。容器會根據web.xml中的metadata-complete元素的值來決定使用web.xml還是使用注解。如果該元素的值是true,那么容器不處理注解,web.xml是所有信息的來源。如果該元素不存在或者其值不為true,容器才會處理注解。</strong></div>本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!