JavaWeb-MVC、过滤器

一、MVC架构图

JavaWeb-MVC、过滤器

Model

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

View

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

Controller(Servlet)

  • 接收用户的请求:(req:请求参数,Session信息)
  • 交给业务层处理对应的代码
  • 控制视图的跳转
    比如一个登录流程
登录--->接收用户的登录请求--->Servlet处理用户的请求(获取用户登录的参数,username,password)--->交
给业务员层处理登录业务(判断用户名密码是否正确)--->Dao层查询用户名和密码是否正确-->数据库

二、过滤器(Filter重点)

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

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

JavaWeb-MVC、过滤器

1.Filter开发步骤

(1)导入Maven依赖


          javax.servlet
          javax.servlet-api
          3.1.0

          javax.servlet.jsp
          javax.servlet.jsp-api
          2.3.3

          taglibs
          standard
          1.1.2

          javax.servlet.jsp.jstl
          jstl
          1.2

(2)编写过滤器

  • 实现Filter接口
  • 重写方法
package com.tang.filter;

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

public class CharacterEncodingFilter implements Filter {
  //初始化:web服务器启动,就已经初始化了,随时等待过滤器对象出现
  public void init(FilterConfig filterConfig) throws ServletException {
      System.out.println("characterEncoding初始化");
  }
  /*
  * chain 链
  * 1.过滤其中所有代码,在过滤特定请求
  *   (特定请求:比如在Servlet中会在web.xml中进行注册,同理过滤器也一样需要注册和添加映射)的时候都会执行
  * 2.必须要让过滤器继续通行
  *    chain.doFilter(request,response);*/
  public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
      request.setCharacterEncoding("utf-16");//写utf-8得写setContentType为text/html,否则还会乱码因此我直接写utf-16
      response.setCharacterEncoding("utf-16");
      response.setContentType("text/html;charset=UTF-8");

      System.out.println("setCharacterEncoding执行前。。。");
      chain.doFilter(request,response);//对过滤器起一个放行的作用,如果不写程序到这里就被拦截停止
      System.out.println("setCharacterEncoding执行后。。。");
  }
  //销毁:web服务器关闭的时候,过滤器会销毁
  public void destroy() {
      System.out.println("characterEncoding销毁");
  }
}

