JavaWeb04: MVC三层架构+过滤器+监听器

1. MVC三层架构

什么是MVC:

Model模型:

  • 实体类和数据库中对应的字段

  • view视图:jsp页面 

  • Controller:servlet负责跳转页面

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

servlet——>CRUD——>数据库

弊端:程序十分臃肿,不利于维护。servlet的代码中:处理请求,响应,视图跳转,处理jdbc,处理业务代码,处理逻辑代码。(十分复杂)

架构:没有什么是加一层是解决不了的。

现在:把业务层从控制器中提取:

Model:

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

View:

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

Controller(Servlet)

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

登陆--->接受用户的登陆请求--->处理用户的请求(获取用户的登陆参数:username,password)--->交给业务层处理登陆业务(判断用户名密码是否正确)

--->Dao层查询用户名和密码是否正确--->数据库

如果查询成功,逆向往回。

2. 过滤器(重点)

Filter:过滤器,用来过滤网站的数据。它和servlet一模一样,只不过servlet实现的是servlet接口,filter实现的filter接口。shiro也是用filter实现的。

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

开发步骤:

  1. 导入依赖:
    <dependencies>
        <dependency>
          <groupId>javax.servlet</groupId>
          <artifactId>javax.servlet-api</artifactId>
          <version>3.1.0</version>
          <scope>provided</scope>
        </dependency>
        <dependency>
          <groupId>javax.servlet.jsp</groupId>
          <artifactId>javax.servlet.jsp-api</artifactId>
          <version>2.3.1</version>
          <scope>provided</scope>
        </dependency>
        <dependency>
          <groupId>javax.servlet.jsp</groupId>
          <artifactId>javax.servlet.jsp-api</artifactId>
          <version>2.3.1</version>
          <scope>provided</scope>
        </dependency>
        <!--JSTL表达式的依赖 -->
        <!-- https://mvnrepository.com/artifact/javax.servlet.jsp.jstl/jstl-api -->
        <dependency>
          <groupId>javax.servlet.jsp.jstl</groupId>
          <artifactId>jstl-api</artifactId>
          <version>1.2</version>
        </dependency>
        <!--standard标签库 -->
        <!-- https://mvnrepository.com/artifact/taglibs/standard -->
        <dependency>
          <groupId>taglibs</groupId>
          <artifactId>standard</artifactId>
          <version>1.1.2</version>
        </dependency>
    
        <!--连接数据库 -->
        <dependency>
          <groupId>mysql</groupId>
          <artifactId>mysql-connector-java</artifactId>
          <version>5.1.47</version>
        </dependency>
    
      </dependencies>

     

  2. 导包别选错

  3. 编写过滤器

    public class CharacterEncodingFilter implements Filter{
        //初始化:web服务器启动,他就已经初始化了。他要随时等待过滤对象出现。
        @Override
        public void init(FilterConfig filterConfig) throws ServletException {
    
        }
    
        @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来放行对象,不写的话过滤器到这里就停住了。
            //有多个过滤器,形成一个链
            /*
            1. 过滤器中的所有代码,在过滤特定请求的时候都会执行。
            2. 必须要让过滤器继续通行
                chain.doFilter(request,response);固定的代码
            */
            chain.doFilter(request,response);// 让我们的请求继续走,没有的话程序停止。
            System.out.println("CharacterEncodingFilter执行后");
    
        }
    
        //销毁:web服务器关闭的时候,过滤器会销毁。
        @Override
        public void destroy() {
            System.out.println("CharacterEncodingFilter销毁");
        }
    }

3. 监听器

监听器就是一个实现特定接口的普通java程序,这个程序专门用于监听另一个java对象的方法调用或属性改变,当被监听对象发生上述事件后,监听器某个方法将立即被执行。

实现一个监听器的接口:(有很多种)

  • 编写一个监听器:实现监听器的接口

  • web.xml中注册监听器

session销毁:

4.  应用场景

监听器:主要用在GUI

过滤器:用户登陆后才能进入主页,注销后就不能进去主页。

访问顺序:

                                         

  • 用户登录之后,向session中放入用户数据
public class LoginServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //获取前端请求的参数
        String username = req.getParameter("username");//req.getParameter(Constant.USER_SESSION);
        if(username.equals("admin")){
            //登陆成功,会把用户信息放到session里,所以getsession
            //name一般不用"USER_SESSION",新建util包,建constant类
            req.getSession().setAttribute("USER_SESSION",req.getSession().getId());
            //重定向
            resp.sendRedirect("/sys/success.jsp");
        }else{
            //登陆失败
            resp.sendRedirect("/error.jsp");
        }
    }
  • 进入主页的时候,要判断用户是否已经登录(在过滤器中实现)
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        //父子关系,需要强转
        HttpServletRequest req = (HttpServletRequest) request;
        HttpServletResponse resp = (HttpServletResponse) response;

        Object userSession = req.getSession().getAttribute("USER_SESSION");
        if(userSession==null){
            resp.sendRedirect("/error.jsp");
        }

        chain.doFilter(request, response);
    }
  • 注销功能,删除session信息
public class LogoutServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //移除session
        Object user_session = req.getSession().getAttribute("USER_SESSION");

        //user_session!=null意味着用户登陆着
        if(user_session!=null){
            //移除(用session)
            req.getSession().removeAttribute("USER_SESSION");
            //重定向到登陆页面
            resp.sendRedirect("/login.jsp");
        }else{
            resp.sendRedirect("/login.jsp");
        }

    }

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值