做用: 用於將一個類聲明爲 Servletjava
描述: 該註解將會在部署時被容器處理, 容器將根據具體的屬性配置將相應的類部署爲 Servlet.異步
屬性詳解: 該註解具備下表給出的一些經常使用屬性(如下全部屬性均爲可選屬性, 可是 vlaue
或者 urlPatterns
一般是必需的, 且兩者不能共存, 若是同時指定, 一般是忽略 value
的取值)async
屬性名 | 類型 | 屬性描述 |
---|---|---|
name | String | 指定servlet的name屬性,等價於<Servlet-name>.若是沒有顯示指定,則該servlet的取值即爲類的全限定名. |
value | String[] | 等價於urlPatterns,兩者不能共存. |
urlPatterns | String[] | 指定一組servlet的url的匹配模式,等價於 <url-pattern> 標籤. |
loadOnStartup | int | 指定servlet的加載順序,等價於 <load-on-startup> 標籤. |
initParams | WebInitParam[] | 指定一組初始化參數,等價於 <init-param> 標籤. |
asyncSupported | boolean | 申明servlet是否支持異步操做模式,等價於 <async-supported> 標籤. |
displayName | String | servlet的顯示名,等價於 <display-name> 標籤. |
description | String | servlet的描述信息,等價於 <description> 標籤. |
import java.io.IOException; import javax.servlet.ServletConfig; 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(displayName = "UserServlet", // 描述 name = "UserServlet", // servlet名稱 urlPatterns = { "/user" }, // url loadOnStartup = 1, // 啓動項 initParams = { @WebInitParam(name = "username", value = "張三") }) // 初始化參數 public class UserServlet extends HttpServlet { private String username; public UserServlet() { System.out.println("UserServlet..."); } @Override public void init(ServletConfig config) throws ServletException { // 獲取初始化信息:張三 username = config.getInitParameter("username"); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // 主要內容操做 } @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // 主要內容操做 System.out.println(username); } }
Filter(過濾器)主要對請求到達前進行處理,也能夠在請求結束後進行處理,相似於鏈式。ide
一個請求能夠被多個過濾器攔截到,會依次進入各個Filter中,放行後直至進入Servlet,Servlet處理請求結束後,回到各個Filter繼續執行後面的代碼,先執行的Filter後執行完。post
經常使用到的地方:this
@WebFilter
經常使用屬性編碼
屬性名 | 類型 | 屬性描述 |
---|---|---|
asyncSupported | boolean | 指定Filter是否支持異步模式 |
dispatcherTypes | DispatcherType[] | 指定Filter對哪一種方式的請求進行過濾. 支持的屬性:ASYNC、ERROR、FORWARD、INCLUDE、REQUEST; 默認過濾全部方式的請求 |
filterName | String | Filter名稱 |
initParams | WebInitParam[] | 配置參數 |
displayName | String | Filter顯示名 |
servletNames | String[] | 指定對哪些Servlet進行過濾 |
urlPatterns/value | String[] | 兩個屬性做用相同,指定攔截的路徑 |
用戶權限過濾示例:url
自定義過濾器,實現 javax.servlet.Filter
接口,經過註解方式配置。攔截全部的請求,放行登陸頁面、登陸操做請求,其他請求須要在登陸後纔可訪問。同時配置參數,指定要放行的路徑和請求的字符集。spa
import java.io.IOException; 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; import javax.servlet.annotation.WebInitParam; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @WebFilter(filterName = "loginFilter", urlPatterns = "/*", initParams = { @WebInitParam(name = "loginUI", value = "/home/loginUI"), @WebInitParam(name = "loginProcess", value = "home/login"), @WebInitParam(name = "encoding", value = "utf-8") }) public class LoginFilter implements Filter { private FilterConfig config; @Override public void init(FilterConfig config) throws ServletException { this.config = config; } @Override public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { // 獲取配置參數 String loginUI = config.getInitParameter("loginUI"); String loginProcess = config.getInitParameter("loginProcess"); String encoding = config.getInitParameter("encoding"); HttpServletRequest request = (HttpServletRequest) req; HttpServletResponse response = (HttpServletResponse) res; // 設置請求的字符集(post請求方式有效) request.setCharacterEncoding(encoding); // 不帶http://域名:端口的地址 String uri = request.getRequestURI(); if (uri.contains(loginUI) || uri.contains(loginProcess)) { // 請求的登陸,放行 chain.doFilter(request, response); } else { if (request.getSession().getAttribute("user") == null) { // 重定向到登陸頁面 response.sendRedirect(request.getContextPath() + loginUI); } else { // 已經登陸,放行 chain.doFilter(request, response); } } } @Override public void destroy() { this.config = null; } }
該註解用於將類聲明爲監聽器,被 @WebListener 標註的類必須實現如下至少一個接口:日誌
@WebListener("This is only a demo listener") public class SimpleListener implements ServletContextListener{...}
import javax.servlet.ServletRequestEvent; import javax.servlet.ServletRequestListener; import javax.servlet.annotation.WebListener; @WebListener public class Test implements ServletRequestListener { public Test() { } public void requestDestroyed(ServletRequestEvent arg0) { } public void requestInitialized(ServletRequestEvent arg0) { } }