(3)在web.xml中配置filter


        showservlet
        com.tang.servlet.ShowServlet

        showservlet
        /servlet/show

        showservlet

        /show

        CharacterEncodingFilter
        com.tang.filter.CharacterEncodingFilter

        CharacterEncodingFilter

        /servlet/*

ShowServlet代码如下

package com.tang.servlet;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class ShowServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //resp.setCharacterEncoding("UTF-16");
        resp.getWriter().write("唐三是挂,谁惹谁挂");
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}

运行结果图
同一个请求,以servlet开头的访问会被过滤,另一个去访问则不会被过滤,结果如下

JavaWeb-MVC、过滤器

JavaWeb-MVC、过滤器

2.常见应用

(1)用户登录之后才能进入主页!用户注销后就不能进入主页了,用过滤器实现
实现大体思路:

  • 用户登录之后,向Session中存放用户的数据
  • 进入主页的时候要判断用户是否已经登录

我的目录结构如下图

JavaWeb-MVC、过滤器
因为我的web目录写在src的main下因此以下代码中重定向的时候加上了Tomcat部署中应用上下文的路径
LoginServlet代码
package com.tang.servlet;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class LoginServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
       //获取前端请求的参数
        System.out.println("进入了登录");
        //String username = req.getParameter("username");
        if(req.getParameter("username").equals("admin")){//登录成功
            System.out.println("登录成功");
            //USER_SESSION为一个常量,通常自己新建util包,并放在新建constant的类中
            req.getSession().setAttribute("USER_SESSION",req.getSession().getId());
            resp.sendRedirect("/Filter_war/sys/success.jsp");

        }else {
            resp.sendRedirect("/Filter_war/error.jsp");
        }
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}

login.jsp代码


    Title

登录

LogoutServlet代码

package com.tang.servlet;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class LogoutServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String user_session = (String) req.getSession().getAttribute("USER_SESSION");
        if(user_session != null){//说明用户处于登录状态,因为只有登录状态USER_SESSION不为空也即user_session不为空
            req.getSession().removeAttribute("USER_SESSION");//将该登录状态的用户移除
            resp.sendRedirect("/Filter_war/login.jsp");//注销之后进入登录界面

        }else{
            resp.sendRedirect("/Filter_war/login.jsp");//注销为空也回到该页面
        }
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}

success.jsp主界面代码


    Title

主页
注销

除了success.jsp中的方法实现用户没有登录就不能进入主页的方法之外还可以用过滤器的方法实现代码如下

package com.tang.filter;

import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class sysFilter implements Filter {
    public void init(FilterConfig filterConfig) throws ServletException {

    }

    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        HttpServletRequest request =(HttpServletRequest) servletRequest;
        HttpServletResponse response =(HttpServletResponse) servletResponse;
        if(request.getSession().getAttribute("USER_SESSION")== null){
            response.sendRedirect("/Filter_war/error.jsp");
        }
        filterChain.doFilter(request,response);//这句话一定要写,不然到success.jsp页面就直接停了不会往下走

    }

    public void destroy() {

    }
}

过滤器实现时web.xml中的配置如下


        sysFilter
        com.tang.filter.sysFilter

        sysFilter
        /sys/*

error.jsp代码


    Title

错误
没有权限用户名或者密码错误
返回登录界面

web.xm代码如下


        LoginServlet
        com.tang.servlet.LoginServlet

        LoginServlet
        /servlet/login

        logoutServlet
        com.tang.servlet.LogoutServlet

        logoutServlet
        /servlet/logout

运行结果图

JavaWeb-MVC、过滤器

Original: https://www.cnblogs.com/twq46/p/16529847.html
Author: 剑断青丝ii
Title: JavaWeb-MVC、过滤器

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/620392/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • python-memcached学习笔记

    介绍: memcached是免费、开源、高性能、分布式内存对象的缓存系统(键/值字典),旨在通过减轻数据库负载加快动态web应用程序的使用。 数据类型:只用一种字符串类型 1:安装…

    数据库 2023年6月6日
    077
  • Atlas快速入门

    之前的公司在数据中台的项目上调研决定启用了Atlas作为我们数据血缘管理的工具,让我给大家写了一份Atlas快速入门的文档,所以在这里我将这篇文档以一个纯新手视角的方式再一次优化,…

    数据库 2023年6月11日
    095
  • PDF转换OFD(Java实用版)

    前言: 在项目中用到了,就写一下哈 OFD简介 百度百科:https://baike.baidu.com/item/OFD/56227163?fr=aladdin OFD(Open…

    数据库 2023年6月16日
    0132
  • 设计模式之(2)——工厂方法模式

    定义:工厂方法模式又称为工厂模式、多态工厂模式和虚拟构造器模式,通过定义工厂父类来定义创建对象的接口,而子类负责生成具体的对象; 主要作用:将类的实例化延迟到工厂类的子类中进行,由…

    数据库 2023年6月14日
    0102
  • LeetCode 27. 移除元素

    给你一个数组nums和一个值val,你需要 原地 移除所有数值等于val的元素,并返回移除后数组的新长度。 不要使用额外的数组空间,你必须仅使用O(1)额外空间并 原地 修改输入数…

    数据库 2023年6月11日
    080
  • 翻译|使用 StatefulSet 运行数据库应用

    本文介绍 Kubernetes 支持数据库等有状态应用的常见解决方案:StatefulSet。 我们在构建机器学习向量管理时面临的一个重要问题是:如何持久化数据,避免数据丢失? […

    数据库 2023年5月24日
    0101
  • Java基础一—面向对象三大特性

    写在最前 本系列为个人对BAT大厂面试题与全栈知识体系结合的简化梳理及本人在日常学习中一些知识的整理(包括但不限于书本、他人博客、微信公众号等渠道),仅为个人总结学习与整理知识框架…

    数据库 2023年6月6日
    079
  • 2022-8-20 数据库连接池

    1. 概念:其实就是一个容器(集合),存放数据库连接的容器。 当系统初&#x59CB…

    数据库 2023年6月14日
    0118
  • 如何写出有效的单元测试

    测试不要名不副实避免测试的描述与测试内容不符;测试结果必须精准;测试该失败的时候一定要失败! 测试私有或者受保护的方法解决思路: 将方法变成公共方法; 将方法抽取到新类; 将方法变…

    数据库 2023年6月14日
    098
  • Binlog分析利器-binlog_summary.py

    ​Binlog中,除了具体的SQL,其实,还包含了很多有价值的信息,如, 拿到上面这些信息,我们可以做哪些事情呢? 开发了一个简单的Binlog分析工具-binlog_summar…

    数据库 2023年6月11日
    0100
  • 在线安装Docker

    安装 yum-utils 包yum install -y yum-utils 设置存储库# 官方地址(比较慢) yum-config-manager \ –add-repo \ …

    数据库 2023年6月14日
    088
  • Windows 是最安全的操作系统

    建了一个用户交流群,我在群里说:”Windows 是最安全的操作系统。” 立刻引发了很多有意思的观点。我在群里一个人说不过大家,先篇文章把自己的论点罗列一下…

    数据库 2023年6月6日
    0248
  • Java 反射学习笔记

    反射,指在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法,对任意一个对象,都能调用它的任意一个方法。这种动态获取信息,以及动态调用对象方法的功能,叫做 Java 语言…

    数据库 2023年6月11日
    096
  • SQLZOO练习5–join(表的连接)

    game表: idmdatestadiumteam1team2 1001 8 June 2012 National Stadium, Warsaw POL GRE 1002 8 J…

    数据库 2023年6月16日
    075
  • 对象映射时 Integer 类型字段转换枚举处理麻烦 一个工具类搞定

    使用场景 当我们返回给前端所需的对象数据时,大多数情况可以直接使用 StructMap 映射实现自动转换,但碰到对象中的某些字段需要从 Integer 类型转换成对应枚举的时候,在…

    数据库 2023年6月6日
    071
  • 基于PHP7.2+MySQL5.7的回收租凭系统

    likeshop回收租赁系统适用于物品回收、物品租赁、二手买卖交易等三大场景。 系统支持智能评估回收价格,后台调整最终回收价,用户同意回收后系统即刻放款,用户微信零钱提现。支持在线…

    数据库 2023年6月14日
    092
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球