我对网址传递的参数有疑问。
请说请求是:/struts/MyAction.action?param=foo%40bar.com
操作字段将“param”字段设置为“foo%40bar.com”, 这是一个bug还是我对Struts的期望过高?
我的直觉告诉我,我应该得到值:“foo@bar.com”,例如,如果我将该参数作为POST表单字段传递,就会发生。
我正在使用默认的拦截器堆栈,我的操作类扩展了ActionSupport。我在WebSphere6.1&上得到了一些行为。 GlassFish2.1。
由于
嗨再次,
问题是由代理实现中的错误引起的。我们编写了一个站在Web应用程序前面的自定义代理服务器。它是第二次编码URL参数,这就是为什么在Struts我有%40而不是@。 Bug现已修复,参数正确传递。
感谢您的帮助
答案 0 :(得分:2)
我认为Struts2不负责解码参数,而是认为servlet容器是例如。 Tomcat,Jetty等。
答案 1 :(得分:1)
你的直觉是对的,你应该得到“foo@bar.com”。通过struts版本2.0.14的以下测试,我可以输入!@#$#$ ^ $&%#$%&进入一个from并在另一个页面上显示它而没有问题。
我测试了一个带有字符串形式的裸骨架struts 2.0.14应用程序:
<s:form action="form-view.action" method="GET">
<s:textfield label="email" name="email"/>
<s:submit/>
</s:form>
基本操作类(在此版本中使用stuts2注释,您不需要setter / getters):
package struts2;
import com.opensymphony.xwork2.ActionSupport;
public class FormViewAction extends ActionSupport{
public String email;
}
一个非常基本的显示页面,其中包含:
<s:property value="email"/>
这是struts.xml:
<struts>
<constant name="struts.enable.DynamicMethodInvocation" value="false" />
<constant name="struts.devMode" value="true" />
<package namespace="" name="example" extends="struts-default">
<action name="form-view" class="struts2.FormViewAction">
<result>/form-view.jsp</result>
</action>
</package>
</struts>
必定存在配置问题......您是否正在使用maven构建?为什么使用版本2.0.14而不是2.2.1?就这一点而言,我将测试应用程序从2.2.1降级到2.0.14,这花费了我大约5分钟的时间。我不认为升级到当前版本有任何严重的障碍,它将为您提供最新的文档。
我在Glassfish 3.0.1上运行了这个。
如果您没有使用maven构建,请列出库中的jar,web.xml和struts.xml文件,如果可能的话,列出最小的form.jsp,display.jsp和Action类来重现该问题。
答案 2 :(得分:0)
参数有什么问题?你希望将param字段设置为什么?
如果您希望将Action属性转换为与Struts相同的方式,则可以编写自定义类型转换器。
答案 3 :(得分:0)
如rado所示,Servlet容器负责解码HttpServletRequest
中的参数值。如果您的值未进行URL解码,则表示某些内容已关闭。
Servlet Tutorial: Handling Form Data
首先,您使用的是哪个版本的Servlet API? 2.5? 2.4?您是否在web.xml中为您使用的版本定义了正确的XSD架构?另外,请检查您使用的版本是否与应用程序服务器提供的版本匹配。