2017-02-17 17 views
0

Я использую "C: Foreach" в XHTML следующим образом:JSF метод геттер называется много раз

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

    <h:head> 
    <!--I have tried to incorporate this set inside h:form as well. Still multiple calls--> 
    <c:set var="currentHistory" value="${itemBean.getParticipantItems(itemBean.history_id, 'borrow')}" /> 
<c:set value="${fn:length(currentHistory) - 1}" var="sizeOfCurrentHistory" /> 

    </h:head> 

    <h:form enctype="multipart/form-data" > 
    <body > 

    <!--I have tried with dataTable and ui:repeat. Still multiple calls. And used step/begin in foreach--> 
     <c:forEach items="${currentHistory}" var="history" rendered="${fn:length(currentHistory) > 0}" > 

     <div > 

      <h:outputLabel for="itemDescription" value="Item Description:" > 
      <h:outputText id="itemDescription" value="# {history.itemDescription}" style="margin-left:10px;color:black;"/> 
      </h:outputLabel> 
      <br /> 
      <h:outputLabel for="itemModel" value="Item Model:" > 
      <h:outputText id="itemModel" value="#{history.itemModel}" style="margin-left:10px;color:black;"/> 
     </h:outputLabel> 
     <br /> 
     <h:outputLabel value="Item Approved:" > 
      <h:outputText value="Yes" style="margin-left:10px;color:black;" rendered="${history.approved == 1}"/> 
      <h:outputText value="No" style="margin-left:10px;color:black;" rendered="${history.approved == 0}"/> 
     </h:outputLabel> 
     <br /> 
     <h:outputLabel value="Date Created:" > 
       <h:outputText value="#{history.dateCreated}" style="margin-left:10px;color:black;"/> 
     </div> 
    </c:forEach> 

</body> 

Код боб вызов заключается в следующем: @ Именованный @SessionScoped Публичный класс ItemBean расширяет AbstractBean реализует Serializable {

I introd uced тест на наличие результата, который не работает.

public List getParticipantItems(String pid, String which) { 

System.out.println("called getParticipantItems"); 
List result = null; 
Session session = null; 
Transaction tx = null; 
String query = null; 
this.itemType = which; 

if (this.itemFoundList == null) { 
    // which_history: 0 = individual, 1 = community 
    try { 
    session = hib_session(); 
    tx = session.beginTransaction(); 
    if (this.history_which == 0) { 
     query = " SELECT itm " 
       + " FROM Items itm " 
       + " WHERE itm.participant_id = :pid AND itm.itemType = :itype ORDER BY itm.dateCreated "; 
    } else if (this.history_which == 1) { 
     query = " SELECT itm " 
       + " FROM Participant part, Items itm " 
       + " INNER join part.item itm " 
       + " WHERE part.communityId = :pid AND itm.itemType = :itype ORDER BY itm.dateCreated "; 
    } else { 
     // Later query = "FROM Items WHERE participant_id = :pid and itemType = :it"; 
    } 

    result = session.createQuery(query) 
      .setParameter("pid", pid) 
      .setParameter("itype", which) 
      .list(); 
    tx.commit(); 
    } catch (Exception e) { 
    tx.rollback(); 
    System.out.println("Error in getParticipantItems"); 
    Logger.getLogger(ItemBean.class.getName()).log(Level.SEVERE, null, e); 

    } finally { 
    tx = null; 
    session = null; 

    } 
    this.itemFoundList = result; 
} 

if (this.itemFoundList != null) { 
    return this.itemFoundList; 
} else { 
    return result; 
} 

}

Может кто-то помочь мне понять, почему эта поддержка боб в Еогеасп вызывается несколько раз?

Спасибо.

ответ

2

Переменные, установленные с помощью набора c: имеют определенный объем. Область по умолчанию - это область страницы, что означает, что ваша переменная всегда оценивается каждый раз, когда вы обращаетесь к ней. Вот почему ваш метод getParticipantItems вызывается несколько раз. Другие прицелы запроса, сессии и применение:

  • запроса объем: переменная вычисляется для каждого запроса
  • сессии объем: переменная вычисляется один раз за сеанс
  • объем применения: переменная вычисляется только один раз и то же самое для каждого клиента

Try установить атрибут Сфера действия с: установить на запрос:

<c:set scope="request" ... /> 
+0

Спасибо, Алекс Огонь. Я задал область как запрос. Работает как шарм. – emm

+0

Добро пожаловать. Как насчет принятия ответа, emm? –