1. 程式人生 > >Servlet編程專題10之Servlet3.0註解

Servlet編程專題10之Servlet3.0註解

servlet 特性 webservlet

- 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註解