2011-02-02 6 views
2

데이터 테이블이있는 페이지가 있습니다. 테이블의 일부 항목이 해당보기 페이지에 연결되기를 원합니다.JSF LINK to View 페이지

<h:dataTable var="bean" value="#{beanServiceImpl.beans}" border="1"> 
    <h:column>#{bean.id}</h:column> 
    </h:dataTable> 

내가 일부 항목에 하이퍼 링크를 추가 할 그들 자신의 ID를 기반으로 그들에게 더 많은 정보를 나타내는 도면 페이지로 이동이 :

예를 들어, 지금은 어떤 링크가있는 테이블이

<h:dataTable var="bean" value="#{beanServiceImpl.beans}" border="1"> 
    <h:column> 
     <a href="viewBean.xhtml?id=#{bean.id}">#{bean.id}</a> 
    </h:column> 
    </h:dataTable> 

ViewBean.xhtml는 다음과 같이 포함됩니다 :

ViewBean.xhtml

,369을
<ul> 
    <li>ID: #{bean.id}</li> 
    <li>Field 1: #{bean.field1}</li> 
    <li>Field 2: #{bean.field2}</li> 
</ul> 

JSF에서 어떻게 구현합니까? 나는 다른 필드에 대한 id를 쿼리하기위한 컨트롤러를 작성해야한다는 것을 알고있다. 하지만 viewBean.xhtml을 비즈니스 로직으로 실행시켜 다른 필드를 가져와 렌더링하는 방법은 무엇입니까?

답변

5

는 BalusC의 대답은 거의 좋은,하지만 작동하지 않습니다 (편집 : 지금 작동).

당신은 이미 매개 변수에 값을 추가하는 방법을 알고 있습니다. BTW, 내가 당신이라면, 나는 <a href>를 사용하지 것이다, 대신 :

<h:link outcome='viewBean'> 
    <f:param name='id' value='#{bean.id}' /> 
</h:link> 

지금은 값을 잡기에 올 때 당신은 선택을해야합니다.

@ManagedProperty("#{param.id}") // this will inject id from param into id 
private Long id; 


// (getters and setters are obligatory) 


@PostConstruct // this will execute init() after id is injected 
public void init() { 

} 

그리고 마지막 : 가장 간단한 귀하의 ID 속성 위에 주석을 추가하는 것입니다 변수가 명명 한 "빈은"개와 고양이 "변수"를 호출 (또는라는 이름의 개를하는 것보다 더 이상 의미가 없습니다 고양이라는). 정보가 전혀 없으며 응용 프로그램의 모든 콩을 구별 할 수 없게 만듭니다 (콩과 식물 관리자를 만들지 않는 한).

+0

답변 해 주셔서 감사합니다. +1 "Bean"이라는 변수에 관해서는 좀 더 일반화되도록 이름을 바꿨으므로 예제로 게시 할 수 있습니다 (field1 및 field2조차도 일반적 임). 나는 매우 익숙하지 만 공개 포럼에서 프로그래밍 질문을 할 때 이것이 적절하다고 생각합니다. 감사. – Steve

2

JSF 2.x라고 가정합니다.

그것은 Bean@PostConstruct 방법을 사용할 수 있습니다 (이것은 기본적으로 뷰로드 할 때마다 bean.setId(request.getParameter("id")) 않음) Bean

@ManagedProperty(value="#{param.id}") 
private Long id; 

이 추가.

@PostConstruct 
public void init() { 
    // Fill model based on id. 
} 
+0

음 내 Bean.java 클래스에서

<h:form> <h:commandLink action="#{bean.populateBean}" value="#{bean.id}"> <f:setPropertyActionListener target="#{bean.id}" value="#{bean.id}" /> </h:commandLink> </h:form> 

, 나는 액션 컨트롤러를 추가했다. 해답은 명백히 잘못되었습니다. 뷰 매개 변수는 표준 얼굴 라이프 사이클의 일부이므로 @PostConstruct가 호출 될 때 요청의 모든 값을 사용할 수 없습니다. 모델 값이 업데이트 될 때까지 기다려야합니다. – fdreger

+0

@fdreger : fixed. – BalusC

+0

안녕하세요 BalusC, 답변 주셔서 감사합니다.나는 우리가 다른 것들을 다루었을 것이라고 생각하기 때문에 아래에 나의 해결책을 게시했다. – Steve

2

이것은 내가 한 일입니다.

public String populateBean(){ 
    Bean bean = BeanServiceImpl.getBean(id); //id was injected by the commandLink 
    this.field1 = tenure.getField1(); 
    this.field2 = tenure.getField2(); 

    return("viewBean"); 
} 

내 ViewBean.xhtml은 동일합니다 :

<ul> 
    <li>ID: #{bean.id}</li> 
    <li>Field 1: #{bean.field1}</li> 
    <li>Field 2: #{bean.field2}</li> 
</ul>