2011-01-27 6 views
1

쿼리 문자열을 통해 ID 번호를 받고 상대 기사를 보여주는 페이지가 있습니다.JSF 2.0 쿼리 문자열 전파

나는 preRenderView 이벤트와 <f:viewParams> 사용하고 데이터는 @PostConstruct 방법에 DB에서로드 :

@Named 
@RequestScoped 
public class Bean { 
    private Long id; 

    @PostCostruct 
    public void init() { 
     if (this.id != null) { 
      // load data from db 
     } 
    } 

    public String modify() { 
     // update data 
    } 
} 

나는 데이터가 올바르게로드 된 페이지를 호출하지만 클릭하면 버튼을 수정하면

<h:commandButton value="Modify" action="#{bean.modify}" /> 

쿼리 문자열 매개 변수가 Bean으로 전송되지 않아 데이터가로드되지 않으므로 오류가 발생합니다.

어떻게 쿼리 문자열 매개 변수를 전파 할 수 있습니까?

답변

1

afaik, modify 메서드는 "? includeViewParams = true"로 끝나는 동작 문자열을 반환해야합니다. 그런 다음보기 매개 변수 만 전달됩니다 (이론적으로는 얼굴 - 포함 -보기 매개 변수와 함께 작동해야합니다. 얼굴을 포함하지 않을 경우 눈이 덜 붉어집니다).

추가 : (주석에 설명 된대로) init 메소드에서 매개 변수를 사용해야하는 경우 JSF 관점에서 보면 실제 입력이 아닙니다. 유효성 검사, 변환 등의 작업은 수행하지 않습니다. 그러나 원시 값을 가져 오려면 다음을 사용하십시오.

@ManagedParam("#{param.id}") 
private String id; 

// getter and setter for param goes here (obligatory!) 

init을 호출하기 전에 ID가 삽입됩니다. 이는 기본적으로 viewparams를 둘러 보는 방법입니다. String이 아닌 다른 형식을 사용할 수도 있지만 변환 오류는 예외로 끝날 수 있으므로 문자열로 남겨두고 모든 변환을 수동으로 수행하는 것이 좋습니다.

그러나 문제의 루트는 @PostConstruct의 오용으로 보입니다. 아마도 다음과 같이 사전 렌더링 단계를 완료하고 싶을 것입니다.

<f:event type="preRenderView" listener="#{beanThatNeedsId.init}"/> 
+0

그러나 메소드가 호출되기 전에 메소드가 반환되기 전에 init 메소드에서도 id 매개 변수가 필요합니다. – Alf

+0

Uhmmm ... 이해합니다. 그러나 params를 (를) 얻는 것은 다른 질문입니다. 당신은 매개 변수를 프로빙하는 방법을 물었고, 나는 대답했다. – fdreger

+0

오, 글쎄, 나는 대답을 확장합니다. – fdreger