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 つのロケールがあります。しかし、このハンドラを書いた後。コンソールにエラーはありませんが、空白の白いページが表示されます。ビューを表示するにはどうすればよいですか..

4

1 に答える 1

3

ViewHandlerWrapper独自に記述するのではなく、拡張する必要がありますViewHandler

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}">

代わりは。リクエスト/ビューごとではなく、セッションごとに選択されたロケールを記憶する方法、JSF でのローカライズも参照してください。

于 2013-03-15T13:04:45.457 に答える