2010-04-23 62 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