2010-06-21 2 views
1

My previous for the same problem 이제는 동일한 상황에서 몇 가지 해결책/제안을 찾고 있습니다.조건부로 렌더링 된 UICommand 구성 요소의 동작 메서드를 호출하는 방법은 무엇입니까? - 2

내 제한

  1. 내 콩 요청이
  2. 내가 토마 호크를 사용할 수 없습니다를 범위로 가지고 있습니다 - 그래서 우리는 사용할 수 없습니다 어쩌구 저쩌구 - 우리는 바람둥이 + SOA 기반으로 사용자 정의 응용 프로그램 서버를 사용합니다.

각 검색 기준에 따라 검색 결과 모음이 달라집니다 (사용자가 동일한 브라우저에서 diff 탭을 사용하여 결과를 비교하거나 다른 작업을 수행하기를 원하는 경우) 싶어). prev + next와 같은 페이지에 검색 결과를 표시하고 싶습니다. 이 같은

대신 모든 '다음'을 클릭에 대한 데이터베이스를 타격, 나는이

public static Object getSessionMapValue(String key) { 
    Log.debug(CLASS_NAME + "getSessionMapValue: key=" +key); 
    return FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get(key); 
} 

public static void setSessionMapValue(String key, Object value) { 
    Log.debug(CLASS_NAME + "setSessionMapValue: key=" +key); 
    FacesContext.getCurrentInstance().getExternalContext().getSessionMap().put(key, value); 
} 

내 질문

같은 세션에 저장하고 싶었
<tr> 
    <td colspan="14" class="WhiteRowSmallText"> 
     <div align="right"> 
      <h:commandLink rendered="#{adminBean.showPrev}" action="#{adminBean.goPrev}"> 
       <h:outputText> &lt; Prev &#160;|&#160;</h:outputText> 
      </h:commandLink> 
      <h:outputText> &#160;|&#160; </h:outputText> 
      <h:commandLink rendered="#{adminBean.showNext}" action="#{adminBean.goNext}"> 
       <h:outputText> Next &gt;</h:outputText> 
      </h:commandLink> &#160; 
     </div> 
    </td> 
</tr> 

은 다음과 같습니다

하는 경우 이 방법을 사용하여 엄청난 수의 검색 결과를 저장합니다. 사용자가 다른 탭을 열면 계속 사용할 수 있습니까? 나는 그렇게 생각한다 - 그렇지 않습니까?

결과가 더 많으면 '다음'을 시도했는데 새 Bean이 생성되어 (!) showNext를 'false'로 설정했기 때문에 조치 방법도 호출하지 않았습니다. 사용자에게 허용 할 수있는 옵션은 무엇입니까? 위의 내 제한 사항을 고려하여 페이지를 탐색 하시겠습니까?

링크를 클릭하고 CustomPhaseListener 및 RESTORE VIEW PHASE에서 숨겨진 Bean 변수를 사용하고 javascript를 통해 'true'로 설정하면이 숨겨진 값에 따라 showNext를 'true'로 설정할 수 있습니까? ? 그것은 가치있는 접근 방식입니까?

모든 scoldings 및 제안을 환영합니다. 내가 검색의 거대한 숫자를 저장하기 위해이 방법을 사용하는 경우

당신이 inputHidden를 사용하는 경우, 당신은 ClassCast 예외가 발생할 수 있습니다, 나는 확실하지 아직이 같은 노력하고이

public Boolean getShowNextValue() { if(showNext != null && showNext.getValue()!= null) { log.debug("showNext.getValue() ]" +showNext.getValue()); if(((String)showNext.getValue().toString()).equals("false")) { return false; }else{ return true; } }else{ return false; } } 

답변

2

를 작동하는 경우 결과, 사용자가 다른 탭을 열면 여전히 사용할 수 있습니까? 나는 그렇게 생각한다 - 그렇지 않습니까?

나는 콩 세션 범위를 지정했다. 또는 요청 범위가 지정된 bean에서 모든 "세션에 대상이 될"모든 특성을 분할하고 해당 특성으로 새 세션 범위 bean을 작성할 수도 있습니다. 그런 다음 JSF 관리 속성 기능을 사용하여 필요할 때마다 범위가 지정된 요청 범위에 세션 범위의 세션을 삽입 할 수 있습니다 (작업의 경우). 또한 this example을 참조하십시오.

그러나 웹 응용 프로그램이 더 많이 사용되고 동시에 방문 할 때 더 많은 메모리를 먹을 수도 있습니다.(!) 결과가 더 있었을 때

, 난 새로운 콩이 만들었 기 때문에 심지어는 액션 메소드를 호출하지 않았다 '다음'을 시도했다가 showNext 같은 '거짓'- 내 옵션에 무엇입니까 사용자가 위의 제한 사항을 고려하여 페이지를 탐색 할 수있게합니까? 빈은 요청 범위이며이의 렌더링 응답 단계이었다로 후속 요청의 요청 값 위상을 적용하는 동안 rendered attribtue의 상태에 대한 책임이있는 속성이 같은 결과를하지 않았기 때문이다

초기 요청. 그 해결책은 이전 질문에서 답을 얻습니다 (자신을 연결 한 것처럼).

인가 그것은 숨겨진 콩 변수를 사용하고 링크를 클릭 할 때 자바 스크립트를 통해 '사실'확인하고 CustomPhaseListener에서 괜찮 - '사실'에 기반으로 showNext을 - 그리고 RESTORE VIEW 단계에서 이 숨겨진 가치? 그것은 가치있는 접근 방식입니까? 토마 호크는 옵션이 정말없는 경우

, 나는 binding<h:inputHidden> 가고 싶어.

예.

private HtmlInputHidden showPrev = new HtmlInputHidden(); // +getter +setter. 

public void setShowPrevValue(Boolean showPrev) { 
    showPrev.setValue(showPrev); 
} 

public Boolean getShowPrevValue() { 
    return (Boolean) showPrev.getValue(); 
} 

<h:inputHidden binding="#{adminBean.showPrev}" /> 
<h:commandLink rendered="#{adminBean.showPrevValue}"> 
    ... 

당신은/얻을 당신의 빈에서 "진짜"부울 값을 설정하려는 경우 대신 마지막 게터/세터를 사용합니다.

+0

+1 중화. – gekrish

+0

구성 요소가 인스턴스화되어 있어야합니다. 그에 따라 코드 예제를 수정했습니다. Btw : 네가 언급 한 'ELException'은 근본 원인으로 NullPointerException을 가져야한다. – BalusC

+0

오, 당신이 당신의 코멘트를 삭제 :) 만약 당신이 행운을 가지고 알려주십시오. – BalusC

관련 문제