在加载jsf页面时执行了Prime面部5.2结果/操作

时间:2016-10-13 06:00:06

标签: java primefaces jsf-2 backing-beans onactionexecuted

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

0 个答案:

没有答案