JavaWeb详解之(MVC三层架构,过滤器filter,session监听器)

MVC三层架构

1.什么是MVC

MVC 是一种使用 MVC(Model View Controller 模型-视图-控制器)设计创建 Web 应用程序的模式
  • Model(模型)
  • 业务处理 :业务逻辑(Service)
  • 数据持久层:CRUD (Dao)
  • View(视图)
    • 展示数据
  • 提供链接发起Servlet请求 (a,form,img…)
  • Controller(控制器)
    • 接收用户的请求 :(req:请求参数、Session信息….)
    • 交给业务层处理对应的代码
  • 控制视图的跳转

2.MVC原理图

在这里插入图片描述

3.MVC的优缺点

优点:                                    缺点:
     - 耦合性低                                  - 没有明确的定义
     - 重用性高                                  - 不适合小型,中等规模的应用程序
     - 生命周期成本低                             - 增加系统结构和实现的复杂性
     - 部署快                                     -视图与控制器间的过于紧密的连接
     - 可维护性高                                 - 视图对模型数据的低效率访问
     - 有利软件工程化管理                          - 一般高级的界面工具或构造器不支持模式

过滤器(Filter )

1.什么是Filter

Filter可认为是Servlet的一种“变种”,它主要用于对用户请求(HttpServletRequest)进行预处理,也可以对服务器响应(HttpServletResponse)进行后处理,是个典型的处理链。
它与Servlet的区别在于:它不能直接向用户生成响应。
完整的流程是:Filter对用户请求进行预处理,接着将请求交给Servlet进行处理并生成响应,最后Filter再对服务器响应进行后处理。

在这里插入图片描述

2.过滤器链

在一个Web应用中,也可以部署多个过滤器,这些过滤器组成了一个过滤器链。
过滤器链中的每个过滤器负责特定的操作和任务,客户端的请求可以在这些过滤器之间进行传递,直到          达到目标资源。

一个由两个Filter所组成的过滤器链的过滤过程:
在这里插入图片描述

注意
在客户端的请求响应过程中,并不需要经过所有的过滤器链,而是根据过滤器链中每个过滤器的过滤条件来匹配需要过滤的资源。

3.Filter的开发步骤

  1. 导包
  2. 编写过滤器:实现filter接口,重写方法
public class CharacterEncodingFilter implements Filter {
    //初始化:web服务器启动,就以及初始化了,随时等待过滤对象出现!
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("CharacterEncodingFilter初始化");
    }
    //Chain : 链
    /*    1. 过滤中的所有代码,在过滤特定请求的时候都会执行
          2. 必须要让过滤器继续同行
        chain.doFilter(request,response);     */
    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执行后....");
    }
    //销毁:web服务器关闭的时候,过滤会销毁
    public void destroy() {   System.out.println("CharacterEncodingFilter销毁");    }
}
  1. 在web.xml中配置 Filter
<filter>
    <filter-name>CharacterEncodingFilter</filter-name>
    <filter-class>com.filter.CharacterEncodingFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>CharacterEncodingFilter</filter-name>
    <!--只要是 /servlet的任何请求,会经过这个过滤器-->
    <url-pattern>/servlet/*</url-pattern>
    <!--<url-pattern>/*</url-pattern>-->  //所有请求
</filter-mapping>

监听器(Listener)

在监听器里面实际上主要都是针对于属性的监听(request、session、application)。
在这里我们主要讲述session监听

实现session监听

  1. 实现接口
//统计网站在线人数 : 统计session
public class OnlineCountListener implements HttpSessionListener {
    //创建session监听: 看你的一举一动
    //一旦创建Session就会触发一次这个事件!
    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监听
    //一旦销毁Session就会触发一次这个事件!
    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. 手动销毁  getSession().invalidate();
    2. 自动销毁  在web.xml设置时间
     */
}
  1. web.xml中注册监听器
<!--注册监听器-->
<listener>
    <listener-class>com.listener.OnlineCountListener</listener-class>
</listener>
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章