2010-04-23 65 views
1

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

我尝试了几种方法,所有这些方法似乎都有各种级别的故障。最新的模型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来添加根据需要添加表单字段。

这种类型的设置给了我一个'Target Unreachable'错误。我错过了什么?

我现在的问题是标记的setter不会被调用。奇怪的是,名字的确定者。

我使用JSF 1.1的WebSphere 6.1

回答

1

您需要preinstantiate /保留任何非标准对象自己。 EL不会为你预设它们。这适用于EL具有内置识别和强制的StringNumberBoolean以外的任何内容。不,像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时考虑到这一点。

+0

BalusC,在你的帮助下,我已经能够走得更远一点。但是,我遇到了一个新问题。我已经删除了支持通过JS添加文本字段的逻辑,唯一的事情就是弄清楚为什么托管视图没有被表单更新。我已经在上面相应更新了。 – Sean 2010-04-26 15:42:28

+0

长话短说:http://balusc.blogspot.com/2006/06/using-datatables.html#AddNewRowsToDatatable – BalusC 2010-04-26 15:47:58

+0

该部分有意义,但是我仍然无法获取托管bean中的setTags以执行(setName执行) 。我在日志中看不到任何例外;并且请求确实包含我为标签输入的内容。 我对jsf请求生命周期的理解是,视图首先被恢复(执行获取托管bean),然后应用请求值(执行集合)。我觉得我错过了一些东西,但不知道是什么。 呈现的输入标记看起来像这样: Sean 2010-04-26 21:22:58