Struts1.X
在接收客户请求录入数据时,可能会接收到中文乱码。 普通的request.setCharacterEncoding("GB18030");起不了作用。必须在web.xml中作为struts入口的ActionServlet作为突破口。重写这个类中的process()方法
如下:
1、新建一个包com.wjq.struts.ActionServlet,在com.wjq.struts.ActionServlet包中新建一个类
EncodeActionServlet.java这个类继承ActionServlet重写基类ActionServlet中的Void process(request,response) EncodeActionServlet.java
Public class EncodeActionServlet extends ActionServlet{
@Override
protected void process (HttpServletRequest request,HttpServletResponse response) throws IOException, ServletException {
request.setCharacterEncoding("GB2312"); // 进行统一的中文转码
super.process(request, response);
}
}
<servlet>
<servlet-name>action</servlet-name>
<!--将原来的servlet-class的值覆盖掉。即改为自己新建的EncodeActionServlet(完整值为:
com.wjq.struts.ActionServlet.EncodeActionServlet)
--> <servlet-class>com.wjq.struts.ActionServlet.EncodeActionServlet</servlet-class>
<init-param>
<param-name>config</param-name>
<param-value>/WEB-INF/struts-config.xml</param-value>
</init-param>
<init-param>
<param-name>debug</param-name>
<param-value>3</param-value>
</init-param>
<init-param>
<param-name>detail</param-name>
<param-value>3</param-value>
</init-param>
<load-on-startup>0</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>action</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
Struts2.X
由于web.xml中的Struts是通过过滤器来接收数据的,可以看做浏览器将请求发送到服务器(web.xml)处理,将相应的请求发送给相应的方法处理,而对字符没有处理。 这是它通过过滤器将请求发送给struts.xml。 所以在struts.xml调用相应action的时候,就必须将数据字符编码处理好。
所以在struts.xml中在<package>标签前应加上<constant>
如下:红字部分
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "http://struts.apache.org/dtds/struts-2.1.dtd">
<struts>
<constant name="struts.i18n.encoding" value="GB18030"/>
<include file="struts-default.xml"/>
<package name="example" extends="struts-default">
<action name="helloworld" class="com.wjq.HelloWorld">
<result>/HelloWorld.jsp</result>
</action>
<!-- Add your actions here -->
</package>
</struts>