Struts中文乱码问题解决
最近使用struts创建一个web应用程序的时候,被这个框架的中文乱码搞得不知东南西北了,因为web应用涉及到的编码问题确实是一个棘手的问题,因为这里面有JSP的编码、后台处理的编码问题,甚至还有数据库插入读取的编码问题,下面就这两天困扰我的并且通过我的实践解决的struts中文乱码进行详尽的说明。
① 前台JSP的中文对应:
首先介绍一下JSP上使用的两个编码语句
<%@ page language="java" import="java.util.*" ageEncoding="gb2312"%>
这里的pageEncoding指定JSP编译器在编译时已用gb2312进行编码。
<meta http-equiv="Content-Type" content="text/html; harset=gb2312">
这里的charset是HTTP相应时使用的编码,也就是IE会根据这个编码来进行相应的显示。
所与如果出现JSP显示乱码可能是上述两者的缘故。
根据我在后台进行一些信息打印处理,发现已经是乱码,所以这一定不是META标签的问题,所以在确认了pageEncoding是“gb2312”之后,我才进行了下述的处理。
② 因为struts内部通过utf-8进行编码,如果不进行相应的编码设置,就会导致在中文传输的过程中出现乱码。
创建一个MyRequestProcessor 类继承了struts的RequestProcessor 类,
package hello;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts.action.RequestProcessor;
public class MyRequestProcessor extends RequestProcessor {
public MyRequestProcessor() {}
protected boolean processPreprocess( HttpServletRequest request, HttpServletResponse response ){
try{
request.setCharacterEncoding("gb2312");
}
catch(Exception ex){
System.out.println("转换失败!");
}
return true;
}
}
③ 创建好之后,需要在struts-config.xml中进行相应的配置:
<struts-config>
<!-- ======== Form Bean Definitions =================================== -->
<form-beans>
<form-bean name="HelloForm" type="hello.HelloForm"/>
</form-beans>
<!-- ========== Action Mapping Definitions ============================== -->
<action-mappings>
<!-- Say Hello! -->
<action path = "/HelloWorld"
type = "hello.HelloAction"
name = "HelloForm"
scope = "request"
validate = "true"
input = "/hello.jsp"
>
<forward name="SayHello" path="/hello.jsp" />
</action>
</action-mappings>
<!-- ========== Message Resources Definitions =========================== -->
<controller processorClass="hello.MyRequestProcessor"></controller>
<message-resources parameter="hello.application"/>
</struts-config>
注意这里的<controller processorClass="hello.MyRequestProcessor"></controller>不要放在最后
到次为止,所有的工作都已经完成,剩下的只是进行运行了,注意一点,在能够进行编码设置的地方都设成中文编码始终是必要的。
网上有一些关于这个的解决方法,我在使用之后并不能达到效果,原因就在于我JSP上面的编码方式并不是gb2312,所以大家的解决的时候一定要注意这一点。
最近使用struts创建一个web应用程序的时候,被这个框架的中文乱码搞得不知东南西北了,因为web应用涉及到的编码问题确实是一个棘手的问题,因为这里面有JSP的编码、后台处理的编码问题,甚至还有数据库插入读取的编码问题,下面就这两天困扰我的并且通过我的实践解决的struts中文乱码进行详尽的说明。
① 前台JSP的中文对应:
首先介绍一下JSP上使用的两个编码语句
<%@ page language="java" import="java.util.*" ageEncoding="gb2312"%>
这里的pageEncoding指定JSP编译器在编译时已用gb2312进行编码。
<meta http-equiv="Content-Type" content="text/html; harset=gb2312">
这里的charset是HTTP相应时使用的编码,也就是IE会根据这个编码来进行相应的显示。
所与如果出现JSP显示乱码可能是上述两者的缘故。
根据我在后台进行一些信息打印处理,发现已经是乱码,所以这一定不是META标签的问题,所以在确认了pageEncoding是“gb2312”之后,我才进行了下述的处理。
② 因为struts内部通过utf-8进行编码,如果不进行相应的编码设置,就会导致在中文传输的过程中出现乱码。
创建一个MyRequestProcessor 类继承了struts的RequestProcessor 类,
package hello;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts.action.RequestProcessor;
public class MyRequestProcessor extends RequestProcessor {
public MyRequestProcessor() {}
protected boolean processPreprocess( HttpServletRequest request, HttpServletResponse response ){
try{
request.setCharacterEncoding("gb2312");
}
catch(Exception ex){
System.out.println("转换失败!");
}
return true;
}
}
③ 创建好之后,需要在struts-config.xml中进行相应的配置:
<struts-config>
<!-- ======== Form Bean Definitions =================================== -->
<form-beans>
<form-bean name="HelloForm" type="hello.HelloForm"/>
</form-beans>
<!-- ========== Action Mapping Definitions ============================== -->
<action-mappings>
<!-- Say Hello! -->
<action path = "/HelloWorld"
type = "hello.HelloAction"
name = "HelloForm"
scope = "request"
validate = "true"
input = "/hello.jsp"
>
<forward name="SayHello" path="/hello.jsp" />
</action>
</action-mappings>
<!-- ========== Message Resources Definitions =========================== -->
<controller processorClass="hello.MyRequestProcessor"></controller>
<message-resources parameter="hello.application"/>
</struts-config>
注意这里的<controller processorClass="hello.MyRequestProcessor"></controller>不要放在最后
到次为止,所有的工作都已经完成,剩下的只是进行运行了,注意一点,在能够进行编码设置的地方都设成中文编码始终是必要的。
网上有一些关于这个的解决方法,我在使用之后并不能达到效果,原因就在于我JSP上面的编码方式并不是gb2312,所以大家的解决的时候一定要注意这一点。