2013-03-15 3 views
0
public class LocaleViewHandler extends ViewHandler{ 

    private final ViewHandler base; 

    public LocaleViewHandler(ViewHandler base){ 
     super(); 
     this.base = base; 
    } 
    @Override 
    public Locale calculateLocale(FacesContext context) { 
      Locale locale; 
     HttpSession session = (HttpSession) context.getExternalContext() 
      .getSession(false); 
     if (session != null) { 
      //Return the locale saved by the managed bean earlier 
      locale = (Locale) session.getAttribute("locale"); 
      if (locale == null) { 
       locale= new Locale("en"); 

      } 
      return locale; 
     } 
    return base.calculateLocale(context); 

    } 

    @Override 
    public String calculateRenderKitId(FacesContext arg0) { 
     // TODO Auto-generated method stub 
     return base.calculateRenderKitId(arg0); 
    } 

    @Override 
    public UIViewRoot createView(FacesContext arg0, String arg1) { 
     // TODO Auto-generated method stub 
     return base.createView(arg0, arg1); 
    } 

    @Override 
    public String getActionURL(FacesContext arg0, String arg1) { 
     // TODO Auto-generated method stub 
     return base.getActionURL(arg0, arg1); 
    } 

    @Override 
    public String getResourceURL(FacesContext arg0, String arg1) { 
     // TODO Auto-generated method stub 
     return base.getResourceURL(arg0, arg1); 
    } 

    @Override 
    public void renderView(FacesContext arg0, UIViewRoot arg1) 
      throws IOException, FacesException { 
     // TODO Auto-generated method stub 
     base.renderView(arg0, arg1); 
    } 

    @Override 
    public UIViewRoot restoreView(FacesContext arg0, String arg1) { 
     // TODO Auto-generated method stub 
     return base.restoreView(arg0, arg1); 
    } 

    @Override 
    public void writeState(FacesContext arg0) throws IOException { 
     // TODO Auto-generated method stub 
     base.writeState(arg0); 
    } 

    public ViewHandler getBase() { 
     return base; 
    } 


} 

내부화 예제 작업을 시도하고 있는데 위와 같이 뷰 핸들러를 작성했습니다. 나는 2 개의 로케일 영어와 프랑스어를 가지고있다. 그러나이 핸들러를 작성한 후에. 콘솔에는 오류가 없지만 빈 페이지가 표시됩니다.보기를보기 위해 할 수있는 작업은 무엇입니까?뷰 핸들러를 사용한 내부화는 빈 페이지를 표시합니다.

답변

3

ViewHandler을 작성하는 대신 ViewHandlerWrapper을 확장해야합니다. 구체적인 문제에

public class LocaleViewHandler extends ViewHandlerWrapper { 

    private ViewHandler wrapped; 

    public LocaleViewHandler(ViewHandler wrapped) { 
     this.wrapped = wrapped; 
    } 

    @Override 
    public ViewHandler getWrapped() { 
     return wrapped; 
    } 

    @Override 
    public Locale calculateLocale(FacesContext context) { 
     // Do your thing here. 
    } 

} 

관련없는, 이것은 전적으로 올바른 접근 방식이 아니다. 대신

<f:view locale="#{localeBean.locale}"> 

을 사용해야합니다. Localization in JSF, how to remember selected locale per session instead of per request/view도 참조하십시오.

관련 문제