web-dev-qa-db-ja.com

サーブレット関連のクラスでJSFマネージドBeanを名前で取得する

名前で@ManagedBeansを参照したいカスタムサーブレット(AJAX/JSON用)を作成しようとしています。私はマップしたいと思っています:

http://Host/app/myBean/myProperty

に:

@ManagedBean(name="myBean")
public class MyBean {
    public String getMyProperty();
}

通常のサーブレットから名前でBeanをロードすることは可能ですか?使用できるJSFサーブレットまたはヘルパーはありますか?

私はこのすべてがあまりにも明白である春に甘やかされているようです。

98
Konrad Garus

サーブレットでは、次の方法でリクエストスコープのBeanを取得できます。

Bean bean = (Bean) request.getAttribute("beanName");

およびセッションスコープBean:

Bean bean = (Bean) request.getSession().getAttribute("beanName");

およびアプリケーションスコープBean:

Bean bean = (Bean) getServletContext().getAttribute("beanName");

依存性注入可能なフレームワーク/コンテナで実行しており、BeanがJSFの @Named ではなくCDIの @ManagedBean で管理されている場合、さらに簡単です:

@Inject
private Bean bean;

スコープに関係なく、実際にFacesContextにいるとき(つまり、現在のHTTPリクエストは FacesServlet =)、通常のJSF2の方法は Application#evaluateExpressionGet() を使用しています:

FacesContext context = FacesContext.getCurrentInstance();
Bean bean = context.getApplication().evaluateExpressionGet(context, "#{beanName}", Bean.class);

これは次のように便利です。

@SuppressWarnings("unchecked")
public static <T> T findBean(String beanName) {
    FacesContext context = FacesContext.getCurrentInstance();
    return (T) context.getApplication().evaluateExpressionGet(context, "#{" + beanName + "}", Object.class);
}

次のように使用できます。

Bean bean = findBean("bean");

ただし、すでに @ManagedBean の内部にいる場合は、 @ManagedProperty を使用すると宣言的であるため、よりクリーンになります。

@ManagedProperty("#{bean}")
private Bean bean;
258
BalusC

次の方法を使用します。

public static <T> T getBean(final String beanName, final Class<T> clazz) {
    ELContext elContext = FacesContext.getCurrentInstance().getELContext();
    return (T) FacesContext.getCurrentInstance().getApplication().getELResolver().getValue(elContext, null, beanName);
}

これにより、返されたオブジェクトを型指定された方法で取得できます。

10
John Yeary

名前を渡すことでマネージドBeanを取得できます。

public static Object getBean(String beanName){
    Object bean = null;
    FacesContext fc = FacesContext.getCurrentInstance();
    if(fc!=null){
         ELContext elContext = fc.getELContext();
         bean = elContext.getELResolver().getValue(elContext, null, beanName);
    }

    return bean;
}
3
Soujanya

このリンクのようなアプローチを試しましたか? createValueBinding()がまだ利用可能かどうかはわかりませんが、このようなコードは、プレーンな古いサーブレットからアクセスできるはずです。これには、Beanがすでに存在している必要があります。

http://www.coderanch.com/t/211706/JSF/Java/access-managed-bean-JSF-from

 FacesContext context = FacesContext.getCurrentInstance();  
 Application app = context.getApplication();
 // May be deprecated
 ValueBinding binding = app.createValueBinding("#{" + expr + "}"); 
 Object value = binding.getValue(context);
3
James P.

同じ要件がありました。

以下の方法で取得しました。

セッションスコープBeanがありました。

@ManagedBean(name="mb")
@SessionScopedpublic 
class ManagedBean {
     --------
}

サーブレットのdoPost()メソッドで次のコードを使用しました。

ManagedBean mb = (ManagedBean) request.getSession().getAttribute("mb");

それは私の問題を解決しました。

0
Anil