这是我的第一个PrimeFaces项目,我正在使用Primefaces 5.2。我在我的列表页面roleList.xhtml中添加了一些表单/操作,例如:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://xmlns.jcp.org/jsf/facelets"
xmlns:p="http://primefaces.org/ui"
xmlns:f="http://xmlns.jcp.org/jsf/core"
xmlns:h="http://java.sun.com/jsf/html">
<h:head/>
<h:body>
<ui:composition template="/WEB-INF/ozssc-template.xhtml">
<ui:define name="content">
<h3>#{clientrole['web.role.list.heading']}</h3>
<p:toolbar>
<p:toolbarGroup>
<h:panelGrid columns="3">
<p:button value="#{apps['applicaiton.nav.backtomain']}" outcome="/index.xhtml" icon="fa fa-fw fa-home" type="button"/>
<h:form><p:commandButton value="#{clientrole['web.role.label.new']}" action="#{roleControlBean.createRole()}" icon="fa fa-fw fa-plus-square" ajax="false" type="submit"/></h:form>
</h:panelGrid>
</p:toolbarGroup>
</p:toolbar>
<p:dataTable id="rolelist" var="role" value="#{roleBean.roles}" rows="20" paginator="true" tableStyle="width:auto" resizableColumns="true" liveResize="true">
<f:facet name="header">Size of #{clientrole['web.role.table.name']} #{roleBean.roles.size()}</f:facet>
<!--<p:column headerText="#{clientrole['web.role.label.id']}"><h:link value="#{role.roleId}" outcome="#{roleControlBean.viewRole(role.roleId)}" /></p:column>-->
<p:column headerText="#{clientrole['web.role.label.id']}"><h:form><h:commandLink value="#{role.roleId}" action="#{roleControlBean.viewRole(role)}" /></h:form></p:column>
<!--<p:column headerText="#{clientrole['web.role.label.id']}">#{role.roleId}</p:column>-->
<p:column headerText="#{clientrole['web.role.label.name']}">#{role.roleName}</p:column>
<p:column headerText="#{clientrole['web.role.label.desc']}">#{role.roleDescription}</p:column>
<p:column headerText="#{clientrole['web.role.label.reportto']}">#{role.roleReportto}</p:column>
<p:column headerText="#{clientrole['web.role.label.function']}">#{role.roleFunction}</p:column>
</p:dataTable>
</ui:define>
</ui:composition>
</h:body>
</html>
我的后bean方法为:
@Named(value = "roleControlBean")
@SessionScoped
public class RoleControlBean implements Serializable{
private static final String ROLE_EDIT="/role/roleEdit.xhtml";
.......
public String createRole(){
Role newrole = new Role();
newrole.inited();
/*logger.info(newrole != null?newrole.toString():"no role created by constructor.");*/
roleRemote.create(newrole);
if (roleBean.findRoleInCache(newrole.getRoleId())!=null){
roleBean.setCurrentRole(newrole);
}
return ROLE_EDIT;
}
.......
}
如前面的代码所示,xhtml将生成一个按钮,用于调用backing bean的createRole()方法来创建角色,然后导航到roleEdit.xhtml。但不幸的是,每当我访问或刷新roleList.xhtml时。调用了backing bean方法来创建一个新的角色对象,这意味着表单/动作是在没有按下按钮的情况下执行来激活支持bean动作但是UI仍然保留在roleList.xhtml中。
有没有人在PrimeFaces开发方面有更多经验请指出我在做什么?
修改:此页面也会加载template.xhtml。当我使用链接/结果在其他页面中调用其他支持方法时,它会再次发生:
<p:link id="personid" value="#{clientperson['web.person.label.new']}" outcome="#{personControlBean.createPersonFromStaff(staffBean.currentStaff.staffId)}"
ajax="false" rendered="#{empty staffBean.currentStaff.personId}"><f:attribute name="staffId" value="#{staffBean.currentStaff.staffId}"/>
</p:link>
我的问题是:如何阻止链接/按钮在页面加载时不自动触发?
新增 我的应用服务器是Weblogic 12cR2。我已经看到了BalusC对类似问题的回答。它在我的情况下不起作用,我不知道为什么。请告知更多解释链接/按钮在页面加载时执行的原因,以及如何防止它一次又一次地发生?