新建项目
1.在index.jsp中编写一个简单的界面,输入内容进行提交
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>$Title$</title>
</head>
<body>
<form action="/test" method="post">
<input type="text" name="value"/>
<input type="submit" name="提交"/>
</form>
</body>
</html>
2.在src目录下新建包,在包里新建TestServlet类
package com.shunde.servlet;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/test")
public class TestServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//req.setCharacterEncoding("UTF-8");
String value = (String) req.getParameter("value");
System.out.println(value);
}
}
3.编译运行
随意输入中文,点击提交
在IDEA中出现乱码
4.在TestServlet类中添加代码
req.setCharacterEncoding("UTF-8");
即可解决问题
5.新建login.jsp和LoginServlet类,写入相同的代码
同样会出现乱码问题,同样需要写入
req.setCharacterEncoding("UTF-8");
那么假设一个项目里有几百个这个的类呢?如果在每一个类里都写入req.setCharacterEncoding(“UTF-8”);这就会造成代码的重复。
这种情况下,就可以引入过滤器
过滤器
功能
1.用来拦截传入的请求和传出的响应
2.修改或以某种方式处理正在客户端和服务端之间交换的数据流
如何使用
与Servlet类似,Fliter是Java WEB提供的一个类,开发者只需要自定义一个类并实现该接口即可
1.以上面项目为基础
在src下新建一个包,包内新建一个类,在该类里实现Filter接口
package com.shunde.filter;
import javax.servlet.*;
import java.io.IOException;
public class CharacterFilter implements Filter {
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
servletRequest.setCharacterEncoding("UTE-8");
//将该代码写入过滤器中,表示将客户端传来的数据设置为UTF-8格式
filterChain.doFilter(servletRequest,servletResponse);
//在上面设置客户端传来的数据时,相当于是将这条请求数据截断了,
//在格式设置完毕之后,还需要将设置完毕之后的数据重新发往服务端
}
}
2.在web.xml文件中进行关联
在其中加入以下代码
<filter>
<filter-name>character</filter-name>
<filter-class>com.shunde.filter.CharacterFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>character</filter-name>
<url-pattern>/test</url-pattern>
//这里可以关联多个
<url-pattern>/test1</url-pattern>
<url-pattern>/test2</url-pattern>
<url-pattern>/test3</url-pattern>
</filter-mapping>
3.仔细观察
首先是通过"/test"将index.jsp文件和TestServlet类关联起来
之后又通过"/test"将CharacterFilter类关联起来
4.编译运行
这时候就通过Filter完成乱码处理的问题
5.当然也可以通过注解的方式进行关联
删除web.xml中添加的代码
在CharacterFilter类中添加注解
package com.shunde.filter;
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.annotation.WebServlet;
import java.io.IOException;
@WebFilter("/test")
//注解的方式关联
public class CharacterFilter implements Filter {
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
servletRequest.setCharacterEncoding("UTF-8");
filterChain.doFilter(servletRequest,servletResponse);
}
}
Filter的生命周期
1.当Tomcat启动时,通过反射机制调用Filter的无参构造函数创建实例化对象,同时调用init方法实现初始化
2.doFilter方法是调用多次的,当Tomcat服务关闭时,调用destory来销毁Filter对象
四个方法:
(1)无参构造方法:只调用一次,当Tomcat启动时调用(Filter一定要配置)
(2)init方法:只调用一次,当Filter的实例化对象创建完成之后调用
(3)doFilter方法:调用多次,访问Filter的业务逻辑都写在Filter中
(4)destory方法:只调用一次,Tomcat关闭时调用
多个Filter的调用顺序
同时配置多个Filter,Filter的调用顺序是由web.xml中配置顺序来决定的,写在上面的配置先调用
实际开发中Filter的使用场景
1.统一处理中文乱码
2.屏蔽敏感词汇
3.控制资源的访问权限