MVC三层架构,过滤器、监听器及常见应用

发布时间 2023-07-15 18:28:21作者: 努力的小L

MVC三层架构

什么是MVC:Model View Controller 模型、视图、控制器

10.1早些年

控制器Controller Servlet:

  • 接收用户的请求
  • 响应给客户端内容
  • 重定向或者转发

视图层View JSP:

  • 展示数据
  • 提供可以供我们操作的请求

Servlet和JSP都可以写JAVA代码;为了易于维护和使用;Servlet专注于请求处理,以及控制视图跳转;JSP专注于显示数据。

用户直接访问控制层,控制层可以直接操作数据库。

servlet--CRUD-->数据库
弊端:程序十分臃肿,不利于维护 
servlet的代码中:处理请求,响应,视图跳转,处理JDBC,处理业务代码,处理逻辑代码
架构:没有什么是加一层解决不了的!
 程序员调用
  |
 JDBC
  |
 Mysql Oracle SqlServlet

10.2MVC三层架构

控制器Controller Servlet:

  • 接收用户的请求
  • 交给业务层去做
  • 视图跳转

视图层View JSP:

  • 展示数据
  • 提供用户操作

控制器向视图层转发或者重定向;

视图层向控制器操作。

Model

  • 业务处理:业务逻辑(Service)
  • 数据持久层:CRUD(Dao)

View

  • 展示数据
  • 提供链接发起Servlet请求(a,form,img...)

Controller(Servlet)

  • 接收用户请求:(req:请求参数,Session信息...)

  • 交给业务层处理对应的代码

  • 控制视图的跳转

    登录--->接收用户的登录请求--->处理用户的请求(获取用户登录的参数:username,password)-->交给业务层处理登录业务(判断用户名密码是否正确,事务)--->Dao层查询用户名和密码是否正确-->数据库
    

Filter

Filter:过滤器,用来过滤网站的数据。

  • 处理中文乱码
  • 登录验证

Filter开发步骤

  1. 导包不要错,一定要导到import java.servlet.Filter;包
  2. 编写过滤器
  • 过滤中的所有代码,在过滤器特定的请求的时候都会执行

  • 必须要让过滤器继续同行

  • 实现Filter接口,重写对应的方法即可

  • 在web.xml中配置Filter

监听器

实现一个监听器的接口;(有N种)

  1. 编写一个监听器

    实现监听器的接口

    package listener;
    import javax.servlet.http.HttpSessionEvent;
    import javax.servlet.http.HttpSessionListene;
    //统计网站在线人数,统计session
    public class OnlineCountListener implements HttpSessionListener{
        //创建session监听:看你的一举一动
        //一旦创建Session就会触发这个事件
        public void sessionCreated(HttpSessionEvent se){
        ServletContext ctx=se.getSession().serServletContext();
        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().serServletContext();
            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销毁的两种情况
        * 1. 手动销毁
        * 2. 自动销毁
        * */
    }
    
  2. web.xml中注册监听器

    <listener>
            <listener-class>com.OnlineCountListener</listener-class>
        </listener>
    
  3. 看情况是否使用。

过滤器、监听器的常见应用

监听器:GUI编程中经常使用

package listener;

import java.awt.*;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

public class TestPanel {
    public static void main(String[] args) {
        Frame frame=new Frame("快乐");//新建一个窗体
        Panel panel=new Panel(null);//面板
        frame.setLayout(null);//设置窗体布局
        frame.setBounds(300,300,500,500);
        frame.setBackground(new Color(0,0,255));//设置背景颜色
        panel.setBounds(50,50,300,300);
        frame.setBackground(new Color(0,255,0));
        frame.add(panel);
        frame.setVisible(true);
        //监听事件,监听关闭事件
        frame.addWindowListener(new WindowAdapter() {
            @Override
            public void windowOpened(WindowEvent e) {
                System.out.println("打开");
            }

            @Override
            public void windowClosing(WindowEvent e) {
                System.out.println("关闭ing");
            }

            @Override
            public void windowClosed(WindowEvent e) {
                System.out.println("打开ed");
            }

            @Override
            public void windowIconified(WindowEvent e) {
                super.windowIconified(e);
            }

            @Override
            public void windowDeiconified(WindowEvent e) {
                super.windowDeiconified(e);
            }

            @Override
            public void windowActivated(WindowEvent e) {
                System.out.println("激活");;
            }

            @Override
            public void windowDeactivated(WindowEvent e) {
                System.out.println("未激活");
            }

            @Override
            public void windowStateChanged(WindowEvent e) {
                super.windowStateChanged(e);
            }

            @Override
            public void windowGainedFocus(WindowEvent e) {
                super.windowGainedFocus(e);
            }

            @Override
            public void windowLostFocus(WindowEvent e) {
                super.windowLostFocus(e);
            }
        });
    }
}

用户登录之后才能进入主页,注销之后就不能进入主页了。

  1. 用户登录之后,向session中放入用户的数据。

  2. 进入主页的时候要判断用户是否已经登录;要求:在过滤器中实现。

    HttpServletRequest request=(HttpServletRequest) req;
    HttpServletResponse response=(HttpServletResponse) resp;
    if(request.getSession().getAttribute(Constant.USER_SESSION)==null){
        response.sendRedirect("/reeor.jsp");
    }
    chain.doFilter(request,response);