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)

大家都在看

  • 实现一个简单的Database3(译文)

    前文回顾 实现一个简单的Database1(译文) 实现一个简单的Database2(译文) 实现一个简单的Database3(译文) 译注:cstsck在github维护了一个简…

    数据库 2023年6月11日
    089
  • Volatile的学习

    首先先介绍三个性质 可见性 可见性代表主内存中变量更新,线程中可以及时获得最新的值。 下面例子证明了线程中可见性的问题 由于发现多次执行都要到主内存中取变量,所以会将变量缓存到线程…

    数据库 2023年6月11日
    063
  • 205. 同构字符串

    给定两个字符串 s 和 t ,判断它们是否是同构的。 如果 s 中的字符可以按某种映射关系替换得到 t ,那么这两个字符串是同构的。 每个出现的字符都应当映射到另一个字符,同时不改…

    数据库 2023年6月16日
    079
  • win7连接远程桌面提示身份验证错误函数不受支持

    win7连接远程桌面提示身份验证错误。要求的函数不受支持怎么办,下面的方法介绍了如何解决这个问题。 工具/原料 电脑 win7系统 方法/步骤 win+R 打开运行,输入&#822…

    数据库 2023年6月9日
    080
  • Python学习笔记2(未完待续)

    Python学习笔记2(未完待续) 解决plt中文乱码问题-方法1 plt.rcParams[“font.sans-serif”]=[“SimH…

    数据库 2023年6月14日
    074
  • 12 用最有效率的方法计算 2 乘以 8

    2 << 3 左移是位运算符,直接操作内存中整数对应的二进制位,效率高; 左移3位相当于乘以2的3次方,右移3位相当于除以2的3次方。 Original: https:…

    数据库 2023年6月6日
    073
  • Java学习-第一部分-第二阶段-项目实战:坦克大战【2】

    坦克大战【2】 笔记目录:(https://www.cnblogs.com/wenjie2000/p/16378441.html) 线程-应用到坦克大战 坦克大战0.3版 陆游曾说…

    数据库 2023年6月11日
    095
  • 常见的限流算法

    通过限制并发访问数或者限制一个时间窗口内允许处理的请求数量来保护系统,例如,通过限流,你可以过滤掉产生流量峰值的客户和服务。 令牌桶算法 令牌桶算法是常见的一种限流算法。假设有一个…

    数据库 2023年6月16日
    080
  • 线程的生命周期

    线程的生命周期​ 线程具有生命周期,其中包含 5种状态(出生状态,就绪状态,运行状态、暂停状态、死亡状态)。 出生状态就是线程被创建时的状态:当线程对象调用 start()方法 后…

    数据库 2023年6月16日
    0115
  • java Activiti 工作流引擎 SSM 框架模块设计方案

    工作流模块 1.模型管理 :web在线流程设计器、预览流程xml、导出xml、部署流程 2.流程管理 :导入导出流程资源文件、查看流程图、根据流程实例反射出流程模型、激活挂起 3….

    数据库 2023年6月6日
    0108
  • 第十四章 静态代理设计模式

    1.为什么需要代理设计模式 1.1 问题 在javaEE分层开发中,那个层对我们最重要? DAO–>Service–>Controller 在javaEE分层开发中…

    数据库 2023年6月14日
    078
  • Pisanix v0.2.0 发布|新增动态读写分离支持

    1.动态读写分离介绍 1.1 介绍 读写分离是业界使用 MySQL 高可用最常用的方案之一,在实际场景中可以提高查询性能,降低服务器负载。本次版本在 v0.1.0 静态规则基础上增…

    数据库 2023年6月16日
    097
  • windows下安装mysql5.7

    1.首先官网下载ZIP安装包(即以解压,配置的方式安装) 2.解压完成之后在目录下创建 my.ini文件 内容如下: [mysql]设置mysql客户端默认字符集default-c…

    数据库 2023年5月24日
    082
  • Java 多线程共享模型之管程(上)

    主线程与守护线程 默认情况下,Java 进程需要等待所有线程都运行结束,才会结束。有一种特殊的线程叫做守护线程,只要其它非守护线程运行结束了,即使守护线程的代码没有执行完,也会强制…

    数据库 2023年6月16日
    086
  • MySQL之自关联查询

    假设要设计两张表,一张省份表(provinces),一张城市表(citys) 省份表结构 id ptitle 城市表结构 id ctitle proid(表示城市所属的省,对应着省…

    数据库 2023年5月24日
    0122
  • 优化 JS 程序的一个小方法

    就像在学习之前先要识字,我想在介绍优化 JavaScript 代码之前,先介绍一下自己对编程语言的理解。故事要从一只叫做 Theseus 的机械鼠和其发明人克劳德-香农(Claud…

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