Servlet3.0 註解特性

雖然很久沒有單獨的使用Servlet技術了,但是本着溫故而知新的態度,整理記錄一下筆記。

注:tomcat7以上才支持Servlet3.0

註解支持Servlet、Filter、Listener無需在web.xml中進行配置

@WebServlet註解

作用:聲明Servlet組件(無需配置web.xml)。

主要屬性:

屬性 類型 描述
name String 指定Servlet的name屬性。等價於<servlet-name>標籤。如果沒有顯示指定,默認當前類的全限定名
value String[] 等價於urlPatterns屬性。兩個屬性不能同時使用
urlPatterns String[] 指定一組URL匹配模式,等價於<url-pattern>標籤。
loadOnStartup int 指定Servlet加載順序,等價於<load-on-startup>標籤。
initParams WebInitParam[] 指定一組初始化參數。等價於<init-param>標籤。
asyncSupported boolean 聲明Servlet是否支持異步操作,等價於<async-supported>標籤。
decription String 該Servlet的描述信息,等價於<description>標籤。
displayName String 該Servlet顯示名,通常配合工具使用,等價於<display-name>標籤。

簡單的示例:

/**
 * name-Servlet的名稱
 * urlPatterns-URL的匹配模式
 * description-Servlet的描述
 * asyncSupported-是否支持異步
 * */
@WebServlet(name="myServlet", urlPatterns="/servletTest", description="示例", asyncSupported=false)
public class MyServlet extends HttpServlet  {

	private static final long serialVersionUID = 1L;

	/**
	 * <p>映射get請求
	 * */
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		System.out.println("haha");
		super.doGet(req, resp);
	}

	/**
	 * <p>映射post請求
	 * */
	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		System.out.println("hehe");
		super.doPost(req, resp);
	}

	/**
	 * <p>銷燬方法
	 * */
	@Override
	public void destroy() {
		// TODO Auto-generated method stub
		super.destroy();
	}

	/**
	 * <p>初始化方法
	 * */
	@Override
	public void init() throws ServletException {
		// TODO Auto-generated method stub
		super.init();
	}
}

@WebFilter註解

作用:聲明過濾器(Filter)組件(無需配置web.xml)。

基本屬性:

屬性 類型 描述
filterName String 指定過濾器的name屬性,等價於<filter-param>屬性
value String[] 等價於urlPatterns屬性,但是不能同時使用
urlPatterns String[] 指定一組URL匹配模式,等價於<url-pattern>
servletNames String[] 指定過濾器將作用於哪些Servlet,是@WebServlet中name屬性的值,或者是web.xml中<servlet-name>的值
initParams WebInitParam[] 指定一組初始化參數。等價於<init-param>標籤。
asyncSupported boolean 聲明Filter是否支持異步操作,等價於<async-supported>標籤。
decription String 該Filter的描述信息,等價於<description>標籤。
displayName String 該過濾器顯示名,通常配合工具使用,等價於<display-name>標籤。
dispatcherTypes DispatcherType 指定過濾器的轉發模式。具體取值:ASYNC、ERROR、FORWARD、INCLUDE和REQUEST

簡單的示例:

/**
 * filterName-過濾器名稱
 * urlPatterns-uri匹配規則
 * */
@WebFilter(filterName="myFilter", urlPatterns="/*")
public class MyFilter implements Filter {

	/**
	 * <p>初始化方法
	 * */
	@Override
	public void init(FilterConfig filterConfig) throws ServletException {
		// TODO Auto-generated method stub
	}

	/**
	 * <p>具體過濾邏輯
	 * */
	@Override
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
			throws IOException, ServletException {
		// TODO Auto-generated method stub
	}

	/**
	 * <p>銷燬方法
	 * */
	@Override
	public void destroy() {
		// TODO Auto-generated method stub
	}
}

@WebListener註解

作用:聲明監聽器組件(無需配置web.xml)。

基本屬性:

只有一個可選的默認屬性-value。用於描述當前Listener。

簡單的示例:

/**
 * <p>聲明監聽器,實現監聽HTTP會話的創建和銷燬(HttpSessionListener)
 * value-可選的默認屬性,用於描述當前監聽器
 * */
@WebListener(value="描述信息")
public class MyListener implements HttpSessionListener {

