大家好,又见面了,我是你们的朋友全栈君。
<% request.setCharacterEncoding("GB18030") %>
在服务端解析客户端的编码设置(即服务器接收浏览器发送的数据),采用GB18030的方式,但是这样有一点不好,如果我有1000个页面(.jsp)需要设置需要重复写这样的语句1000条,重复工作,针对此问题的解决,下面给出了解决方案
<%@ page language="java" contentType="text/html; charset=GB18030" pageEncoding="GB18030"%>
客户端解析服务端返回的数据的编码方式(即浏览器呈现的页面的编码方式),如果一个.html 想改为.jsp,必须添加此句
public class CharsetEncodingFilter implements Filter {
private String encoding="";
@Override
public void destroy() {
// TODO Auto-generated method stub
}
@Override
public void doFilter(ServletRequest request, ServletResponse response,FilterChain chain) throws IOException, ServletException {
//设置字符集,拦截request请求
request.setCharacterEncoding(this.encoding);
//继续往下执行,这体现了职责链模式
chain.doFilter(request, response);
}
@Override
public void init(FilterConfig filterConfig) throws ServletException {
//初始化时,通过参数读取filter的配置文件的value值,即读取设置的编码方式
this.encoding = filterConfig.getInitParameter("encoding");
}
}
需要注意的几点:
<filter>
<filter-name>CharsetEncodingFilter</filter-name>
<filter-class>com.bjpowernode.drp.util.filter.CharsetEncodingFilter</filter-class> <!-- 具体的类路径 -->
<init-param>
<param-name>encoding</param-name>
<param-value>GBK</param-value>
<!-- 体现了键值对,设置参数,在filter类中可根据encodign参数,取值GBK -->
</init-param>
</filter>
<filter-mapping>
<!-- 对所有的.jsp起作用-->
<url-pattern>*.jsp</url-pattern>
</filter-mapping>
如果想对别的文件也起作用:再添一个映射即可
<filter-mapping>
<filter-name>CharsetEncodingFilter</filter-name>
<url-pattern>/servlet/*</url-pattern>
</filter-mapping>
匹配文件的一种写法:
*.jsp
*
,如/servlet/*,但不能写/servlet/*.jsp
这样不用在每个.jsp中设置了,每次在请求服务端时,都会先走Filter,设置一下编码
上面提到,Filter只对Post提交起作用,那么当Get提交时,怎么设置那,难道只能每个.jsp都要写一遍吗,当然不是,
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" URIEncoding="GB18030"/>
response.sendRedirect(request.getContextPath() + "/item_maint.jsp?errorMessage=" + URLEncoder.encode(errorMessage,"GB18030"));
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/156987.html原文链接:https://javaforall.cn