问题描述
请教下,struts2 的乱码问题,1、jsp页面设置的编码是utf-8[code=java]<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>2、struts.xml[code=java]<constant name="struts.i18n.encoding" value="utf-8"></constant><constant name="struts.locale" value="zh_CN"></constant>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); }4、mysql数据库中[code=java][mysql]default-character-set=utf8character-set-server=utf85、tomcat 的 service.xml中[code=java] <Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" URIEncoding="UTF-8"/>6、在console接收参数时后台打印的也正常,包括构造sql语句的输出也是正常的,但是在struts的调试模式还是存在乱码,,崩溃中!!!!!![img=http://img.my.csdn.net/uploads/201212/07/1354871421_9159.png][/img]
解决方案
这是因为org.apache.struts2.dispatcher.Dispatcher的sendError实现问题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 } } }没有设置响应编码造成的,可以在try catch异常,如果有错误 先通过ServletActionContext.getResponse().setCharacterEncoding("UTF-8"); 设置编码解决方案是:1、覆盖FilterDispatcher实现 覆盖createDispatcher 返回一个自定义的Dispatcher2、该自定义Dispatcher 覆盖sendError 并在发送错误之前设置编码
解决方案二:
传入到后台有问题,那么应该在前台-》后台这个提交过程中,看有没有乱码可以debug 可以在火狐下firedebug 看post参数的值。我想问题应该在前台-》后台这个传输过程中出出问题了