页面调用相同的函数两次JSF

时间:2014-01-14 14:02:22

标签: jsf

在此页面中,此部分会被调用两次。我看不出这个的原因。这导致的问题是selectonemenu中的选择将被重置,然后返回第二次调用的错误结果。

ServiceSeries是一个会话bean。

有谁能告诉我为什么会发生这种双重呼叫?

<c:forEach var="list" items="#{serviceSeries.getSeriesForPlayerInfo(club.name, player.stringID, st, calendarBean)}">

<!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:h="http://xmlns.jcp.org/jsf/html"
      xmlns:f="http://xmlns.jcp.org/jsf/core"
      xmlns:ui="http://xmlns.jcp.org/jsf/facelets"
      xmlns:c="http://java.sun.com/jsp/jstl/core" 
      xmlns:p="http://primefaces.org/ui">

<ui:composition template="/WEB-INF/templates/template.xhtml">

    <ui:define name="content">

        <h:form>
        <div id="left">
        <h:commandLink action="player" value="Gå till spelare" />
        <br />
        <h:commandLink action="club" value="Gå till Klubb" />
        <br />
        <h:commandLink action="serieType" value="Gå till Serie typ" />
        <br />
        <h:commandLink action="serie" value="Gå till En serie" />
        <br />
        <h:commandLink action="serieTotal" value="Gå till Serie Total" />
        <br />
        <h:commandLink action="showAverages" value="Gå till snittlista" />
        <br />
        </div>

        <div id="right">
        <div id="pageHeader">Snitt information</div>

            <h:panelGrid columns="2">
            Spelare
            <p:selectOneMenu value="#{player}" 
                converter="playerConverter" id="playerList">
            <f:selectItem itemLabel="---" noSelectionOption="true" />
            <f:selectItems value="#{servicePlayer.allPlayers}"
             var="n"
             itemValue="#{n}"
             itemLabel="#{n.combinedName}"
             itemLabelEscaped="true"/>
            </p:selectOneMenu>

                <h:outputText value="Klubb"></h:outputText>
                <p:selectOneMenu id="ClubMenu" value="#{club.name}">
                    <f:selectItems value="#{serviceHCP.clubs}" />
                </p:selectOneMenu>
                <h:outputText value="Serietyp"></h:outputText>

                <p:selectOneMenu value="#{st}" 
                    converter="serieTypeConverter" id="serieTypeList">
                    <f:selectItem itemLabel="---" noSelectionOption="true" />
                <f:selectItems value="#{serviceSerieType.serieTypes}"
                     var="st"
                     itemValue="#{st}"
                     itemLabel="#{st.serie_type}"
                     itemLabelEscaped="true"/>
                </p:selectOneMenu>


                <h:outputText value="Startdatum"></h:outputText>
                <p:calendar value="#{calendarBean.date1}" id="popupButtonCal" showOn="button" pattern="yyyy-MM-dd HH:mm:ss" >
                    </p:calendar>
                <h:outputText value="Slutdatum"></h:outputText>
                <p:calendar value="#{calendarBean.date2}" id="popupButtonCal2" showOn="button" pattern="yyyy-MM-dd HH:mm:ss" >
                    </p:calendar>
                    <h:outputText value=""></h:outputText>
                <h:commandButton value="Visa lista" action="showSeriesInfo">

                </h:commandButton>
            </h:panelGrid>
            </div>


            <div id="right">
            Players
            <br />
            <!--  h:form  -->
            <h:panelGrid columns="9" border="1" cellpadding="3">
            <h:outputText value="Namn" />
            <h:outputText value="ID" />
            <h:outputText value="Klubb" />
            <h:outputText value="Datum" />
            <h:outputText value="typ" />
            <h:outputText value="Info" />
            <h:outputText value="Antal serier" />
            <h:outputText value="Total" />
            <h:outputText value="Snitt" />

            <c:forEach var="list" items="#{serviceSeries.getSeriesForPlayerInfo(club.name, player.stringID, st, calendarBean)}">
            <h:outputText value="   #{list[0].toString() }" />
            <h:outputText value="   #{list[1].toString() }" />
            <h:outputText value="#{serie.getSerieDateString(list[2]) }" />
            <h:outputText value="#{list[3].toString()}"/>
            <h:outputText value="   #{list[4].toString() }" />
            <h:outputText value="   #{list[5].toString() }" />
            <h:outputText value="   #{list[6].toString() }" />
            <h:outputText value="   #{list[7].toString() }" />
            <h:outputText value="   #{list[8].toString() }" />
            </c:forEach>

            </h:panelGrid>
            </div>
            </h:form>

    </ui:define>

</ui:composition>

</html>

1 个答案:

答案 0 :(得分:0)

如果我理解你的问题描述正确,它的预期行为; JSF对请求有6个生命周期,并且可以在每个请求中调用相同的方法;根据我的经验,它有时会发生两次,有时会在一次请求中发生三次,具体取决于JSF调用哪些阶段以及它跳过哪些阶段。

您的工作是知道这可能发生,何时可能发生(通过研究生命周期阶段)并相应地设计您的代码,例如通过确保方法为每个生命周期阶段返回完全相同的事物。可以应用多种策略,例如利用特定范围(视图,会话,对话),延迟初始化或使用PostConstruct注释的bean init方法为bean进行一次初始化。

如果您需要进一步的帮助,我建议您也发布相关的服务器端(Java)代码。问题源于某处。

这可能会有所帮助:http://balusc.blogspot.nl/2006/09/debug-jsf-lifecycle.html