struts2 乱码问题

请教下,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]

2个回答

这是因为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参数的值。
我想问题应该在前台-》后台这个传输过程中出出问题了

iteye_5246
iteye_5246 进入到action中乱码了。那么把配置改下。 <constant name="struts.i18n.encoding" value="utf-8"></constant> <constant name="struts.locale" value="zh_CN"> 删了。
大约 7 年之前 回复
weixin_42502453
weixin_42502453 前台到后台的过程中是没有乱码的,在console中显示的是正常的,在调试的过程中,貌似只进入到struts中才出现的乱码,就是不知道哪出了问题。
大约 7 年之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问