多值属性的文本输入

时间:2010-04-23 17:19:54

标签: java jsf

我需要创建一个输入表单,允许用户为特定属性输入任意数量的值。

我尝试了几种方法,所有方法似乎都有各种程度的失败。最新的模型bean看起来像:

public class Product {
  private String name;
  private ArrayList<String> tags = new ArrayList(5);

  {
    tags.add("");  //seed with 1 non-null element
  }

  ...accessors...
}

输入字段如下所示:

    <h:dataTable id="tags" value="#{product.tags}" var="tag">
      <h:column><h:inputText id="t" value="#{tag}"></h:inputText></h:column>

我的计划是允许用户使用javascript根据需要添加其他表单字段。

这种类型的设置为我提供了“目标无法访问”错误。我错过了什么?

我现在的问题是没有调用标签的setter。奇怪的是,名字的设定者确实。

我在WebSphere 6.1上使用JSF 1.1

1 个答案:

答案 0 :(得分:1)

您需要自己预先实例化/保留任何非标准对象。 EL不会为您预先实例化它们。这适用于除StringNumberBoolean以外的任何内容,其中EL具有内置的识别和强制。不,您遇到的问题不包括像String[]这样的数组。

基本上应该做以下事情:

private String[] tags = new String[length];

你只需要将length作为<input type="hidden" name="length">传递,让JS填充它,,这样你就可以自己保留@PostConstruct对象:

<击>
@ManagedProperty(value="#{param.length}")
private int length;

@PostConstruct
public void init() {
    this.tags = new String[length];
}

更新:抱歉,以上内容仅适用于JSF 1.2或更新版本。那么,在你的情况下,你将不得不做一些hacky工作,如从ExternalContext#getRequestParameterMap()抓取它。还请记住,JavaScript没有看到JSF源代码中的任何内容,而只是看到它生成的HTML输出。在浏览器中右键单击页面,然后选择查看源。在编写JS时考虑到这一点。