1

我在 url 中传递的参数有问题。

假设请求是:/struts/MyAction.action?param=foo%40bar.com

action 字段将“param”字段设置为“foo%40bar.com”,这是一个错误还是我对 Struts 的期望过高?

我的直觉告诉我应该得到这个值:“foo@bar.com”,例如,如果我将该参数作为 POST 表单字段传递,就会发生这种情况。

我正在使用默认拦截器堆栈,并且我的操作类扩展了 ActionSupport。我在 WebSphere6.1 和 GlassFish2.1 上得到了一些行为。

谢谢


你好,我们又见面了,

该问题是由代理实现中的错误引起的。我们编写了一个自定义代理服务器,它位于 Web 应用程序的前面。它第二次对 URL 参数进行编码,这就是为什么在 Struts 中我使用 %40 而不是 @。现在已经修复了错误,并且参数正在正确传递。

感谢你的帮助

4

4 回答 4

2

我不认为 Struts2 负责解码参数,而是 servlet 容器是例如 Tomcat、Jetty 等。

于 2010-12-10T22:47:11.613 回答
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/getter):

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 构建,请列出您的库中的 jars、您的 web.xml 和 struts.xml 文件,如果可能的话,列出最小的 form.jsp、display.jsp 和一个 Action 类来重现该问题。

于 2010-12-14T01:41:30.433 回答
0

你的参数有什么问题?您希望将 param 字段设置为什么?

如果您希望将 Action 属性转换为与 Struts 不同的方式,您可以编写自定义类型转换器。

于 2010-12-10T23:34:39.080 回答
0

正如 rado 所指出的,Servlet 容器负责解码HttpServletRequest. 如果您的值没有被 URL 解码,那么有些东西是关闭的。

Servlet 教程:处理表单数据

首先,您使用的是哪个版本的 Servlet API?2.5?2.4?您是否在 web.xml 中为您使用的版本定义了正确的 XSD 架构?此外,请检查您使用的版本是否与您的应用程序服务器提供的版本相匹配。

于 2010-12-14T03:52:37.500 回答