	/**
	 * <p>通知正在收聽的對象,session已經被加載及初始化
	 * */
	@Override
	public void sessionCreated(HttpSessionEvent se) {
		// TODO Auto-generated method stub
	}

	/**
	 * <p>通知正在收聽的對象,session已經被載出銷燬
	 * */
	@Override
	public void sessionDestroyed(HttpSessionEvent se) {
		// TODO Auto-generated method stub
	}
}

@WebInitParam屬性

作用:該註解不單獨使用。配合@WebServlet或@WebFilter使用,爲它們指定初始化參數。等價於web.xml中<servlet>和<filter>的子標籤<init-param>。

基本屬性:

屬性 類型 是否可選 描述
name String 指定參數名。等價於web.xml中的<param-name>標籤
value String 指定參數的值。等價於web.xml中的<param-value>標籤
description String 關於參數的描述。等價於<description>標籤

簡單的示例:

/**
 * <p>指定一個初始化參數 username 值爲zhangsan
 * */
@WebServlet(name="myServlet", urlPatterns="/servletTest", 
	initParams= {@WebInitParam(name="username", value="zhangsan")})
public class MyServlet extends HttpServlet  {
    // .......省略
}

對文件上傳的支持

@MultipartConfig註解

作用:配合Servlet實現文件上傳。

要點:必須和Servlet一起使用;從request對象中獲取Part對象(裏面封裝了上傳的文件信息)。

基本屬性:

屬性 類型 是否可選 描述
fileSizeThreshold int 當數據量大於該值時,內容將被寫入文件
location String 存放上傳的文件地址
maxFileSize long 允許上傳的文件最大值。默認爲-1,表示沒有限制
maxRequestSize long 針對該multipart/form-data請求的最大數量,默認爲-1,表示沒有限制。

簡單的示例:

@MultipartConfig(location="D:/test")
@WebServlet(name="myServlet", urlPatterns="/servletTest")
public class MyServlet extends HttpServlet  {

	private static final long serialVersionUID = 1L;

	/**
	 * <p>映射post請求
	 * */
	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		//myFile爲文件參數名 Part操作上傳的文件
		Part part = req.getPart("myFile");
		//part.write("");  //將文件寫入目標地址
		// .... 省略
	}
}

異步處理

作用:解決阻塞式調用。

說明:在以前的servlet中,如果作爲控制器的servlet調用了一個較爲耗時的業務方法,則servlet必須等到業務執行完後纔會生成響應,這使得這次調用成了阻塞式調用,效率比較差。

在@WebServlet和@WebFilter中有asyncSupported屬性(異步機制僅可應用於Servlet和過濾器組件),就是開啓是否支持異步(默認爲false,即沒有開啓異步支持)。

簡單的示例(Filter異步調用方式和Servlet一樣):

@WebServlet(name="myServlet", urlPatterns="/servletTest")
public class MyServlet extends HttpServlet  {

	private static final long serialVersionUID = 1L;

	/**
	 * <p>映射post請求
	 * */
	@Override
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//通過request獲得AsyncContent對象 ***重點方法
		AsyncContext asyncContext = request.startAsync();
		 //設置異步調用超時時長
		asyncContext.setTimeout(30*3000);  
        //啓動異步調用的線程 ***重點方法
		asyncContext.start(new Thread() {
			@Override
			public void run() {
				//TODO 異步處理的業務線程類(當然是可以另起線程類或線程池的)
			}
		});
		
		//異步監聽器  可選  ****重點方法
		asyncContext.addListener(new AsyncListener() {
			
			//異步調用超時觸發
			@Override
			public void onTimeout(AsyncEvent event) throws IOException {
				// TODO Auto-generated method stub
			}
			
			//異步調用開始觸發
			@Override
			public void onStartAsync(AsyncEvent event) throws IOException {
				// TODO Auto-generated method stub
			}
			
			//異步調用出錯時觸發
			@Override
			public void onError(AsyncEvent event) throws IOException {
				// TODO Auto-generated method stub
			}
			
			//異步調用完成時觸發
			@Override
			public void onComplete(AsyncEvent event) throws IOException {
				// TODO Auto-generated method stub
			}
		});
		
		// ......省略其它操作  如response
	}

}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章