2017-12-30 53 views
0

는 난,JSF에서 양식을 처리 할 때 모든 스레드가 하나의 스레드에서 발생합니까?

public List<Hour> getHours() { 
     final List<Hour> hours = IntStream.range(0, Hour.TIME.values().length) 
              .mapToObj($ -> new Hour()).collect(Collectors.toList()); 
     for (int i = 0; i < 5; i++) { 
      hours.get(i).setHour(1); 
     } 
     return hours; 
} 

여기가 지금 시간 클래스를

public class Hour { 
    private int time; 

    public int getTime() { 
     return time; 
    } 

    public void setTime(int time) { 
     this.time = time; 
    } 
} 

을의 방법을 가지고, 내가

 <p:dataTable styleClass="scheduleTable" value="#{todaySchedule.hours}" var="hour"> 
      <p:column headerText="Hour" styleClass="hourColumn" > 
       #{hour.time} 
      </p:column> 
     </p:dataTable> 

와 클래스라는 todaySchedule에서이 코드 조각을 말해봐 시간이 지남에 따라 동적 인 dataTable 데이터 반복을 만들기 위해 JSF가 어떤 일을하는지 확신 할 수는 없지만,이 모든 것이 한 스레드에서 발생한다면, 괜찮아. 그러나, 배후에 있다면 getHours는 실제로 생성 열을 수행하고 나쁜 상태로 시간을 보는 다른 스레드에서 사용됩니까? 이것은 내 질문은 후자의 디자인으로 변경되지 않은 경우 기본 동정 JSF 데이터 테이블 렌더링을 사용하는 경우, 일 때문에 가시성이 잘못 될 수 있다는 것입니다, 방법은 그러나

public List<Hour> getHours() { 
     final List<Hour> hours = new ArrayList<>(); 
     for (int i = 0; i < 5; i++) { 
      hours.add(new Hour(i + "")); 
     } 
     return hours; 
} 

with the corresponding Hour class being 

public class Hour { 
    private final int time; 

    public Hour(int time) { 
     this.time = time; 
    } 

    public int getTime() { 
     return time; 
    } 
} 

이었다)합니다 (는 getHours 경우 피할 수 이 Hour 인스턴스를 게시 할 때 Java 관련 문제가 있습니까?

+0

그것은 하나의 스레드 – Kukeltje

답변

3

JSF는 하나의 스레드에서 하나의 요청을 처리하는 Servlet API를 기반으로 실행되므로 더 많은 스레드를 직접 도입하지 않으면 코드가 단일 스레드에서 실행될 것으로 기대할 수 있습니다.

한편, JSF 라이프 사이클의 기본 사항과 빈 특성에 액세스하는 방법에 대해 알아야합니다. 이해하지 못하면 많은 문제가 발생할 수 있습니다.

예를 들어, Java 코드가 그대로라면 JSF에 todaySchedule.hours에 대한 다른 참조를 추가하면 getter가 두 번 호출되어 컨텐츠가 두 번 생성됩니다. 이것은 매우 지저분해질 수 있기 때문에 "캐싱"을하는 것이 좋습니다. 나는이 접근 방식을 개인적으로 사용합니다 :

private List<Hour> hours = null; 

private void initHours() { 
    this.hours = new LinkedList<>(); 
    // Fill hours here 
} 

public List<Hour> getHours() { 
    if (this.hours == null) { 
     initHours(); 
    } 
    return this.hours; 
} 

JSF 라이프 사이클의 어느 단계에서 이것을하는지 조심해야합니다. 예를 들어 양식 처리 방법에서 목록 생성에 영향을주는 데이터를 변경하면 목록은 이미 복원보기 단계에서 이미 "캐싱"되어있을 것이며 변경 사항은 렌더보기 단계가 시작될 때 반영되지 않습니다. 이 경우 캐싱을 인식하고 다시로드해야 할 때 목록을 지워야합니다.

public void saveHours() { 
    // Save the data, do whatever you need to do 

    // This will ensure re-initializing the list on the next call 
    this.hours = null; 
} 
+0

SWEEET의 모든입니다, 감사합니다 :) 내가 더 JSF 라이프 사이클에 읽어 갈 것입니다, 당신은 좋은 자원이다 어떻게 생각하십니까? – katiex7

+0

좋은 시작입니다. https://docs.oracle.com/javaee/7/tutorial/jsf-intro006.htm 그리고 Google뿐입니다.하지만 읽은 후에 올바른 질문을 할 수 있어야합니다. 도입. 그리고 물론, 문서를 읽는 동안 http://myfaces.apache.org/core22/myfaces-impl/tlddoc-facelets/h/commandButton.html 즉각적인처럼 속성을 이해합니다. JSF 문서에는 라이프 사이클 단계에 대한 몇 가지 참조가 있으며, 앞으로의 연구에서 찾을 수있을 것이라고 확신합니다. –

+1

그리고 (또는 적어도 그 존재를 기억하십시오) https://stackoverflow.com/questions/tagged/jsf+or+jsf-2?sort=frequent&pageSize=50 그리고 https://jsf.zeef.com을 읽어보십시오. '오래된'이지만 일종의 최신 정보 (소개되는 아약스 외에는 http://balusc.omnifaces.org/2006/09/debug-jsf-lifecycle.html) – Kukeltje

관련 문제