@[toc]
MVC分别是model 模型,view视图,Controller控制器。
M表示业务模型,V表示用户界面,C表示控制器。使用MVC的目的是分离M和V的实现代码,以便同一程序可以使用不同的表达形式。
(1) 用户通过查看页面向服务器发出请求,可以是表单请求、超链接请求、Ajax请求等
(2) 接收到请求后,服务器控制器解析请求,找到相应的模型,并处理用户请求
(3) 模型处理后,将处理结果提交给控制器
(4) 控制器接收到处理结果后,根据处理结果找到要发送回客户端的响应视图页面。页面呈现(数据填充)后,将其发送给客户端。
用户直接访问控制层,控制层直接可以对数据库进行操作:servlet->CRUD(数据库的增删改查操作代码)->数据库
缺点:
之前的MVC架构非常不利于维护,程序十分臃肿。servlet会承担很多功能的实现,比如处理请求响应,视图跳转,处理JDBC,业务代码和逻辑代码等等。
解决方案:
在架构里加一层,即可解决,如下解决方案:
Model:
View:
Controller:
用户发起登录请求->Controller接受用户的登录请求—>处理用户的请求,比如获取到用户登录的参数(username,password等等)—>交给业务层处理登录业务(判断一下用户名和密码是否正确)—>DAO层查询用户名和密码是否正确—>数据库
过滤器是指“过滤器”,它是客户端和服务器资源文件之间的过滤器。
在访问资源文件之前,通过一系列过滤器对请求进行修改和判断,对不符合规则的请求进行拦截或中途修改;还可以过滤、拦截或修改响应。
作用:用来过滤网站的数据。
1.新建idea工程项目,选择Maven新建,不选择模板,工程名为Filtergo。
2.到工程名文件夹下,选择添加新的框架,选择web框架,版本为4.0。现目录如下:
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:
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
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>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.访问路径,观察测试结果如下:
10.可以看到我们访问school路径下的都会进行字符的过滤,避免了乱码问题,也是十分的高效和快捷。
1.当项目启动的时候,就执行了初始化,可以随时的等待过滤对象的出现。
2.当关闭web服务的时候,就会执行销毁操作。