我遇到了一些问题,包括<s:url/>
struts2
标记中包含特殊字符的参数。
<s:form/>
内的参数,无论是隐藏字段还是显式字段都表现得很好,尽管有些字符可以有特殊字符,但是当我尝试附加包含特殊字符的任何参数时会遇到麻烦(在本例中为'é ')到struts2
网址并用它触发操作。
这是<s:url/>
:
<s:url var="urlRegular" action="fetchUserServices" escapeAmp="false">
<s:param name="username" value="%{username}" />
<s:param name="type" value="%{type}"/>
</s:url>
使用Eclipse进行调试,每当调用方法fetchUserServices
时,参数username
(应该是'cInglés')似乎存储为'cInglà ©s',因此我认为来自UTF-8
请求的HTTP
未正确解码。
在HTTP
请求中,我可以看到参数username
已编码并发送如下:
myPath/fetchUserServices.action?username=cIngl%C3%A9s&type=1
所以,在我看来,它已经从视图成功发送到控制器..
我也试过像这样指定username
参数,但没有运气:
<s:url var="urlRegular" action="fetchUserServices" escapeAmp="false">
<s:param name="username" >
<s:property value="%{username}" />
</s:param>
<s:param name="type" value="%{type}"/>
</s:url>
这只会改变它的行为方式,如果我使用那种表示法,那么param现在就像这样(XHR
请求)在url上编码:
myPath/fetchUserServices.action?username=%5BcIngl%26eacute%3Bs%5D&type=1
我的fetchUserServices
方法以这种方式接收它: cIngl&amp; \ eacute; s (没有'\',我必须使用它,因为此处使用的降价语言解码它作为cInglés)。
此时我有点迷失,我的所有页面都指定了UTF-8
编码,并且当他们进入<s:form />
标记时,带有特殊字符的参数不是问题。
如何修复此问题并在我的fetchUserServices
方法中解码参数?
问题更新:尝试使用Spring character encoding filter
建议使用class DELL {
public:
DELL() {
std::cout << "DELL constructor called\n";
}
~DELL() {
std::cout << "DELL destructor called\n";
}
};
,但它也不起作用。
答案 0 :(得分:1)
最后,我设法让它发挥作用。我所要做的就是在端口8080的连接器中指定URI编码,我的tomcat处理请求。
我使用的版本是tomcat7
,我所要做的只是添加URIEncoding = "UTF-8"
所以现在看起来像这样:
<Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443" URIEncoding="UTF-8"/>
此外,可以指定字符编码过滤器,例如,Spring
提供的过滤器。您所要做的就是将其添加为web.xml
中的第一个过滤器:
<filter>
<filter-name>encodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
这对我来说不是强制性的,因为仅声明URI编码已经解决,也不需要包含过滤器,但我已经通过网络阅读它可以提供帮助。
关于缺乏理解为什么它可以使用POST
个请求,而不是GET
个请求,我已经了解了POST
个请求单独指定字符编码,而其他人则不指定。引自tomcat apache wiki:
请求或响应的默认字符编码是什么 体吗
如果未指定字符编码,则为Servlet规范 要求使用ISO-8859-1的编码。人物 HTTP消息(请求或响应)的主体的编码是 在Content-Type标头字段中指定。这样一个例子 标题是Content-Type:text / html; charset = ISO-8859-1明确地说 说明正在使用默认值(ISO-8859-1)。
最后,有very elaborated answer here解决了这个问题,如果您需要更高级的帮助可以提供帮助(它涵盖了使用mysql
并且需要允许UTF-8
解码的问题太)