请教下,struts2 的乱码问题,
1、jsp页面设置的编码是utf-8
[code=java]<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>[/code]
2、struts.xml
[code=java]
[/code]
3、在web.xml中加了filter
[code=java] public void doFilter(ServletRequest req, ServletResponse resp,
FilterChain arg2) throws IOException, ServletException {
// TODO Auto-generated method stub
HttpServletResponse response = (HttpServletResponse) resp;
HttpServletRequest request=(HttpServletRequest)req;
response.setContentType("text/html;charset=utf-8");
request.setCharacterEncoding("utf-8");
response.setCharacterEncoding("utf-8");
arg2.doFilter(request, response);
}
[/code]
4、mysql数据库中
[code=java][mysql]
default-character-set=utf8
character-set-server=utf8[/code]
5、tomcat 的 service.xml中
[code=java] connectionTimeout="20000"
redirectPort="8443" URIEncoding="UTF-8"/>[/code]
6、在console接收参数时后台打印的也正常,包括构造sql语句的输出也是正常的,但是在struts的调试模式还是存在乱码,,崩溃中!!!!!!
[img=http://img.my.csdn.net/uploads/201212/07/1354871421_9159.png][/img]
这是因为org.apache.struts2.dispatcher.Dispatcher的sendError实现问题
[code="java"]if (devModeOverride != null ? devModeOverride : devMode) {
response.setContentType("text/html");
try {
FreemarkerManager mgr = getContainer().getInstance(FreemarkerManager.class);
freemarker.template.Configuration config = mgr.getConfiguration(ctx);
Template template = config.getTemplate("/org/apache/struts2/dispatcher/error.ftl");
List<Throwable> chain = new ArrayList<Throwable>();
Throwable cur = e;
chain.add(cur);
while ((cur = cur.getCause()) != null) {
chain.add(cur);
}
HashMap<String,Object> data = new HashMap<String,Object>();
data.put("exception", e);
data.put("unknown", Location.UNKNOWN);
data.put("chain", chain);
data.put("locator", new Locator());
template.process(data, response.getWriter());
response.getWriter().close();
} catch (Exception exp) {
try {
response.sendError(code, "Unable to show problem report: " + exp);
} catch (IOException ex) {
// we're already sending an error, not much else we can do if more stuff breaks
}
}
}[/code]
没有设置响应编码造成的,可以在try catch异常,如果有错误 先通过
ServletActionContext.getResponse().setCharacterEncoding("UTF-8"); 设置编码
解决方案是:
1、覆盖FilterDispatcher实现 覆盖createDispatcher 返回一个自定义的Dispatcher
2、该自定义Dispatcher 覆盖sendError 并在发送错误之前设置编码
传入到后台有问题,那么应该在前台-》后台这个提交过程中,看有没有乱码
可以debug 可以在火狐下firedebug 看post参数的值。
我想问题应该在前台-》后台这个传输过程中出出问题了