105

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

http://host/app/myBean/myProperty

に:

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

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

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

4

6 に答える 6

266

@WebServlet、、@WebFilterなどのサーブレットベースのアーティファクトでは@WebListener、次の方法で「プレーンバニラ」JSFを取得できます@ManagedBean @RequestScoped

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

@ManagedBean @SessionScopedによって:

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

@ManagedBean @ApplicationScopedによって:

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

これには、BeanがJSFによって事前に自動作成されている必要があることに注意してください。それ以外の場合、これらは戻りnullます。次に、手動でBeanを作成し、を使用する必要がありますsetAttribute("beanName", bean)


@NamedJSF 2.3が非推奨になったため、代わりにCDIを使用できる場合は@ManagedBean、特にBeanを手動で作成する必要がなくなるため、さらに簡単になります。

@Inject
private Bean bean;

@Named @ViewScopedBeanはJSFビューステートによってのみ識別でき、FacesServletが呼び出された場合にのみ使用できるため、これは使用中は機能しないことに注意してください。@Injectしたがって、その前に実行されるフィルターでは、 edにアクセスする@ViewScopedと常にがスローされContextNotActiveExceptionます。


あなたが中@ManagedBeanにいるときだけ、あなたは使うことができます@ManagedProperty

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

@Namedこれは、または@WebServletまたはその他のアーティファクトの内部では機能しないことに注意してください。それは本当に内部@ManagedBeanでのみ機能します。


の中にいない@ManagedBeanが、FacesContextすぐに利用できる(つまり、FacesContext#getCurrentInstance()戻らないnull)場合は、次を使用することもできます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");

参照:

于 2010-04-13T22:50:58.427 に答える
11

私は次の方法を使用します:

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);
}

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

于 2012-12-10T18:10:30.430 に答える
3

このリンクのようなアプローチを試しましたか?まだ利用できるかどうか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);
于 2010-04-13T21:10:02.027 に答える
3

次の名前を渡すことで、マネージド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;
}
于 2014-07-29T19:50:18.973 に答える
0

同じ要件がありました。

私はそれを得るために以下の方法を使用しました。

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

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

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

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

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

于 2016-06-27T11:36:23.420 に答える
-1

私はこれを使用します:

public static <T> T getBean(Class<T> clazz) {
    try {
        String beanName = getBeanName(clazz);
        FacesContext facesContext = FacesContext.getCurrentInstance();
        return facesContext.getApplication().evaluateExpressionGet(facesContext, "#{" + beanName + "}", clazz);
    //return facesContext.getApplication().getELResolver().getValue(facesContext.getELContext(), null, nomeBean);
    } catch (Exception ex) {
        return null;
    }
}

public static <T> String getBeanName(Class<T> clazz) {
    ManagedBean managedBean = clazz.getAnnotation(ManagedBean.class);
    String beanName = managedBean.name();

    if (StringHelper.isNullOrEmpty(beanName)) {
        beanName = clazz.getSimpleName();
        beanName = Character.toLowerCase(beanName.charAt(0)) + beanName.substring(1);
    }

    return beanName;
}

そして、電話してください:

MyManageBean bean = getBean(MyManageBean.class);

このようにして、コードをリファクタリングし、問題なく使用状況を追跡できます。

于 2015-09-11T18:05:27.310 に答える