2013-04-13 2 views
0

페이지가로드 될 때 f : 이벤트를 실행하려고합니다. f:event은 백업 빈 기능 init()과 연관됩니다. init()은 함수에 사용되는 세션 개체 toIndex을 만듭니다. 하지만 내가 직면하고있는 문제는 getStatusList() funciton이 먼저 실행되고 따라서 toIndex 세션 개체를 찾을 수없고 null 포인터 예외가 발생한다는 것입니다. init() 함수는 호출되지 않습니다. StatusBean은 세션 범위입니다.f의 실행 순서 : 예외를 일으키는 이벤트

1) XHTML

<!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://java.sun.com/jsf/facelets" 
    xmlns:h="http://java.sun.com/jsf/html" 
    xmlns:f="http://java.sun.com/jsf/core" 
    xmlns:p="http://primefaces.org/ui" 
    xmlns:c="http://java.sun.com/jsp/jstl/core"> 
<f:view> 
    <f:event type="postAddToView" listener="#{statusBean.init}" ></f:event> 
</f:view> 
<h:head></h:head> 
<h:body> 
    <c:forEach var="p" items="#{statusBean.statusList}" 
         varStatus="loop"> 
    //content 
    </c:forEach> 

</h:body> 
</html> 

2) 백업 콩

public class StatusBean { 

public List<Status> getStatusList() { 
     FacesContext context = FacesContext.getCurrentInstance(); 
     HttpSession session = (HttpSession) context.getExternalContext() 
       .getSession(true); 
     User user = (User) session.getAttribute("userdet"); 
     Query query = em.createQuery("SELECT s FROM Status s WHERE s.email='" 
       + user.getEmail() + "' ORDER BY s.timeMillis desc", 
       Status.class); 
     List<Status> results = query.getResultList(); 

     Collections.sort(results); 
     int toIndex = (int) session.getAttribute("toIndex"); 
     List<Status> subList = results.subList(0, toIndex); 
     return subList; 

    } 
public void init(ComponentSystemEvent event) { 
     System.out.println("inside init"); 
     FacesContext context = FacesContext.getCurrentInstance(); 
     HttpSession session = (HttpSession) context.getExternalContext().getSession(true); 
     int toIndex = 5; 
     session.setAttribute("toIndex",toIndex); 
    } 


} 

답변

1

나는 생각한다, 여기에 문제는 c:forEach입니다. 뷰가 빌드 될 때 (이벤트가 트리거되기 전에) 실행됩니다. ui:repeat으로 바꾸십시오. 일반적으로 c:forEach은 JSF가 부작용이 있으므로주의해서 사용해야합니다 (있는 경우).

+0

사실 나는'ui : repeat'를 사용하여 시도했지만 문제가 있었으며 심지어'h : dataTable' 같은 대/소문자를 사용하려고했습니다. 그래서 나는'c : forEach' 옵션 만 남겨 두었습니다. 'getStatusList' 전에'init'을 트리거 할 수있는 대안이 있습니까? –

+0

'ui : repeat'의 문제점은 무엇입니까? 일반적으로 JSF와의 더 나은 통합으로 비슷한 동작을 보일 것입니다. – Michi

+0

http://stackoverflow.com/questions/12501700/submit-not-working-inside-uirepeat. 내 질문을 확인해보십시오. 나는 오랫동안 그것을 뒤로 게시했다 –

관련 문제