2013-12-17 135 views
0

嗨我有一個jsf datatabel使用視圖範圍,它允許排序和分頁。 我的問題是,我的BackingBean排序方法總是被調用兩次,如果不在同一行排序時升序/降序排序(這會使其過時),那麼這將不是一個大問題。 任何想法如何解決這個問題?我已經閱讀了幾個關於這個問題的方塊,但是沒有幫我在我的情況下... 我也試圖改變它來請求範圍,但這只是使我的分頁消失...JSF方法總是被調用兩次

這是BackingBean Methode它是隻從我的facelet鏈接叫:

/** 
* Changing sorting of list of events by columns. 
* 
* @param event 
*   ActionListener for the sorting field. 
*/ 
public void sort(String sortingAttribute) { 
    System.out.println("you called sort: " + ++x); 
    if (sortField.equalsIgnoreCase(sortingAttribute)) { 
     boolean sortAscHelp = (sortAsc) ? false : true; 
     sortAsc = sortAscHelp; 

    } else { 
     sortField = sortingAttribute; 
    } 

    try { 
     events = (eventListType.equalsIgnoreCase("search")) ?EventManager.getSearchResults(searchTitle, searchDate, searchLocation, sortField, sortAsc, offset, limit) : EventManager.getEventList(eventListType, offset, limit, sortField, sortAsc); 
    } catch (DatabaseException e) { 
     FacesContext fcxt = FacesContext.getCurrentInstance(); 
     fcxt.addMessage(component.getClientId(), 
       new FacesMessage(e.toString())); 
     logger.error("Error while loading the sorted list of searched events."); 
    } 
} 

這裏來我的facelet:

<ui:composition xmlns="http://www.w3.org/1999/xhtml" 
xmlns:f="http://java.sun.com/jsf/core" 
xmlns:ui="http://java.sun.com/jsf/facelets" 
xmlns:h="http://java.sun.com/jsf/html"> 

<ui:composition template="../../templates/basicTemplate.xhtml"> 
<ui:define name="metadata"> 
    <f:metadata> 
     <f:viewParam name="title" value="#{listEventsBean.searchTitle}"/> 
     <f:viewParam name="location" value="#{listEventsBean.searchLocation}"/> 
     <f:viewParam name="date" value="#{listEventsBean.searchDate}"/> 
     <f:viewParam name="eventListType" value="#{listEventsBean.eventListType}"/> 
     <f:viewParam name="page" value="#{listEventsBean.page}"/> 
     <f:viewParam name="sorting" value="#{listEventsBean.sortField}"/> 
     <f:viewAction action="#{listEventsBean.init}"/> 
    </f:metadata> 
</ui:define> 
<ui:define name="content"> 
<h:form> 
    <p style="color:#808080; font-weight:bold; font-size:large">#{msgs.listEvents_events}</p> 
    <br/> 
    <h:outputText style="color:green" value="#{msgs.listEvents_deleted}" rendered="#{listEventsBean.deleted}"/> 

    <h:dataTable id="eventTable" value="#{listEventsBean.getEvents()}" var="event" binding="#{listEventsBean.component}"> 
    <h:column> 
     <f:facet name="header"> 
      <h:commandLink value="#{msgs.listEvents_title}" action="#{listEventsBean.sort('title')}"> 
      <f:attribute name="sortField" value="title"/> 
      </h:commandLink> 
     </f:facet> 
     <h:outputText value="#{event.title}"/> 
    </h:column> 
    <h:column> 
     <f:facet name="header"> 
      <h:commandLink value="#{msgs.listEvents_dateStart}" action="#{listEventsBean.sort('startofevent')}"> 
      <f:attribute name="sortField" value="startOfEvent"/> 
      </h:commandLink> 
     </f:facet> 
     <h:outputText value="#{event.startOfEvent}"> 
      <f:convertDateTime pattern="#{msgs.longDate}"/> 
     </h:outputText> 
    </h:column> 
    <h:column> 
     <f:facet name="header"> 
      <h:commandLink value="#{msgs.listEvents_dateEnd}" action="#{listEventsBean.sort('endofevent')}"> 
      <f:attribute name="sortField" value="endOfEvent"/> 
      </h:commandLink> 
     </f:facet> 
     <h:outputText value="#{event.endOfEvent}"> 
      <f:convertDateTime pattern="#{msgs.longDate}"/> 
     </h:outputText> 
    </h:column> 
    <h:column> 
     <f:facet name="header"> 
      <h:commandLink value="#{msgs.listEvents_price}" action="#{listEventsBean.sort('ticketprice')}"> 
      </h:commandLink> 
     </f:facet> 
     <h:outputText value="#{event.ticketPrice}"/> 
    </h:column> 
    <h:column> 
     <f:facet name="header"> 
      <h:outputText value="#{msgs.listEvents_action}"/> 
     </f:facet> 
     <h:button id="showDetails" value="#{msgs.listEvents_showDetails}" 
        outcome="showEvent"> 
        <f:param name="eventID" value="#{event.eventID}"/> 
     </h:button> 
     <h:commandButton id="deleteEvent" value="#{msgs.listEvents_delete}" 
        action="#{listEventsBean.deleteEvent(event.eventID)}" 
        rendered="#{sessionBean.ld.systemAdmin}" 
        onclick="return confirm('#{msgs.listEvents_deleteMsg}')"/>  
    </h:column> 
</h:dataTable> 
<h:outputText style="color:blue" value="#{msgs.listEvents_emptyResult}" rendered="#{listEventsBean.notEmpty}"/> 
    <br /> 
<h:outputLink id="backToSearchLink" value="#{request.contextPath}/facelets/allUsers/searchEvents.xhtml" rendered="#{listEventsBean.notEmpty}"> 
    <h:outputText value="#{msgs.listEvents_searchAgain}"/> 
</h:outputLink> 

<ui:repeat id="paginationEvent" var="p" value="#{listEventsBean.getPageNumbers()}"> 
    <h:outputLink value="#{request.contextPath}/facelets/allUsers/listEvents.xhtml"> 
     <h:outputText value="#{p.toString()}" /> 
     <f:param name="page" value="#{p.toString()}" /> 
     <f:param name="sorting" value="#{listEventsBean.sortField}"/> 
     <f:param name="eventListType" value="#{listEventsBean.eventListType}" /> 
    </h:outputLink> 
</ui:repeat> 

</h:form> 
</ui:define> 
</ui:composition> 
</ui:composition> 

回答

0

該死!我剛剛發現我的錯誤! 我還有一個綁定附加到我的dataTable(dataTable的開始)。 由於我的視圖範圍綁定導致錯誤。一個似乎是在dataTable中調用我的方法兩次(Tanks to BalusC for this info)。通過將它們呈現爲h:outputText來刪除它並添加消息。 我仍然對任何建議如何改變我的範圍請求,而不會丟失我的分頁或如何從我的BackingBean添加消息到我的應用程序,而不呈現h:outputText和綁定,我仍然打開。