我有一个JSF模板,它动态地包含用户通过菜单选择后显示的内容:
<ui:composition xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:p="http://primefaces.org/ui"
template="/WEB-INF/templates/template.xhtml">
<ui:define name="main">
<p:panel id="content">
<ui:include src="#{navigationMb.page}" />
</p:panel>
</ui:define>
</ui:composition>
我想要包含的其中一个页面有一个p:commandButton,如下所示:
<ui:composition xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:p="http://primefaces.org/ui">
<div class="ui-fluid">
<h:form>
<p:panelGrid
id="changePasswordPanel"
layout="grid"
columns="2"
styleClass="ui-panelgrid-blank">
...
<p:commandButton value="Change Password"
action="#{changePasswordMb.changePassword}"
update="changePasswordPanel"
icon="ui-icon-check" />
</p:panelGrid>
</h:form>
</div>
</ui:composition>
我应该在我的支持bean中调用以下方法:
package com.bgasparotto.archproject.web.security;
import javax.enterprise.context.RequestScoped;
import javax.inject.Inject;
import javax.inject.Named;
import org.slf4j.Logger;
@Named
@RequestScoped
public class ChangePasswordMb {
@Inject
private Logger logger;
public void changePassword() {
logger.info("TESTE");
}
}
但是,我的changePassword
方法永远不会被调用。
此外,如果我只是将我所包含页面的内容直接放入我的主页面,它就可以工作:
<ui:composition xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:p="http://primefaces.org/ui"
template="/WEB-INF/templates/template.xhtml">
<ui:define name="main">
<p:panel id="content">
<div class="ui-fluid">
<h:form>
<p:panelGrid
id="changePasswordPanel"
layout="grid"
columns="2"
styleClass="ui-panelgrid-blank">
...
<p:commandButton value="Change Password"
action="#{changePasswordMb.changePassword}"
update="changePasswordPanel"
icon="ui-icon-check" />
</p:panelGrid>
</h:form>
</div>
</p:panel>
</ui:define>
</ui:composition>
围绕StackOverflow,我发现BalusC发现了这个great guide来调试我的应用程序。我已经检查过每一个可能的原因,但它没有起作用。
另外,我尝试在我的模板中加入OmniFaces fixviewstate.js
,但它也没有用:
<h:body>
<h:outputScript library="omnifaces" name="fixviewstate.js" target="head" />
...
<h:body>
编辑1
以下是我NavigationMb
的代码:
package com.bgasparotto.archproject.web;
import javax.enterprise.context.RequestScoped;
import javax.inject.Inject;
import javax.inject.Named;
import org.slf4j.Logger;
@Named
@RequestScoped
public class NavigationMb {
private String page;
public NavigationMb() {
this("welcome.xhtml");
}
public NavigationMb(String page) {
this.page = page;
}
public void nav(String page) {
this.page = page;
}
public String getPage() {
return page;
}
public void setPage(String page) {
this.page = page;
}
}
我已经没有可能的解决方案了。有什么想法吗?
我的设置:
提前致谢。