0

这是我的第一个 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 对类似问题的回答。在我的情况下它不起作用,我不知道为什么。请提供更多解释为什么在页面加载时执行链接/按钮,以及如何防止它一次又一次地发生?

4

0 回答 0