今晚在配置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>
注意查看浏览器地址栏,虽然值一样,但是编码后都不同了:
- <%@ page language="java" contentType="text/html; charset=utf-8"pageEncoding="utf-8"%>
- <%@ taglib prefix="s" uri="/struts-tags" %>
- <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
- <html>
- <head>
- <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
- <title>Insert title here</title>
- </head>
- <body>
- <s:iterator id="c" value="category">
- <s:url id="url" action="index">
- <s:param name="cid">${c.cid}</s:param>
- <s:param name="el">${c.cname}</s:param>
- <s:param name="cname"><s:property value="cname"/></s:param>
- </s:url>
- <s:a href="%{url}">${c.cid}.${c.cname}.<s:property value="cname"/></s:a>
- </s:iterator>
- <br/><br/>
- you chose:
- cid=${param.cid}<br/>
- el=${param.el}<br/>
- cname=${param.cname}<br/>
- </body>
- </html>