【问题标题】:Capturing variable number of fields in JSP/Struts bean在 JSP/Struts bean 中捕获可变数量的字段
【发布时间】:2017-08-29 18:26:49
【问题描述】:

我正在使用一个基于 JSP 的框架(由公司员工编写;它基于/扩展 Struts2),它使用 bean 来获取表单数据。相当标准的东西。

例如,给定这个标记:

<input name="foo" type="text" />

在某些时候,框架将获得我给它的 JavaBean 实例,并在页面加载时尝试调用 bean.getFoo() 并期望它返回一个 String,然后将其设置为值输入字段。

然后,当页面保存时,它会在框架中的某处获取提交给<form> 元素的值,并调用bean.setFoo(String val) 并将该值作为参数传递。

该框架还支持基于模板动态生成可变数量的字段。一旦你通过了所有的 JSP 代码,它就会生成如下 HTML:

<input name="foo_1" type="text" />
<input name="foo_2" type="text" />
<input name="foo_3" type="text" />

自然,它会尝试调用bean.setFoo_1(String val)bean.setFoo_2(String val)bean.setFoo_3(String val) 等,以获取页面上尽可能多的模式实例。

可能出现的次数实际上是无限的(而且肯定足够大,以至于手动创建所有可能的实例非常无聊)。所以我正在寻找某种动态 bean 类,它允许框架调用这些 getter 和 setter 并发现,你瞧,它们实际上作为 getter/setter 公共方法存在于框架正在处理的对象实例上。大概它使用反射来确定方法是否存在。

有什么方法可以实现(或使用现有库)而不是编写类似下面的内容? :

public class MyBean {

  private String foo_1;
  private String foo_2;
  private String foo_3;
  private String foo_4;
  private String foo_5; 
  // 30 years later ...
  private String foo_2147483647;

  // Eclipse -> Generate getters and setters... for all 2167483647 of the above and watch it crash OOM because I have so many fields
}

【问题讨论】:

  • 我个人认为,如果您的 bean 有这么多字段,那么应用程序设计错误。哪个用户真正希望在他们的输入屏幕上看到这么多字段?但是,不,我没有适合您的现有框架。也许必须自己动手,但首先我会自己质疑这些课程的设计。
  • 除非他们选择添加那么多字段,否则用户不会同时在屏幕上看到那么多字段。典型的例子是一个可编辑的“表格”,您可以在其中添加新行,并在每列的文本字段中输入值。问题是我无法预期用户合理期望的最大数量。在实践中,它可能会在 100 左右,但同样,只有在用户开始创建那么多时才会显示它们。它实际上是从一张空桌子开始的。在我的 bean 中创建 foo_100 仍然很丑。
  • 但是你没有豆子。如果字段的数量是可变的,则可以使用可变的东西,例如 ArrayList。不要尝试为每个可能的字段输入实现一个具有一个字段的类。这太疯狂了。
  • 这就是问题所在:框架似乎无法识别使用 List&lt;String&gt;String[] 的 bean 数据类型。它尝试将 bean 值强制转换为 String 并引发异常,但是由于 throwException 方法将其转换为 RuntimeException 或其他东西,因此到违规调用的实际站点的堆栈跟踪丢失了。所以我不知道它在哪里做那个演员。 ;x

标签: java jsp struts2 javabeans


【解决方案1】:

只要把表格做成这样:

<input type="text" name="foo" value="apple"/>
<input type="text" name="foo" value="banana"/>
<input type="text" name="foo" value="grapefruit"/>

并在行动中创建一个数学setFoo(String[] foos);

【讨论】:

    猜你喜欢
    • 2014-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-12
    相关资源
    最近更新 更多