我已经看到这个问题问了很多,但是,没有一个得到正确的回答,所以我决定再问一次。所以如果我有这个:如果我在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}"/>
这个想法是我可以在键hiddenFormId
下访问RequestParameterMap
中formId
的值。但是现在如果我有:
<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 值呢?
<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}" />
它将作为具有此名称的请求参数提供。