今晚在配置Struts2环境的时候,遇见了中文乱码啦。配置了struts.i18n.encoding和SetCharacterEncodingFilter还是不行,最后发现如下规律:

Struts2标签和EL表达式混合使用会导致乱码:

如图所示,如果s2标签的值用el表达式代替的话,会导致中文乱码。

中文乱码:<s:param name="el">${c.cname}</s:param>,但是如果${c.cname}直接在页面上显示出来的话,是不会乱码的!
中文正常:<s:param name="cname"><s:property value="cname"/></s:param>

注意查看浏览器地址栏,虽然值一样,但是编码后都不同了:

javawind.net

   xhtml代码
  1. <%@ page language="java" contentType="text/html; charset=utf-8"pageEncoding="utf-8"%> 
  2. <%@ taglib prefix="s" uri="/struts-tags" %> 
  3. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 
  4. <html> 
  5. <head> 
  6. <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> 
  7. <title>Insert title here</title> 
  8. </head> 
  9. <body> 
  10.  
  11. <s:iterator id="c" value="category"> 
  12.     <s:url id="url" action="index"> 
  13.         <s:param name="cid">${c.cid}</s:param> 
  14.         <s:param name="el">${c.cname}</s:param> 
  15.         <s:param name="cname"><s:property value="cname"/></s:param> 
  16.     </s:url> 
  17.     <s:a href="%{url}">${c.cid}.${c.cname}.<s:property value="cname"/></s:a> 
  18. </s:iterator> 
  19.  
  20. <br/><br/> 
  21. you chose:  
  22. cid=${param.cid}<br/> 
  23. el=${param.el}<br/> 
  24. cname=${param.cname}<br/> 
  25. </body> 
  26. </html>