監聽器和過濾器
Servt規範擴充套件-----------監聽器介面
1、介紹:
1)一組來自於Servlet規範下的介面,共有8個介面。在Tomcat中存在於Servlet-api.jar包
2)監聽器介面需要由開發人員親自實現,Http伺服器提供的jar中並沒有對應的實現類
3)監聽器介面用於監控【作用域物件生命週期的變化時刻】以及【作用域物件共享資料的變化時刻】
2、作用域物件:
1)在Servlet規範中,認為在服務端記憶體中可以在某些條件下為兩個Servlet之間提供資料共享方案的物件,被稱為【作用域物件】
2)在Servlet規範下的作用域物件:
ServletContext:全域性作用域物件
HttpSession:會話作用域物件
HttpServletRequest:請求作用域物件
3、監聽器介面實現類開發規範:三步
1)根據監聽的實際情況,選擇對應的監聽器介面進行實現
2)重寫監聽器介面中宣告的【監聽事件處理方法】
3)在web.xml檔案中將監聽器介面實現類註冊到Http伺服器中
4、ServletContextListener
1)作用:通過這個介面合法的檢測全域性作用域物件的兩個時刻
被初始化時刻 被銷燬時刻
2)監聽事件處理方法
public void contextInitialized():在全域性作用域物件被Http伺服器初始化是呼叫
public void contextDestroyed():在全域性作用域物件被Http伺服器銷燬時呼叫
5、ServletContextAttributeListener介面:
1)作用:通過這個介面合法的檢測全域性作用域物件共享資料變化的時刻
2)監聽事件處理方法:
public void contextAdded():在全域性作用域物件新增共享資料時呼叫
public void contextReplaced():在全域性作用域物件更新共享資料時呼叫
public void contextRemoved():在全域性作用域物件刪除共享資料時呼叫
6、全域性作用域物件共享資料變化時刻
ServletContext application=request.getServletContext();
application.setAttribute("key1",100); //新增共享資料
application.setAttribute("key1",200); //更新共享資料
application.removeAttribute("key1"); //刪除共享資料
程式碼實現
以下就以ServletContextListener介面和ServletContextAttributeListener介面
第一步:選擇ServletContextListener介面進行實現
第二步:重寫監聽器介面宣告的【監聽事件處理方法】
public class OneListener implements ServletContextListener {
@Override
public void contextInitialized(ServletContextEvent sce) {
System.out.println("Initialized............");
}
@Override
public void contextDestroyed(ServletContextEvent sce) {
System.out.println("Destroyed.............");
}
}
第三步:在web.xml中將監聽器介面實現類註冊到Http伺服器中
<listener>
<listener-class>school.xauat.listener.OneListener</listener-class>
</listener>
由於ServletContext【全域性作用物件的生命週期】貫穿網站的整個執行期間
Servlet之間資料共享中有具體的ServletContext生命週期
因此在Tomcat伺服器啟動過程時,執行contextInitialize()方法
Initialized............
在Tomcat伺服器準備關閉時,執行contextDestroyed()方法
Destroyed.............
第一步:選擇ServletContextAttributeListener介面進行實現
第二步:重寫監聽器介面宣告的【監聽事件處理方法】
public class OneListener implements ServletContextAttributeListener {
@Override
public void attributeAdded(ServletContextAttributeEvent scae) {
System.out.println("ServletContextAttribute is added......");
}
@Override
public void attributeRemoved(ServletContextAttributeEvent scae){
System.out.println("ServletContextAttribute is removed......");
}
@Override
public void attributeReplaced(ServletContextAttributeEvent scae){
System.out.println("ServletContextAttribute is replaced......");
}
}
第三步:在web.xml檔案中將監聽器介面實現類註冊到Tomcat伺服器中
<servlet>
<servlet-name>OneServlet</servlet-name>
<servlet-class>school.xauat.controller.OneServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>OneServlet</servlet-name>
<url-pattern>/one</url-pattern>
</servlet-mapping>
<listener>
<listener-class>school.xauat.listener.OneListener</listener-class>
</listener>
監聽事件
public class OneServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//通過請求物件獲取全域性作用域物件
ServletContext application=request.getServletContext();
//向全域性作用域物件中新增共享資料
application.setAttribute("key",100);
//更改全域性作用域物件中的共享資料
application.setAttribute("key",500);
//刪除全域性作用域物件中的共享資料
application.removeAttribute("key");
}
}
執行結果
Servt規範擴充套件-----------過濾器介面
1、介紹:
1)來自於Servlet規範下的介面,在Tomcat中存在於servlet-api.jar包中
2)Filter介面實現類由開發人員負責提供的,Http伺服器不負責提供
3)Filter介面會在Http伺服器呼叫資原始檔之前,對Http伺服器進行攔截
2、具體作用:
1)攔截Http伺服器,幫助Http伺服器去檢測當前請求的合法性
2)攔截Http伺服器,對當前請求進行增強操作
3、Filter介面實現類的開發步驟:三步
1)建立一個java類實現Filter介面
2)重寫Filter介面中的doFilter方法
3)在web.xml檔案中將過濾器介面實現類註冊到Http伺服器
過濾器檢測請求合法性
第一步:建立一個java類實現Filter介面
第二步:重寫doFilter介面中的doFilter()方法
/**
* http://localhost:8080/myWeb/mm.jpg?age=89
*/
public class OneFilter implements Filter {
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
//通過攔截的請求物件來得到請求包中的引數資訊,從而得到來訪使用者的真實年齡
String age=servletRequest.getParameter("age");
//根據這個年齡幫助我們的Http伺服器判斷本次請求的合法性
if(Integer.valueOf(age)<70){
//將攔截請求物件和相應物件交換給Tomcat,由Tomcat繼續呼叫資原始檔
filterChain.doFilter(servletRequest,servletResponse);
}else{
//過濾器代替Http伺服器拒絕本次請求
servletResponse.setContentType("text/html;charset=utf-8");
PrintWriter out=servletResponse.getWriter();
out.print("<center><font style='color:red;font-size:40px'>不合適!!!!</font></center>");
}
}
}
第三步:在web.xml檔案中將過濾器介面實現類註冊到Http伺服器
<!--將過濾器類檔案交給Tomcat-->
<filter>
<filter-name>OneFilter</filter-name>
<filter-class>school.xauat.filter.OneFilter</filter-class>
</filter>
<!--通知Tomcat在呼叫何種資原始檔是需要被當前過濾器攔截-->
<filter-mapping>
<filter-name>OneFilter</filter-name>
<url-pattern>/mm.jpg</url-pattern>
</filter-mapping>
過濾器對請求物件進行增強服務
當有多個以post的請求訪問伺服器時,需要對每個Servlet介面實現類中doPost()方法進行以下操作,增加的開發的難度。
response. setCharacterEncoding("utf-8")
以下展示過濾器的作用:
第一步:建立java實現Filter介面
第二步:重寫Filter介面下的doFilter()方法
public class OneFilter implements Filter {
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
servletRequest.setCharacterEncoding("utf-8");
filterChain.doFilter(servletRequest,servletResponse);
}
}
第三步:在web.xml檔案中將過濾器介面實現類註冊到Http伺服器
<servlet>
<servlet-name>OneServlet</servlet-name>
<servlet-class>school.xauat.controller.OneServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>OneServlet</servlet-name>
<url-pattern>/one</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>TwoServlet</servlet-name>
<servlet-class>school.xauat.controller.TwoServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>TwoServlet</servlet-name>
<url-pattern>/two</url-pattern>
</servlet-mapping>
<!--註冊Filter類-->
<filter>
<filter-name>OneFilter</filter-name>
<filter-class>school.xauat.filter.OneFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>OneFilter</filter-name>
<!--通知Tomcat在呼叫所有資原始檔之前都需要呼叫OneFilter進行攔截-->
<url-pattern>/*</url-pattern>
</filter-mapping>
OneServlet
public class OneServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//通過請求物件獲取請求體中的請求引數
String userName=request.getParameter("userName");
System.out.println("OneServlet----->"+userName);
}
}
TwoServlet
public class TwoServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//通過請求物件獲取請求體中的請求引數
String userName=request.getParameter("userName");
System.out.println("TwoServlet---->"+userName);
}
}
相關文章
- 過濾器和監聽器總結過濾器
- 【JavaWeb】EL表示式&過濾器&監聽器JavaWeb過濾器
- 監聽器,過濾器,攔截器的執行過程和對比過濾器
- SpringBoot 攔截器、過濾器、監聽器Spring Boot過濾器
- Filter(過濾器)與Listener(監聽器)詳解Filter過濾器
- 過濾器監聽器面試題都在這裡過濾器面試題
- springBoot的過濾器,監聽器,攔截器Spring Boot過濾器
- spring boot 新增自定義監聽器、過濾器、攔截器Spring Boot過濾器
- Web中的監聽器【Listener】與過濾器【Filter】 例項Web過濾器Filter
- spring boot 實現監聽器、過濾器、全域性異常處理Spring Boot過濾器
- jfinal中如何使用過濾器監控Druid監聽SQL執行?過濾器UISQL
- 事件和事件監聽器事件
- 21. Spring Boot過濾器、監聽器【從零開始學Spring Boot】Spring Boot過濾器
- oracle例項和監聽器Oracle
- Spring 過濾器和攔截器Spring過濾器
- 過濾器過濾器
- 過濾Servlet--過濾器Servlet過濾器
- 點雲濾波器與過濾器過濾器
- 4、過濾器的使用及自定義過濾器過濾器
- 代理過濾器過濾器
- vue 過濾器Vue過濾器
- Filter過濾器Filter過濾器
- hbase過濾器過濾器
- CAN過濾器過濾器
- Servlet過濾器Servlet過濾器
- 26、過濾器過濾器
- jms過濾器過濾器
- DataV過濾器過濾器
- Vue過濾器Vue過濾器
- Android——Intent和Intent過濾器AndroidIntent過濾器
- oracle 監聽器配置Oracle
- JS事件監聽器JS事件
- Xor過濾器:比布隆Bloom過濾器更快,更小過濾器OOM
- 伺服器端監聽器配置伺服器
- 談談 Spring 的過濾器和攔截器Spring過濾器
- asp.net core MVC 過濾器之ActionFilter過濾器(二)ASP.NETMVC過濾器Filter
- session監聽器怎樣得到request和responseSession
- Vue中過濾器Vue過濾器