我已经看到这个问题在很多地方问了,但是没有一个得到适当的回答所以我决定再问一遍。所以,如果我有这个:如果我在A.xhtml
而我
<ui:include src="B.xhtml">
<ui:param name="formId" value="awesome Id"/>
</ui:include>
所以在B.xhtml
,我可以这样做
<h:outputText value="#{formId}"/>
当我运行A.xhtml
时,我会在屏幕上看到awesome Id
。但是,如何在辅助bean中访问formId
的值。我查看FacesContext.getCurrentInstance().getAttributes()
和FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap()
内部,我似乎无法找到它。为了更进一步,我尝试:
在B.xhtml
内,我现在有
<h:inputHidden id="hiddenFormId" value="#{formId}"/>
<h:outputText value="#{formId}"/>
我的想法是,我可以在密钥formId
下的RequestParameterMap
中访问hiddenFormId
的值。但现在如果我有:
<h:form id="myForm">
<ui:include src="B.xhtml">
<ui:param name="formId" value="awesome Id"/>
</ui:include>
<a4j:commandButton render="myForm" value="My Button"/>
</h:form>
然后如果我查看POST请求(在chrome或ff调试模式下),我会得到这个错误
<partial-response><error><error-name>class javax.faces.component.UpdateModelException</error-name><error-message><![CDATA[/B.xhtml @9,61 value="${formId}": /index.xhtml @27,61 value="awesome Id": Illegal Syntax for Set Operation]]></error-message></error></partial-response>
所以如何在托管bean中访问ui:param值?
答案 0 :(得分:9)
<ui:param>
所涵盖的内容实际上取决于实现。在Mojarra中,它作为FaceletContext
的属性存储,因此可以在您的支持bean中使用,如下所示:
FaceletContext faceletContext = (FaceletContext) FacesContext.getCurrentInstance().getAttributes().get(FaceletContext.FACELET_CONTEXT_KEY);
String formId = (String) faceletContext.getAttribute("formId");
然而,该值是否可用取决于时间。如果在执行包含的呈现时您的支持代码正在运行,那么它将可用,否则它将是null
。
我记得MyFaces的做法有点不同,但我不再回忆起细节了,而且我现在还没有掌握其来源。
对于<h:inputHidden>
次尝试,<h:inputHidden>
并不适用于传递视图定义的隐藏参数以及表单提交的唯一目的。只需使用纯HTML即可。
<input type="hidden" name="hiddenFormId" value="#{formId}" />
它可以作为具有此名称的请求参数。