2013-12-17 3 views
0

안녕하세요, jsf datatabel 정렬 및 페이지 매김을 허용하는 뷰 범위를 사용하고 있습니다. 내 BackingBean 정렬 방법은 항상 두 번 호출되므로 같은 행을 정렬 할 때 오름차순/내림차순 정렬이 필요하지 않을 경우 커다란 문제는 아닐 수 있습니다. 모든 아이디어가이 문제를 해결하는 방법? 나는이 문제에 대해 이미 여러 블록을 읽었지만 아직 내 경우에 도움이되지 못했습니다 ... 범위를 요청하여 변경하려고했으나 방금 페이지가 사라지게되었습니다 ...JSF 메서드가 항상 두 번 호출됩니다.

이것은 BackingBean Methode가 있습니다.

/** 
* 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 온다 : 단지 내 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 to this info). 이것을 삭제하고 h : outputText로 렌더링하여 메시지를 추가했습니다. html : outputText 및 바인딩을 렌더링하지 않고 내 범위를 요청하는 대신 내 페이지 매김을 잃지 않고 내 BackingBean의 메시지를 내 응용 프로그램과 다르게 추가하는 방법에 대한 제안 사항은 아직 열려 있습니다.

관련 문제