【问题标题】:Strange issue with Struts 2 form handlingStruts 2 表单处理的奇怪问题
【发布时间】:2013-09-13 08:11:23
【问题描述】:

我正在测试如果我在操作中设置了一个整数字段,并且有人试图为其提供 String 值会发生什么。

例如:

public class FooAction extends ActionSupport
{
   private Integer foo;
   public Integer getFoo() 
   { ... }

   public void setFoo(Integer foo)
   {... }

   public String execute()
   {
      System.out.println( foo );
      return SUCCESS;
   }
}

如果我创建以下表单并尝试提交:

<form method="post" action="/foo.action">
  <input type="text" name="foo" />
  <input type="submit" value="go" />
</form>

然后,如果我在文本框中只提供一个数字,它就可以正常工作。

但是,如果我在文本框中提供诸如“bar”之类的字符串,则会发生以下情况:

1) 在 IDE 的输出窗口中,我看到有关尝试将字符串值设置为整数字段的异常警告。

2) 紧接着,我看到'null' 是foo 的值。

3)但是,奇怪的是,在我设置为在提交表单时显示的 .jsp 文件中,我有以下行:

<h2><s:property value="foo" /></h2>

jsp 的这一行的输出是 bar(这是我在表单中输入的),即使 foo 字段是整数并且我在尝试输出时在输出窗口中得到了 null .

谁能解释一下这笔交易是什么?

【问题讨论】:

  • 所以基本上你会返回成功,即使没有。我猜请求参数设置正确但转换失败
  • @user2310289 是的,仅用于调试目的。但是我不明白的是,在.jsp文件中,怎么会在action中显示foo的字符串值,却显示为null呢?
  • @user2310289 顺便说一句,即使我返回错误,我仍然会在控制台中看到有关异常的警告(因此它仍然尝试将字符串值分配给整数字段),如果我使用相同的.jsp 为错误结果,它仍然输出foo的字符串值
  • 明确一点,请求中的每个参数都是一个String。 Struts 2 有一组默认转换器,可以在您不知情的情况下管理到您的操作属性的基本转换。检查以下网址:struts.apache.org/release/2.3.x/docs/type-conversion.html
  • 顺便说一句,谁对这个问题投了反对票。这是一个合理的问题,因为在 struts 2 的幕后发生了很多事情。

标签: java jsp struts2


【解决方案1】:

您的堆栈中可能有 conversionError 拦截器。

这是来自javadoc的sn-p

此外,任何包含验证错误的字段都会保存其原始值,以便对该值的任何后续请求都返回原始值而不是操作中的值。这很重要,因为如果提交了值“abc”并且无法转换为 int,我们希望再次显示原始字符串(“abc”)而不是 int 值(可能为 0,这没有什么意义给用户)。

【讨论】:

  • 一定是这个。我没有设置拦截器,所以它必须默认调用那个拦截器。
  • 这个拦截器在 struts 默认栈上,所以它可能来自那里。
猜你喜欢
  • 2015-01-27
  • 2017-07-19
  • 2013-12-27
  • 2011-03-23
  • 2012-07-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多