雖然很久沒有單獨的使用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
}
}