2012-08-17 22 views
8

我有使用案例,我必須使用資源束來在UI上顯示各種文本。其中一些資源包條目採用參數(例如{0}),對於這些我使用h:outputFormat,但有時這還不夠。如何使用帶有JSF組件的非Value屬性的參數化MessageFormat

例如

someMessage=Display this message with param {0} 

在資源包中。

要顯示它的XHTML我通常做:

<h:outputFormat value="#{msg['someMessage']}"><f:param value="#{someBean.value}"/></h:outputFormat> 

行之有效當它是一個簡單的例子,但對於更復雜的使用情況下,它是不夠的。例如,如果我希望commandLink的'title'屬性使用上述資源包條目:

<h:commandLink action="logout" title="#{msg['someMessage']}"> 
     <f:param value="#{someBean.value}" /> 
     <h:graphicImage library="images" name="image.png" /> 
    </h:commandLink> 

哪個不起作用。我也嘗試過:

<h:commandLink action="logout"> 
     <f:attribute name="title"> 
      <h:outputFormat value="#{msg['someMessage']}"><f:param value="#{someBean.value}"/></h:outputFormat> 
     </f:attribute> 
     <h:graphicImage library="images" name="image.png" /> 
    </h:commandLink> 

這也不起作用,因爲f:attibute不允許兒童。

即使存在破解(例如,使用來自primefaces的懸停組件),還有其他可能需要參數化消息的字段。

有誰知道使用MessageFormat的方法,該方法在JSF組件的非值字段中使用參數?

+0

相似的問題:http://stackoverflow.com/questions/5697189/pass-parameters-to-messages-from-resource-bundle-to-components-other-than-hou – Adam 2012-08-17 10:22:48

+0

這是一個不同的問題,因爲那是關於**價值**屬性,這是直接處理(我回答了這個問題)。使用具有**非值**屬性的參數化MessageFormat的方法是我正在尋找的。 – Zak 2012-08-17 16:16:30

回答

6

您可以爲此,使用它可以最終落得像創建a custom EL function

<h:commandLink ... title="#{my:format(msg['someMessage'], someBean.value)}" /> 

您可以使用MessageFormat API來完成這項工作,正是因爲<h:outputFormat>在幕後做。

另一種方法是創建一個自定義組件,它與JSTL的良好'ol <fmt:message>相同,該支持var屬性將格式化消息導出到EL範圍。

<my:outputFormat ... var="linkTitle"> 
    ... 
</my:outputFormat> 
<h:commandLink ... title="#{linkTitle}" /> 

更新:JSF工具庫OmniFaces具有#{of:formatX()}功能和根本目的一個<o:outputFormat>組件。

+0

該方法的問題在於,如果您的messageFormat需要2個參數,而另一個方法需要3個參數,那麼您需要一個新方法等。有沒有更好的方法來實現這一點?如果沒有,那麼它應該被添加到未來的JSF版本中,因爲它是默認支持的東西。 – Zak 2012-08-17 17:24:22

+0

編號EL不支持可變參數(也沒有重載的函數名,所以你真的需要'format1()','format2()','format3()'等)。請注意,這不是JSF限制,而是EL限制。只需要創建1到5個參數,或者10個參數。順便說一下,我個人從來沒有在現實世界中創建/看過多於5個參數的捆綁條目。 – BalusC 2012-08-17 17:28:24

+0

不,我認爲需要的是一種在孩子身上使用f:屬性的方法。這樣,你可以將f:屬性的名稱設置爲要使用messageFormat(例如title)的屬性的名稱,並且其子節點可以是h:outputFormat(我上面的第二次嘗試就是這方面的一個很好的例子)。只要所有組件都可以有一個f:屬性子組件,就可以使messageFormat在任何地方都可用。 – Zak 2012-08-17 17:36:29

相關問題