这是我的第一个 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>
我的回豆方法为:
@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 将生成一个按钮,用于调用支持 bean 的 createRole() 方法来创建角色,然后导航到 roleEdit.xhtml。但不幸的是,每次我访问或刷新 roleList.xhtml 时。调用 backing bean 方法来创建一个新的角色对象,这意味着执行表单/动作时无需按下按钮来触发 backing 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 对类似问题的回答。在我的情况下它不起作用,我不知道为什么。请提供更多解释为什么在页面加载时执行链接/按钮,以及如何防止它一次又一次地发生?