Servlet編程專題10之Servlet3.0註解
- Servlet3.0規範是JavaEE6.0規範中的子規範。其要求運行環境最低是JDK6.0,Tomcat7.0。而之前學習的是Servlet2.5版本的規範,其是JavaEE5.0規範的子規範。其要求運行環境最低是JDK5.0,Tomcat5.0。
- 在Eclipse中使用Serlvet3.0規範,則需要在創建動態Web工程時就要指定。其具體用法是,在Eclipse中創建動態Web工程時,指定創建的“動態Web模塊版本”為3.0版本。此時創建的Web工程中默認是沒有web.xml文件的。
1、Servlet3.0的註解:
- Servlet3.0中允許在定義Servlet、Filter與Listener三大組件時使用註解,而不用在web.xml進行註冊。Servlet3.0規範允許Web項目沒有web.xml配置文件。
a、Servlet3.0規範中使用@WebServlet()註解來註冊自定義的Servlet類。該註解具有多個屬性,常用屬性的類型與意義如下表所示:(需要註意的是,能夠省略的只有value屬性,其他屬性一概不能夠省略)
- 示例代碼:
- 使用@WebServlet()註解自定義Servlet類:
package com.geeklicreed.servlet; import java.io.IOException; import java.io.PrintWriter; import java.util.Enumeration; import javax.servlet.ServletException; import javax.servlet.annotation.WebInitParam; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; //@WebServlet("/someServlet") 此處完整寫法為:@WebServlet(value="/someServlet") /* @WebServlet(value={"/some","/xxx", "/yyy"}) 這種寫法可以使用http://localhost:8080/annotation-servlet/xxx、 http://localhost:8080/annotation-servlet/yyy和 http://localhost:8080/annotation-servlet/yyy三種方式訪問這個Servlet */ @WebServlet(value="/some", //設置屬性urlPattern與屬性value功能相同 name="some-servlet", //設置ServletName initParams={@WebInitParam(name="username", value="geeklicreed"), //設置初始化參數 @WebInitParam(name="password", value="888888")}, loadOnStartup=2 //默認是-1,如果設置為大於0,則在應用啟動時創建Servlet實例(參看之前專題) ) public class SomeServlet extends HttpServlet { private static final long serialVersionUID = 1L; protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //獲取ServletName String servletName = this.getServletName(); //獲取初始化參數 Enumeration<String> names = this.getInitParameterNames(); response.setContentType("text/html;charset=UTF-8"); PrintWriter out = response.getWriter(); out.append("Servlet at Servlet3.0 <br/>"); out.append("servletName = " + servletName + "<br/>"); while(names.hasMoreElements()){ String name = names.nextElement(); String value = this.getInitParameter(name); out.print(name + " = " + value + "<br/>"); } } }
- 啟動web應用,訪問該servlet,在瀏覽器中的顯示結果如下:
- 需要註意的是,如果註解編寫錯誤(如value="some"),則會無法啟動tomcat服務器。
b、Servlet3.0規範中使用@WebFilter()註解來註冊自定義的Filter類。該註解具有多個屬性,常用屬性的類型與意義如下表所示:
- 示例代碼:
- 使用@WebFilter()註解自定義Filter類:
package com.geeklicreed.fillter; import java.io.IOException; import javax.servlet.DispatcherType; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.annotation.WebFilter; @WebFilter(value = "/*", dispatcherTypes = DispatcherType.REQUEST) public class SomeFilter implements Filter { public SomeFilter() { } public void destroy() { } public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { //System.out.println("執行Servlet前的請求過濾代碼"); chain.doFilter(request, response); //System.out.println("執行Servlet後的響應過濾代碼"); } public void init(FilterConfig fConfig) throws ServletException { } }
- 啟動web應用,可以發現已經在控制臺中打印如下內容:
c、Servlet3.0規範中使用@WebListener註解來註冊自定義的Listener類。(該註解沒有任何屬性,在自定義Listener類中使用@WebListener註解即可)
- 示例代碼:
- 使用@WebListener註解自定義Listener類:
package com.geeklicreed.listener; import javax.servlet.ServletContextEvent; import javax.servlet.ServletContextListener; import javax.servlet.annotation.WebListener; @WebListener public class MyServletContextListener implements ServletContextListener { public MyServletContextListener() { } public void contextDestroyed(ServletContextEvent sce) { } public void contextInitialized(ServletContextEvent sce) { System.out.println("應用啟動"); } }
- 當應用啟動時,可以看到控制臺打印如下信息,說明該Listener已經起作用:
d、采用Servlet2.5規範的web.xml配置和Servlet3.0的註解兩種方式同時存在的情況,需要註意的問題:
- 註冊Servlet:若兩種方式的url-pattern值相同,則應用無法啟動;若兩種方式的url-pattern值不同,那麽相當於該Servlet具有兩個url-pattern。
- 註冊Filter:若對於Filter采用這兩種方式同時進行註冊,無論url-pattern的值是否相同,其都是作為兩個獨立的Filter出現的。
- 註冊Listener:若對於Listener采用這兩種方式同時進行註冊,其僅僅相當於一個Listener。
- <web-app/>中的屬性metadata-complete的值若為true,則表示對三大組件的註冊方式,只有web.xml的註冊起作用,將忽略註解的註冊;若為false,則表示兩種註冊方式同時起作用。(默認)
本文出自 “12392717” 博客,請務必保留此出處http://12402717.blog.51cto.com/12392717/1977779
Servlet編程專題10之Servlet3.0註解