JavaWeb学习第六篇,JavaBean、MVC三层架构、Filter(过滤器,重点)、Listener(监听器)

文章目录

JavaBean

  • 实体类
    JavaBean由特定的写法:
    1. 必须要有一个无参构造
    2. 属性必须私有化
    3. 必须有对应的get/set方法
  • 一般用来和数据库的字段做映射 ORM:对象关系映射
    1. 表 —> 类
    2. 字段 --> 属性
    3. 行记录 --> 对象

MVC三层架构

什么是MVC:model view controller 模型、视图、控制器

1、早些年

JavaWeb学习第六篇,JavaBean、MVC三层架构、Filter(过滤器,重点)、Listener(监听器)
以上图片解读:用户直接访问控制层,控制层就可以直接操作数据库

1、servlet – CRUD – 数据库
2、弊端:程序十分臃肿,不利于维护 ;servlet代码中:处理请求、响应、处理业务代码、处理逻辑代码
3、架构:没有什么是加一层解决不了的

2、MVC三层架构

JavaWeb学习第六篇,JavaBean、MVC三层架构、Filter(过滤器,重点)、Listener(监听器)

  • model

    1、业务处理:业务逻辑(service)
    2、数据持久层:CRUD(dao)

  • view

    1、展示数据
    2、提供链接发起servlet请求

  • controller(servlet)

    1、接收用户的请求:(req:请求参数、session信息)
    2、交给业务层处理对应的代码
    3、控制视图的跳转

Filter(过滤器,重点)

用来过滤网站的数据

1、处理中文乱码
2、登陆处理

JavaWeb学习第六篇,JavaBean、MVC三层架构、Filter(过滤器,重点)、Listener(监听器)

  • Filter开发步骤

    1、导包
    2、编写过滤器(实现接口,包不要导错

    import javax.servlet.*;
    public class CharacterEncodingFilter implements Filter
    
    public class CharacterEncodingFilter implements Filter {
        // web服务器启动,就已经初始化了,随时等待过滤对象的出现
        public void init(FilterConfig filterConfig) throws ServletException {
            System.out.println("CharacterEncodingFilter初始化");
        }
    
        /*
        * 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销毁");
        }
    }
    

    3、在web.xml中配置

        <filter>
            <filter-name>characterEncoding</filter-name>
            <filter-class>cn.fsh.pojo.CharacterEncodingFilter</filter-class>
        </filter>
        <filter-mapping>
            <filter-name>characterEncoding</filter-name>
            <!--只要是 /servlet 的任何请求,都会经过这个过滤器-->
            <url-pattern>/servlet/*</url-pattern>
        </filter-mapping>
    
  • filter是实现权限拦截
    用户登陆转换才能进入主页!用户注销后就不能进入主页了
    1、用户登陆之后,向session对象中存入一个辨识用户已经登陆的数据

    HttpSession session = req.getSession();
    session.setAttribute("USER_SESSION",req.getSession().getId());
    

    2、如果想要直接在浏览器url中输入成功界面的地址,需要经过过滤器进行判断session中是否存在哪个标识用户已经登陆的值

        public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
            HttpServletRequest req = (HttpServletRequest)request;
            HttpServletResponse resp = (HttpServletResponse)response;
            // 设置编码
            req.setCharacterEncoding("utf-8");
            resp.setCharacterEncoding("utf-8");
            resp.setContentType("text/html;charset=UTF-8");
            // 判断session中的关于登陆的值是否存在
            if(req.getSession().getAttribute("USER_SESSION") == null) {
                // 返回登陆界面
                resp.sendRedirect("/index.jsp");
            }
            chain.doFilter(req,resp);
        }
    
    

    3、注销登录,就是移除session中的值

        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            // 消除session中的值
            Object user_session = req.getSession().getAttribute("USER_SESSION");
            if (user_session == null) {
                // 值为空,说明用户注销了
            }else {
                // 不为空,移除
                req.getSession().removeAttribute("USER_SESSION");
                // 重定向到登陆界面
                resp.sendRedirect("/index.jsp");
            }
        }
    
    

Listener(监听器)

  • 1、编写监听器

    // 统计在线人数,统计session
    public class OnlineCountListeners implements HttpSessionListener {
        // 创建session监听:
        // 一旦创建session就会触发一次这个事件
        public void sessionCreated(HttpSessionEvent se) {
            ServletContext context = se.getSession().getServletContext();
    
            Integer onlineCount = (Integer) context.getAttribute("onlineCount");
            if (onlineCount == null) {
                onlineCount = new Integer(1);
            }else {
                int count = onlineCount.intValue();
                onlineCount = new Integer(count+1);
            }
            context.setAttribute("onlineCount", onlineCount);
        }
    
        public void sessionDestroyed(HttpSessionEvent se) {
            ServletContext context = se.getSession().getServletContext();
    
            Integer onlineCount = (Integer) context.getAttribute("onlineCount");
            if (onlineCount == null) {
                onlineCount = new Integer(0);
            }else {
                int count = onlineCount.intValue();
                onlineCount = new Integer(count-1);
            }
            context.setAttribute("onlineCount", onlineCount);
    
        }
    }
    
  • 2、在web.xml中注册监听器

        <listener>
            <listener-class>cn.fsh.pojo.OnlineCountListeners</listener-class>
        </listener>
    
上一篇:css 绝对定位下点击事件失效


下一篇:listener(监听器)