2020-10-29 Filter和Listener

MVC三层架构

Model:

1.DAO数据持久层(通过JDBC进行的数据库的CRUD)。

2.业务逻辑(Service)。

View:

1.用户看到的视图。

2.提供链接发起Servlet请求。

Controller

1.接受用户的请求(Request和Response等)

2.交给业务层响应的代码

3.控制视图的跳转

本身不会直接与数据库进行操作。

过滤器Filter

FIlter:用来过滤网站的数据。

  • 处理中文乱码,每次我都要set“utf-8”。

  • 儒雅随和变成***。

  • 处理乱码问题。

如何实现一个过滤器?

1.在idea Maven项目中导入依赖

2.实现监听器接口(必须实现的是javax.servlet下的Filter),重写三个方法

3.web.xml中注册监听器。

package com.kyz.filter;

import javax.servlet.*;
import java.io.IOException;

public class characterEncodingFilter implements Filter {
    //初始化
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("characterEncodingFilter初始化了");

    }
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        request.setCharacterEncoding("utf-8");
        response.setCharacterEncoding("utf-8");
        response.setContentType("text/html;charset=utf-8");

        System.out.println("characterEncodingFilter 执行前...");
        chain.doFilter(request,response);//让我们的请求继续走,如果不写到这里会被拦截停止

        System.out.println("characterEncodingFilter 执行后...");


    }

    //destory
    @Override
    public void destroy() {
        System.out.println("characterEncodingFilter销毁了 ");

    }
}

这个简单的FilterDemo可以实现处理jsp或者是html中的网页乱码问题,将所有的resp.setCharacterEncoding("utf-8");等req resp的设置全部设置在Filter中。

chain.doFilter(request,response);//让我们的请求继续走,如果不写到这里会被拦截停止

1.chain是链,过滤器中的所有代码在执行特定请求的时候都会执行,2.必须要让过滤器继续通行3.所有代码Filter都会过滤,web服务器关闭的时候过滤器会销毁。

监听器Listener

后面应该可以实现一个这样简单的监听器。

实现一个监听器

1. 编写一个监听器 & 实现监听器的接口 HttpSessionLisenter

2.web.xml中注册监听器 <listener>

package com.kyz.listener;

import javax.servlet.ServletContext;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;

public class OnlineCountlistener implements HttpSessionListener {
   //监听session的举动,一旦创建一个session,就会触发一次事件,
    @Override
    public void sessionCreated(HttpSessionEvent se) {
         ServletContext ctx = se.getSession().getServletContext();
         System.out.println(se.getSession().getId());
         Integer onlinecount= (Integer)ctx.getAttribute("onlinecount");
         if(onlinecount==null)
         {
             onlinecount = new Integer(1);
         }else
         {
             int count = onlinecount.intValue();
             onlinecount = new Integer(count+1);
         }
         //直接键值对赋值
         ctx.setAttribute("onlinecount",onlinecount);
    }

    //一旦session销毁就会触发destory方法
    @Override
    public void sessionDestroyed(HttpSessionEvent se) {
        ServletContext ctx = se.getSession().getServletContext();

        Integer onlinecount= (Integer)ctx.getAttribute("onlinecount");
        if(onlinecount==null)
        {
            onlinecount = new Integer(0);
        }else
        {
            int count = onlinecount.intValue();
            onlinecount = new Integer(count-1);
        }
        //直接键值对赋值
        ctx.setAttribute("onlinecount",onlinecount);

    }
    //session销毁的情况
    // 1.手动销毁   se.getSession().invalidate();
    // 2.自动销毁
    //  <session-config>
    //    <session-timeout>15</session-timeout>
    //  </session-config>
}

chrome中访问该页面以后再使用edge访问该页面,充分体现了每一个不同的Browser都是一个不同的session

 

这里关闭浏览器没有自动销毁session应该是与浏览器的Cookie关,我们直接手动销毁

HttpSession httpsession = req.getsession();

httpsession.invalidata();

1.session销毁的两种情况,在web.xml中配置session-timeout

2.直接手动在servlet中加入业务逻辑调用session.invalidate销毁本次会话。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值