Jsf ui:fragment不';不要被触发

Jsf ui:fragment不';不要被触发,jsf,jsf-2,jsf-2.2,Jsf,Jsf 2,Jsf 2.2,表单无论如何都会被发布,但是只有在我没有将表单放入ui:fragment的情况下,按钮操作参数引用的bean方法才会被触发。我在Tomcat 6.0.41上使用Mojarra 2.2.5 (如果改用primefaces'p:commandButton,也会发生这种情况) view.xhtml?edit=true: <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml" xmlns:h="http://java

表单无论如何都会被发布,但是只有在我没有将表单放入
ui:fragment
的情况下,按钮操作参数引用的bean方法才会被触发。我在Tomcat 6.0.41上使用Mojarra 2.2.5

(如果改用primefaces'
p:commandButton
,也会发生这种情况)

view.xhtml?edit=true

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:ui="http://java.sun.com/jsf/facelets"
    xmlns:p="http://primefaces.org/ui">
    <f:metadata>
        <f:viewParam name="edit" id="edit" />
        <ui:param name="editMode" value="#{not empty edit and edit eq 'true' and saveBean.contentEditable}" />
    </f:metadata>
    <h:head>
        <title>Page title</title>
    </h:head>
    <h:body>
        <ui:fragment rendered="#{editMode}">
        </ui:fragment>
            <h:form id="saveForm">
                <h:commandButton 
                    id="btn2" 
                    type="submit" 
                        value="Triggers POST but no action" 
                    action="#{saveBean.saveAllAction}"
                />
            </h:form>
    </h:body>
</html>

我独立发现的解决方案与@Ali C提出的非常接近:底线是
rendered=“…”
条件在表单请求到达后得到重新评估。在这种情况下,可以通过将条件设置为bean参数(
saveBean.editMode
)来访问该条件:


...
...
并将属性
edit
editMode
添加到bean中。

读到一个相关的问题,我怀疑#5是您的问题,在应用请求阶段(可能是ui:param的计时情况)之后,呈现属性在JSF上被切换,从而导致之后的安全性复查失败。通过对渲染属性硬编码true,可以快速验证ui:fragment或h:commandButton是否存在问题

为了解决这个问题,让viewParam在支持bean中设置一个属性,然后ui:fragment可以检查该属性,而不是检查ui:param

 <f:metadata>
    <f:viewParam name="edit" id="edit" value="#{saveBean.editMode}"/>
</f:metadata>
  ...
   <ui:fragment rendered="#{saveBean.editMode}">

...

如果您将
ui:fragment
放入
h:form
中是否足够?
<f:metadata>
    <f:viewParam name="edit" id="edit" value="#{saveBean.edit}"/>
</f:metadata>
...

            <ui:fragment rendered="#{saveBean.editMode}">
            ...
 <f:metadata>
    <f:viewParam name="edit" id="edit" value="#{saveBean.editMode}"/>
</f:metadata>
  ...
   <ui:fragment rendered="#{saveBean.editMode}">