每当我们在Servlet中传递中文参数的时候总是会碰到乱码的问题,而通常的解决方式是在request请求进行解码处理,然后在response响应做编码处理:
request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
但是当业务复杂时,在Servlet中重复书写解码和编码的代码会十分繁琐,让代码看起来很臃肿。其实,可以通过Filter过滤器进行统一的解码编码处理。
一个简易的显示本地时间的小例子
FirstServlet.java代码:
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class FirstServlet extends javax.servlet.http.HttpServlet {
protected void doPost(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response) throws javax.servlet.ServletException, IOException {
Date date = new Date();
SimpleDateFormat formatter = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
String dateString = formatter.format(date);
String data=dateString;
request.setAttribute("data", data);
request.getRequestDispatcher("/show").forward(request, response);
}
protected void doGet(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response) throws javax.servlet.ServletException, IOException {
doPost(request,response);
}
}
ShowServlet.java代码:
import java.io.IOException;
import java.io.PrintWriter;
public class ShowServlet extends javax.servlet.http.HttpServlet {
protected void doPost(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response) throws javax.servlet.ServletException, IOException {
// 设置刷新自动加载的事件间隔为 3 秒
response.setIntHeader("Refresh", 3);
String text=(String)request.getAttribute("data");
PrintWriter out=response.getWriter();
out.write("本地时间(The time is):"+text+"(3秒后自动刷新)");
}
protected void doGet(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response) throws javax.servlet.ServletException, IOException {
doPost(request,response);
}
}
DemoFilter.java代码:
import java.io.IOException;
import javax.servlet.http.HttpServletRequest;
public class DemoFilter implements javax.servlet.Filter {
public void destroy() {
}
public void doFilter(javax.servlet.ServletRequest request, javax.servlet.ServletResponse response, javax.servlet.FilterChain chain) throws javax.servlet.ServletException, IOException {
request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
//获取URL的路径和参数
HttpServletRequest req = (HttpServletRequest) request;
String path=req.getServletPath();
String param=req.getQueryString();
if(path!=null&¶m!=null){
path=path+"?"+param;//全请求路径
}
System.out.println("Path:"+path);
//跳转或带参数跳转
request.getRequestDispatcher(path).forward(request, response);
}
public void init(javax.servlet.FilterConfig config) throws javax.servlet.ServletException {
}
}
web.xml配置文件:
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
version="3.1">
<filter>
<filter-name>DemoFilter</filter-name>
<filter-class>com.sunsharing.DemoFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>DemoFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<servlet>
<servlet-name>FirstServlet</servlet-name>
<servlet-class>com.sunsharing.FirstServlet</servlet-class>
</servlet>
<servlet>
<servlet-name>ShowServlet</servlet-name>
<servlet-class>com.sunsharing.ShowServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>FirstServlet</servlet-name>
<url-pattern>/first</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>ShowServlet</servlet-name>
<url-pattern>/show</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>
完毕后启动tomcat,在浏览器的url地址输入:localhost:8080/first
预览效果: