我需要创建一个输入表单,允许用户为特定属性输入任意数量的值。
我尝试了几种方法,所有方法似乎都有各种程度的失败。最新的模型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
答案 0 :(得分:1)
您需要自己预先实例化/保留任何非标准对象。 EL不会为您预先实例化它们。这适用于除String
,Number
和Boolean
以外的任何内容,其中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时考虑到这一点。