2012-09-18 12 views
6

this question中所述,我嘗試在支持bean一側的表單中執行一些字段驗證。爲此,我想訪問違反字段來標記它們。 從網上搜索似乎有是兩種方法可以做到這一點:在支持Bean組件綁定vs findComponent() - 何時使用哪個?

  • 店組件的訪問,並通過binding屬性JSF頁面中使用它們。
  • 使用標準值在JSF頁面綁定並需要獲得從bean一個組件時,通過UIViewRoot.findComponent(String id)

關注一下吧至於我可以看到兩種方式也有缺點: 組件綁定炸燬用變量和getter/setter支持bean,一些站點完全不鼓勵使用組件綁定。無論如何,建議請求範圍。另一方面,findComponent()總是遍歷樹,這可能是昂貴的,對不對? (另外,目前我根本找不到我的組件,但那是另一個問題)

哪一條路要走?根據您選擇的標準,這些可互換的替代方案是否可行?目前我只是沒有足夠的洞察力做出一個體面的決定......

+0

同樣的問題在[這個其他論壇](http://www.jguru.com/forums/view.jsp?EID = 1522894#),但很可惜,沒有答案;) – Louise

回答

8

首先,無論選擇什麼,兩者都是一個不好的做法。另請參閱How does the 'binding' attribute work in JSF? When and how should it be used?

如果必須做出選擇,組件綁定肯定會更快,更便宜。從邏輯上講,完全意識到UIComponent#findComponent()所做的樹掃描具有其性能影響。

事實上,支持bean持有組件綁定必須是請求範圍,但你可以輕鬆地將不同範圍的支持bean通過@ManagedProperty持有它的業務邏輯。

更簡潔的方法是使用Map作爲所有組件綁定的持有者。你只需要在以下條目添加到faces-config.xml

<managed-bean> 
    <managed-bean-name>components</managed-bean-name> 
    <managed-bean-class>java.util.HashMap</managed-bean-class> 
    <managed-bean-scope>request</managed-bean-scope> 
</managed-bean> 

這正好可以作爲

<h:inputSome binding="#{components.input1}" /> 
<h:inputSome binding="#{components.input2}" /> 
<h:inputSome binding="#{components.input3}" /> 

,並能在其他豆類

Map<String, UIComponent> components = (Map<String, UIComponent>) externalContext.getRequestMap().get("components"); 

這樣你可以得到不需要擔心指定單個屬性/ getter/setter。在上面的示例中,Map將包含三個條目,其中鍵爲input1,input2input3,每個條目的值都爲UIComponent


無關的具體問題,如你在其他問題不是執行的操作方法的驗證(這實際上是糟糕的設計)描述有可能是一個更簡單的解決具體問題。我已經在那裏發佈了答案。

+0

豈不是正常使用性質的粘合劑是不是一個好的做法。在這種情況下,我們應該更喜歡組件綁定? – benz

+0

我並不是想暗示這一點。使用組件值綁定應該是首選,但這是超出你目前的問題,對吧? – BalusC

+0

這是正確的。我看到了問題和想法。我會分開提出一個關於它的問題。 – benz

相關問題