名前で@ManagedBeans
を参照したいカスタムサーブレット(AJAX/JSON用)を作成しようとしています。私はマップしたいと思っています:
http://Host/app/myBean/myProperty
に:
@ManagedBean(name="myBean")
public class MyBean {
public String getMyProperty();
}
通常のサーブレットから名前でBeanをロードすることは可能ですか?使用できるJSFサーブレットまたはヘルパーはありますか?
私はこのすべてがあまりにも明白である春に甘やかされているようです。
サーブレットでは、次の方法でリクエストスコープの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;
次の方法を使用します。
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);
}
これにより、返されたオブジェクトを型指定された方法で取得できます。
名前を渡すことでマネージド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;
}
このリンクのようなアプローチを試しましたか? 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);
同じ要件がありました。
以下の方法で取得しました。
セッションスコープBeanがありました。
@ManagedBean(name="mb")
@SessionScopedpublic
class ManagedBean {
--------
}
サーブレットのdoPost()メソッドで次のコードを使用しました。
ManagedBean mb = (ManagedBean) request.getSession().getAttribute("mb");
それは私の問題を解決しました。