一.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(数据库的增删改查操作代码)->数据库
缺点:
之前的MVC架构非常不利于维护,程序十分臃肿。servlet会承担很多功能的实现,比如处理请求响应,视图跳转,处理JDBC,业务代码和逻辑代码等等。
解决方案:
在架构里加一层,即可解决,如下解决方案:
1.2 MVC三层架构
Model:
- 业务处理:业务逻辑(service)
- 数据持久层:CRUD(DAO层)
View:
- 展示数据
- 提供链接,发起请求,比如a链接,from链接等等。
Controller:
-
接受用户的请求:req,拿到用户的请求参数,Session信息等等。
-
交给业务层处理对应的代码。
-
控制视图的跳转:过程如下:
用户发起登录请求->Controller接受用户的登录请求—>处理用户的请求,比如获取到用户登录的参数(username,password等等)—>交给业务层处理登录业务(判断一下用户名和密码是否正确)—>DAO层查询用户名和密码是否正确—>数据库
二. 过滤器Filter
过滤器是指“过滤器”,它是客户端和服务器资源文件之间的过滤器。
在访问资源文件之前,通过一系列过滤器对请求进行修改和判断,对不符合规则的请求进行拦截或中途修改;还可以过滤、拦截或修改响应。
作用:用来过滤网站的数据。
- 处理中文乱码
- 登录验证等等
2.1 实战过程
1.新建idea工程项目,选择Maven新建,不选择模板,工程名为Filtergo。
2.到工程名文件夹下,选择添加新的框架,选择web框架,版本为4.0。现目录如下:
3.使用过滤器Filter过程:
①导包:
导入Servlet依赖:
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
</dependency>
导入JSP依赖:
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>javax.servlet.jsp-api</artifactId>
<version>2.3.3</version>
</dependency>
导入JSTL表达式的依赖:
<dependency>
<groupId>javax.servlet.jsp.jstl</groupId>
<artifactId>jstl-api</artifactId>
<version>1.2</version>
</dependency>
导入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>
②:编写过滤器:
1.新建一个接口类:com.zhu.servlet。继承implements,继承类:Filter
注意:一定不能选错,要选择下图的serclet:
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>showservlet</servlet-name>
<servlet-class>com.zhu.servlet.showservlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>showservlet</servlet-name>
<url-pattern>/ser</url-pattern>
</servlet-mapping>
配置web容器—tomcat
3.新建一个Java类,类名为showservlet,继承doGet和doPost。
4.访问该url,不出意外应该会输出乱码:
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>charcter</filter-name>
<filter-class>main.java.charFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>charcter</filter-name>
<url-pattern>/school/*</url-pattern>
</filter-mapping>
观察上面这段代码,/school/*是指,所有的school之后的路径都会进行过滤。
那么我们为了区别它们,我设计了如下的路由注册和映射,如下:
<servlet>
<servlet-name>school_demo5</servlet-name>
<servlet-class>main.java.Filter</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>school_demo5</servlet-name>
<url-pattern>/school/s1</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>school_d</servlet-name>
<servlet-class>main.java.Filter</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>school_d</servlet-name>
<url-pattern>/s1</url-pattern>
</servlet-mapping>
如上路径/school/s1和路径/s1都指向了之前写的Filter类。
9.访问路径,观察测试结果如下:
10.可以看到我们访问school路径下的都会进行字符的过滤,避免了乱码问题,也是十分的高效和快捷。
2.2 总结
1.当项目启动的时候,就执行了初始化,可以随时的等待过滤对象的出现。
2.当关闭web服务的时候,就会执行销毁操作。