سؤال

أحاول أن أكتب servlet مخصصة (لـ Ajax/JSON) والتي أود الإشارة إليها @ManagedBeans بالاسم. آمل أن أتعرض للخريطة:

http://host/app/myBean/myProperty

إلى:

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

هل من الممكن تحميل الفول بالاسم من servlet العادية؟ هل يوجد jsf servlet أو مساعد يمكنني استخدامه؟

يبدو أنني مدلل بحلول الربيع الذي يكون كل هذا واضحًا جدًا.

هل كانت مفيدة؟

المحلول

في servlet ، يمكنك الحصول على طلب الفاصوليا من خلال:

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

وجلسة الفاصوليا من قبل:

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

وتطبيق الفاصوليا المنتشر بواسطة:

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

إذا كنت تعمل في إطار/حاوية قادرة على حقن التبعية ويتم إدارة الفول بواسطة CDI @Named بدلا من JSF @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);
}

هذا يسمح لي بالحصول على الكائن الذي تم إرجاعه بطريقة مكتوبة.

هل جربت مقاربة مثل على هذا الرابط؟ لست متأكدًا إذا createValueBinding() لا يزال متاحًا ولكن يجب الوصول إلى رمز مثل هذا من servlet القديم العادي. هذا لا يتطلب أن يكون الفول موجود بالفعل.

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

يمكنك الحصول على الفول المدارة عن طريق تمرير الاسم:

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

كان لدي نفس المتطلبات.

لقد استخدمت الطريقة أدناه للحصول عليها.

كان لي جلسة النطاق الفول.

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

لقد استخدمت الكود أدناه في طريقة servlet dopost ().

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

لقد حل مشكلتي.

انا استعمل هذا:

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

وبهذه الطريقة ، يمكنك إعادة تشكيل الكود وتتبع الاستخدامات دون مشاكل.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top