2014-12-12 2 views
-1

원하는 내용 : 범위가 다른 관리 빈 뷰를 사용하십시오.두 페이지에 ManagedBean ViewScoped

이유 : 한 페이지에서 나는 단지 databe로부터 목록을 얻습니다. 그리고 나는이 일을 위해서만 다른 관리 빈을 원하지 않습니다.

시나리오 :

의 관리 빈 :

import javax.annotation.PostConstruct; 
import javax.faces.bean.ManagedBean; 
import javax.faces.bean.ManagedProperty; 
import javax.faces.bean.ViewScoped; 
import javax.faces.context.FacesContext; 

@ManagedBean 
@ViewScoped 
public class MyManagedBean implements Serializable { 

    @PostConstruct 
    public void inicio() { 

     //used in page page1.xhtml 
     if (FacesContext.getCurrentInstance().getViewRoot().getViewId().contains("page1")) { 
      methodDoThingsPage1(); 
     } 

     //used in page2.xhtml 
     if (FacesContext.getCurrentInstance().getViewRoot().getViewId().contains("page2")) { 
      methodDoThingsPage2(); 
     } 
    } 

    public String detail(Object object) { 
     do(object); 
     return "page2?faces-redirect=true"; 
    } 
} 

내 페이지 :

내 page1.xhtml

<p:column> 
    <p:commandButton action="#{myManagedBean.detail(object)}"> 
</p:column> 

내가 생각한 것 :page1의 버튼을 클릭하면 postconstruct에서 methodDoThingsPage2 만 해고됩니다. 그러나 두 방법 모두 methodDoThingsPage1methodDoThingsPage2이 (가) 해고되고 있습니다.

무엇이 잘못 되었나요? 세부 방법이 page2으로 리디렉션되는 이유는 methodDoThingsPage1도 해고 되었습니까?

<f:metadata> 
    <f:viewAction action="#{MyManagedBean.init}"/> 
</f:metadata> 

이 JSF 파일의 시작 부분에이 라인을 추가하고 관리 빈에서 @PostConstruct 주석을 제거합니다

답변

0

잘 해결되었습니다.

문제는 "page1"과 "page2"문자열이 다른 URL에서 사용되고 있다는 것이 었습니다. 그럼 내가 사용 :

FacesContext.getCurrentInstance().getViewRoot().getViewId().endsWith("page1.xhtml"); 

또는

FacesContext.getCurrentInstance().getViewRoot().getViewId().endsWith("page2.xhtml"); 
1

는 사용 JSF를 초기화하는이 방법은 빈 대신 @PostConstruct 관리.

+0

는이를 사용하여 더 나은 연습을? – ulima69

+0

일단 관리 빈에서'@ PostConstruct'에 문제가 발생하면 해결책이되었습니다. 나는 당신의 문제가 다른 해결책을 가지고 있다고 생각합니다. – Everv0id

0

이렇게하는 것이 좋습니다. 별도의 두 관리 Bean을 가져야합니다.

생각해보십시오. 코드에 if 상태를 많이 배치해야한다고 생각합니까? 또한 많은 문제를 일으킬 수있는 뷰의 이름을 사용하고 있습니다. 보기의 이름을 수정하면 어떻게 될까요? 코드를 사용하는 곳마다 수정해야합니다.

0

두 페이지의 공통 작업에 기본 클래스를 사용하고 비슷한 경우 두 개의 managedbean을 상속합니다. if's를 사용하는 것보다 낫지 만, 이렇게하면 두 개 이상의 managedbean을 가질 수 있습니다. (또한 다른 클래스)

관련 문제