2013-07-12 52 views
2

我最近遇到了一個案例,我想使用<h:inputHidden="#{v.index}/>來設置ui:repeat varStatus="v"的索引值。如果您嘗試使用AJAX組件並使用execute,則會得到該屬性不可寫入的異常。在四處張望的時候,我發現inputHidden支持readonly="true"屬性,這隻會導致錯誤消失。爲什麼InputHidden readonly屬性不在JSF文檔中?

有沒有原因,這是不是在文檔? (即特殊,直通,其他) 使用安全嗎?

+1

只要使用''?爲什麼它必須是JSF組件本身? – BalusC

+0

除了好奇之外,我沒有很好的理由。我明白,如果我將它標記爲只讀,那麼不需要爲它使用JSF。另一方面,我可以想到許多使用EL使用'readonly'的用例,並且很好奇它爲什麼沒有記錄在任何地方? –

回答

3

做一些挖掘Core JavaServer Faces 3e後是這樣說的:

的H:inputHidden標籤具有相同的屬性其他輸入標籤,不同的是它不支持標準的HTML和DHTML標籤

所以,爲什麼readonly不在inputHidden的文檔中,以及爲什麼它不在HTML中呈現是因爲inputHidden不支持它。當我嘗試將readonly作爲屬性添加到inputHidden'(帶有錯誤消息的紅色波浪線)時,Netbeans也證實了這一點。當我提交了一個沒有爲我的bean屬性定義的setter的表單時,我可以得到這個異常,該表單位於inputHidden中。由於inputHidden調用時表單提交(我的情況)的setter,並因爲沒有在我的代碼定義,它當然會拋出異常,即:

javax.el.PropertyNotWritableException: /index.xhtml @14,56 value="#{bean.x}": The class 'Bean' does not have a writable property 'x'. 

至於爲什麼當你這樣做,它的工作原理我不知道。既然你擔心安全問題,我建議你按照BalusC的說法做,只需使用<input type="hidden">或者你爲該屬性定義setter。不要那樣使用它。

+0

感謝您花時間回答。我檢查了生成的HTML,它看起來不是傳遞屬性,因爲它沒有在HTML上呈現。我可以想象,只有兩種方式可以讓設置程序不被調用,如果html沒有將它包含在窗體中(無法用html呈現)或JSF讀取屬性並跳過'setValue'。 setter不可用的原因是我綁定了我不控制的'ui:repeat''varStatus.index'(不設置)並且不想設置。我的關鍵問題是爲什麼無法在JSF文檔中找到它? –

+0

@johnd你的意思是[this](http://docs.oracle.com/cd/E17802_01/j2ee/javaee/javaserverfaces/1.2_MR1/docs/tlddocs/index.html)?我不知道,但似乎只有文檔只包含JSF特定的屬性。我在答案中的鏈接顯示了所有的HTML輸入屬性和只讀屬性。我在想JSF只是通過不調用'setter'來模擬'readonly'的功能,但是你必須在JSF輸入組件上指定它。 – Andy

+0

是的,但[JSF 2.2](http://docs.oracle.com/javaee/7/javaserverfaces/2.2/vdldocs/facelets/)版本。它似乎在'inputText'中,但不在'inputHidden'中,雖然它對它很好。不調用setter正是我想要做的,但是我不知道是否可以安全地使用它,好像它不在這些文檔中,它可能會被我棄用,或者在例如。 MyFaces –

相關問題