对MVC三层架构的深入理解和对过滤器Filter的实战运用详解-阿里云开发者社区

@[toc]

一.MVC三层架构

1.1 什么是MVC

MVC分别是model 模型,view视图,Controller控制器。

M表示业务模型,V表示用户界面,C表示控制器。使用MVC的目的是分离M和V的实现代码,以便同一程序可以使用不同的表达形式。

1.1.1 MVC架构程序的工作流程

(1) 用户通过查看页面向服务器发出请求,可以是表单请求、超链接请求、Ajax请求等
(2) 接收到请求后,服务器控制器解析请求,找到相应的模型,并处理用户请求
(3) 模型处理后,将处理结果提交给控制器
(4) 控制器接收到处理结果后,根据处理结果找到要发送回客户端的响应视图页面。页面呈现(数据填充)后,将其发送给客户端。

1.2 之前的MVC架构

用户直接访问控制层,控制层直接可以对数据库进行操作:servlet->CRUD(数据库的增删改查操作代码)->数据库

image-20220901161201204

缺点:

之前的MVC架构非常不利于维护,程序十分臃肿。servlet会承担很多功能的实现,比如处理请求响应,视图跳转,处理JDBC,业务代码和逻辑代码等等。

解决方案:

在架构里加一层,即可解决,如下解决方案:

1.2 MVC三层架构

image-20220901163315288

Model:

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

View:

  • 展示数据
  • 提供链接,发起请求,比如a链接,from链接等等。

Controller:

  • 接受用户的请求:req,拿到用户的请求参数,Session信息等等。
  • 交给业务层处理对应的代码。
  • 控制视图的跳转:过程如下:

    用户发起登录请求->Controller接受用户的登录请求—>处理用户的请求,比如获取到用户登录的参数(username,password等等)—>交给业务层处理登录业务(判断一下用户名和密码是否正确)—>DAO层查询用户名和密码是否正确—>数据库

    image-20220901165810992

二. 过滤器Filter

过滤器是指“过滤器”,它是客户端和服务器资源文件之间的过滤器。

在访问资源文件之前,通过一系列过滤器对请求进行修改和判断,对不符合规则的请求进行拦截或中途修改;还可以过滤、拦截或修改响应。

作用:用来过滤网站的数据。

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

image-20220901170324490

2.1 实战过程

1.新建idea工程项目,选择Maven新建,不选择模板,工程名为Filtergo。

2.到工程名文件夹下,选择添加新的框架,选择web框架,版本为4.0。现目录如下:

image-20220901210743086

3.使用过滤器Filter过程:

①导包:

导入Servlet依赖:

<dependency>
    <groupId>javax.servletgroupId>
    <artifactId>servlet-apiartifactId>
    <version>2.5version>
dependency>

导入JSP依赖:

<dependency>
    <groupId>javax.servlet.jspgroupId>
    <artifactId>javax.servlet.jsp-apiartifactId>
    <version>2.3.3version>
dependency>

导入JSTL表达式的依赖:

<dependency>
    <groupId>javax.servlet.jsp.jstlgroupId>
    <artifactId>jstl-apiartifactId>
    <version>1.2version>
dependency>

导入standard依赖:

<dependency>
    <groupId>taglibsgroupId>
    <artifactId>standardartifactId>
    <version>1.1.2version>
dependency>

连接数据库:

<dependency>
    <groupId>mysqlgroupId>
    <artifactId>mysql-connector-javaartifactId>
    <version>5.1.47version>
dependency>

②:编写过滤器:

1.新建一个接口类:com.zhu.servlet。继承implements,继承类:Filter

注意:一定不能选错,要选择下图的serclet:

image-20220901230014405

2.重写3个方法,方法介绍如下:

初始化方法:init

销毁方法:destroy()

主要的是重写doFilter方法,如下,我们先写一个输出中文,没有猜错的话会输出乱码,我们先配置注册一下url和对应的映射。

public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
    servletResponse.getWriter().write("你好,上进小菜猪!");
}

url和对应的映射:

<servlet>
    <servlet-name>showservletservlet-name>
    <servlet-class>com.zhu.servlet.showservletservlet-class>
servlet>
<servlet-mapping>
    <servlet-name>showservletservlet-name>
    <url-pattern>/serurl-pattern>
servlet-mapping>

配置web容器—tomcat

image-20220902130216169

3.新建一个Java类,类名为showservlet,继承doGet和doPost。

4.访问该url,不出意外应该会输出乱码:

image-20220902224808866

5.我们设置字符编码吗,这种情况可以处理小部分的字符编码:

resp.setCharacterEncoding("utf-8");

如果现在有一千个servlet,需要写一千个设置字符编码,显然不太合理,使用这个时候就是Filter的作用。

6.先写一个对于Filter的字符编码设定:

servletResponse.setCharacterEncoding("utf-8");
servletRequest.setCharacterEncoding("utf-8");
servletResponse.setContentType("text/html;charset=UTF-8");
servletResponse.getWriter().write("你好,上进小菜猪!");

7.Chain是一个链。

它的作用是,让我们的请求继续走,如果没有这个链的话,程序跑到这里就会被拦截停止。

System.out.println("执行前------------");
filterChain.doFilter(servletRequest,servletResponse);
System.out.println("执行后------------");

8.配置过滤

<filter>
    <filter-name>charcterfilter-name>
    <filter-class>main.java.charFilterfilter-class>
filter>
<filter-mapping>
    <filter-name>charcterfilter-name>
    <url-pattern>/school/*url-pattern>
filter-mapping>

观察上面这段代码,/school/*是指,所有的school之后的路径都会进行过滤。

那么我们为了区别它们,我设计了如下的路由注册和映射,如下:

<servlet>
    <servlet-name>school_demo5servlet-name>
    <servlet-class>main.java.Filterservlet-class>
servlet>
<servlet-mapping>
    <servlet-name>school_demo5servlet-name>
    <url-pattern>/school/s1url-pattern>
servlet-mapping>

<servlet>
    <servlet-name>school_dservlet-name>
    <servlet-class>main.java.Filterservlet-class>
servlet>
<servlet-mapping>
    <servlet-name>school_dservlet-name>
    <url-pattern>/s1url-pattern>
servlet-mapping>

如上路径/school/s1和路径/s1都指向了之前写的Filter类。

9.访问路径,观察测试结果如下:

image-20220903001145675

image-20220903001203900

10.可以看到我们访问school路径下的都会进行字符的过滤,避免了乱码问题,也是十分的高效和快捷。

2.2 总结

1.当项目启动的时候,就执行了初始化,可以随时的等待过滤对象的出现。

2.当关闭web服务的时候,就会执行销毁操作。

你可能感兴趣的:(mvc,架构,servlet,技术)