文章目錄
- Filter Listener Servlet 是 javaweb 的三大組件
- 監聽器
- 監聽內置對象的創建
- 監聽內置對象值的改變
- 1.監聽ServletContext對象值的改變 ==> 實現這個監聽 ServletContextAttributeListener
- 2.監聽reques對象裏值的改變==> 實現這個監聽器 ServletRequestAttributeListener
- 3.監聽session 的值改變==> 實現 HttpSessionAttributeListener
- 4.HttpSessionActivationListener == >防止內存中的數據丟失
- HttpSessionBindingListener 監聽對象是否綁定在session==>也就是是否把這個對象存到session 裏
- 過濾器:Filter
- 過濾器鏈
Filter Listener Servlet 是 javaweb 的三大組件
監聽器
監聽某一個對象(內置對象)的狀態
狀態:
1.監聽內置對象的創建; ServletContext , request, session
2.監聽內置對象值的改變 ServletContext request session
3.監聽內置對象是否有存某一個固定的值 ==>主要是針對於session
監聽內置對象的創建
ServletContex
ServletContex是隨着服務器的創建而創建 ,隨着服務器的關閉而銷燬
步驟:
1.創建一個類 實現 ServletContextListener
2.重寫兩個方法 contextDestroyed(ServletContextEvent sce) 銷燬後所執行的方法
contextInitialized(ServletContextEvent sce) 初始化所執行的方法
3.在xml進行配置 或者是寫註解 @WebListener
xml配置
<listener>
//完整的包名與類名
<listener-class>com.study.listeren.MyServletContextListeren</listener-class>
</listener>
實現ServletContextListener(使用註解,如果寫xml會優先加載xml配置)
@WebListener
public class MyServletContextListeren implements ServletContextListener {
// 創建的時候所執行的方法
@Override
public void contextInitialized(ServletContextEvent servletContextEvent) {
System.out.println("contextInitialized");
}
// 銷燬的時候所執行的方法
@Override
public void contextDestroyed(ServletContextEvent servletContextEvent) {
System.out.println("contextDestroyed");
}
}
request
request ==隨着請求的開始而開始,隨着請求的結束而結束(一次請求 )
步驟:
1.創建一個類 實現 ServletRequestListener
2.重寫其requestDestroyed(ServletRequestEvent sre)銷燬
requestInitialized(ServletRequestEvent sre) 創建
3.配置註解 注意點(默認的tomcat會發動請求,==>看效果,直接重新訪問這個界面)
實現 ServletRequestListener
@WebListener
public class MyRequestListeren implements ServletRequestListener {
@Override
public void requestDestroyed(ServletRequestEvent servletRequestEvent) {
System.out.println("requestDestroyed");
}
@Override
public void requestInitialized(ServletRequestEvent servletRequestEvent) {
System.out.println("requestInitialized");
}
}
session
session ==>是隨着會話的創建而結果 ==>是30分鐘之後而關閉(如果不設置默認的時間)
步驟:
1.創建一個類 實現 HttpSessionListener
2.重寫其sessionDestroyed(HttpSessionEvent se)銷燬
sessionCreated(HttpSessionEvent se 創建
3.配置註解 注意點:只要關閉後三十分鐘 sessionId被清除
實現 HttpSessionListener
@WebListener
public class MySessionListeren implements HttpSessionListener {
@Override
public void sessionCreated(HttpSessionEvent httpSessionEvent) {
System.out.println("sessionCreated");
}
@Override
public void sessionDestroyed(HttpSessionEvent httpSessionEvent) {
System.out.println("sessionDestroyed");
}
}
監聽內置對象值的改變
1.監聽ServletContext對象值的改變 ==> 實現這個監聽 ServletContextAttributeListener
1.attributeAdded(ServletContextAttributeEvent scab) 追加
2.attributeRemoved(ServletContextAttributeEvent scab) 刪除
3.attributeReplaced(ServletContextAttributeEvent scab) 替換
@WebListener
public class MyServletContextAttributeListener implements ServletContextAttributeListener {
// 添加至
@Override
public void attributeAdded(ServletContextAttributeEvent servletContextAttributeEvent) {
System.out.println(servletContextAttributeEvent.getServletContext().getAttribute("uname"));
}
//刪除值
@Override
public void attributeRemoved(ServletContextAttributeEvent servletContextAttributeEvent) {
System.out.println(servletContextAttributeEvent.getServletContext().getAttribute("uname"));
}
//替換值的時候
@Override
public void attributeReplaced(ServletContextAttributeEvent servletContextAttributeEvent) {
System.out.println(servletContextAttributeEvent.getServletContext().getAttribute("uname"));
}
}
2.監聽reques對象裏值的改變==> 實現這個監聽器 ServletRequestAttributeListener
1.attributeAdded(ServletContextAttributeEvent scab) 追加
2.attributeRemoved(ServletContextAttributeEvent scab) 刪除
3.attributeReplaced(ServletContextAttributeEvent scab) 替換
注意點:在追加數據時候,默認會賦值一個null
@WebListener
public class MyRequestAttributeListener implements ServletRequestAttributeListener {
@Override
public void attributeAdded(ServletRequestAttributeEvent servletRequestAttributeEvent) {
System.out.println("增加"+servletRequestAttributeEvent.getServletRequest().getAttribute("uname"));
}
@Override
public void attributeRemoved(ServletRequestAttributeEvent servletRequestAttributeEvent) {
System.out.println("刪除"+servletRequestAttributeEvent.getServletRequest().getAttribute("uname"));
}
@Override
public void attributeReplaced(ServletRequestAttributeEvent servletRequestAttributeEvent) {
System.out.println("修改"+servletRequestAttributeEvent.getServletRequest().getAttribute("uname"));
}
}
3.監聽session 的值改變==> 實現 HttpSessionAttributeListener
1.attributeAdded(ServletContextAttributeEvent scab) 追加
2.attributeRemoved(ServletContextAttributeEvent scab) 刪除
3.attributeReplaced(ServletContextAttributeEvent scab) 替換
@WebListener
public class MySessionAttributeListener implements HttpSessionAttributeListener {
@Override
public void attributeAdded(HttpSessionBindingEvent httpSessionBindingEvent) {
System.out.println("增加"+httpSessionBindingEvent.getSession().getAttribute("uname"));
}
@Override
public void attributeRemoved(HttpSessionBindingEvent httpSessionBindingEvent) {
System.out.println("刪除:"+httpSessionBindingEvent.getSession().getAttribute("uname"));
}
@Override
public void attributeReplaced(HttpSessionBindingEvent httpSessionBindingEvent) {
System.out.println("替換:"+httpSessionBindingEvent.getSession().getAttribute("uname"));
}
}
4.HttpSessionActivationListener == >防止內存中的數據丟失
sessionWillPassivate(HttpSessionEvent se)
鈍化 ==>工業:把一些液體固體化 硬盤 == 內存
sessionDidActivate(HttpSessionEvent se) 活化 =>把固體化的物質解化
鈍化:也就是把內存中數據保存在磁盤 1.把對象存在session
活化 :把磁盤中的數據加載到內存
注意點 1.要依賴於流,對象必須實現序列化的接口 2.不需要給注 3.不需要新建一個類 4. 在idea中需要配置
public class Person implements Serializable,HttpSessionActivationListener {
private String pname;
public String getPname() {
return pname;
}
public void setPname(String pname) {
this.pname = pname;
}
// 鈍化
@Override
public void sessionWillPassivate(HttpSessionEvent httpSessionEvent) {
System.out.println("sessionWillPassivate");
}
//活化
@Override
public void sessionDidActivate(HttpSessionEvent httpSessionEvent) {
System.out.println("sessionDidActivate");
}
}
HttpSessionBindingListener 監聽對象是否綁定在session==>也就是是否把這個對象存到session 裏
valueBound() 表示綁定了
valueUnbound() 表示解綁了
1.不需要給注 2.不需要新建一個類
代碼
public class Student implements Serializable,HttpSessionBindingListener {
@Override
public void valueBound(HttpSessionBindingEvent httpSessionBindingEvent) {
System.out.println("被綁定了");
}
@Override
public void valueUnbound(HttpSessionBindingEvent httpSessionBindingEvent) {
System.out.println("解綁了");
}
}
過濾器:Filter
程序中的過濾器跟生活中的定義一下 1.過濾: 過濾編碼格式 2.對某些請求進行過濾
使用的一個步驟(與使用servlet的步驟是一樣的):
1.寫一個類 實現過濾這個接口
2.實現其抽象方法
init()filter 初始化所執行的方法
doFilter() 滿足過濾條件的一切請求與響應都會執行這個方法
filterChain.doFilter(servletRequest,servletResponse); 一定放行
destroy() 銷燬的方法
3.在web.xml 進行配置 或者配置註解
@WebFilter(filterName = "encodingFilter",urlPatterns = "/*") 加載的順序是按照名字來進行排序的
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;
@WebFilter(filterName = "encodingFilter",urlPatterns = "/*")
public class EncodingFilter implements Filter {
//filter 初始化的時候執行
@Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("init");
}
//滿足過濾條件的請求與響應都會執行
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
servletRequest.setCharacterEncoding("UTF-8");
servletResponse.setCharacterEncoding("UTF-8");
servletResponse.setContentType("text/html;charset=utf-8");
System.out.println("doFilter");
//放行
filterChain.doFilter(servletRequest,servletResponse);
}
// 銷燬的時候執行
@Override
public void destroy() {
System.out.println("destroy");
}
}
@WebFilter(filterName = "userFilter",urlPatterns = "/admin/*")//過濾條件
public class UserFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {//對符合過濾條件的請求進行處理
// 首先把 ServletRequest 轉化爲HttpServletRequest
HttpServletRequest request = (HttpServletRequest) servletRequest;
HttpSession httpSession = request.getSession();
if(httpSession.getAttribute("uname") !=null){
//正常放行
filterChain.doFilter(servletRequest,servletResponse);//處理完成放行
}else{
System.out.println("123455");
//回到index.jsp
request.setAttribute("msg","非法訪問");
request.getRequestDispatcher("../index.jsp").forward(servletRequest,servletResponse);
}
}
@Override
public void destroy() {
}
}
過濾器鏈
一個請求與響應的路上存在多個過濾器 ==> 過濾器鏈執行的過程