কোনও সার্লেট সম্পর্কিত সম্পর্কিত শ্রেণিতে নামেই জেএসএফ পরিচালিত শিম পান


101

আমি একটি কাস্টম সার্লেট লিখতে চেষ্টা করছি (এজ্যাক্স / জেএসএনের জন্য) যাতে আমি @ManagedBeansনামটি দিয়ে আমার উল্লেখ করতে চাই । আমি মানচিত্রের আশা করছি:

http://host/app/myBean/myProperty

প্রতি:

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

নিয়মিত সার্লেট থেকে নাম নিয়ে কোনও শিম লোড করা সম্ভব? আমি কি এর জন্য কোনও জেএসএফ সার্লেট বা সহায়তাকারী ব্যবহার করতে পারি?

আমি স্প্রিংয়ের দ্বারা ক্ষতিগ্রস্থ বলে মনে হচ্ছে যেখানে এটি খুব স্পষ্ট।


আমি নিশ্চিত আপনি JSF / এল বাইরে এই নতুন টীকা ব্যবহার করতে পারে না, কিন্তু আমি JSR 299 বৈশিষ্ট দিকে তাকিয়ে শুরু করতে চাই: jcp.org/en/jsr/detail?id=299
McDowell

অনুরূপ সমস্যা নিয়ে সমস্যাযুক্ত অন্যান্য ব্যক্তিরাও বিপিএক্যাটেলগ.দেব.জভা.এন.এ.এক্স.এক্স / জেএসএফ- এজাক্স পরীক্ষা করতে পারেন (নাম দিয়ে মটরশুটি না পেয়ে ম্যাপিং / হ্যান্ডলিংয়ের জন্য অনুরোধ করেছেন)
কনরাড গারুস

উত্তর:


263

সার্ভলেট ভিত্তিক নিদর্শনগুলিতে যেমন @WebServlet, @WebFilterএবং @WebListener, আপনি একটি "প্লেইন ভ্যানিলা" জেএসএফ @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");

নোট করুন যে এটি পূর্বশর্ত যে শিমটি ইতিমধ্যে জেএসএফ দ্বারা স্বতঃআরিত হয়েছে। অন্যথায় এগুলি ফিরে আসবে null। এরপরে আপনাকে ম্যানুয়ালি মটরশুটি তৈরি করতে হবে এবং ব্যবহার করতে হবে setAttribute("beanName", bean)


আপনি যদি @Namedজেএসএফ ২.৩ এর পরিবর্তে সিডিআই ব্যবহার করতে সক্ষম হন @ManagedBeanতবে এটি আরও বেশি সহজ, বিশেষত কারণ আপনার আর ম্যানুয়ালি মটরশুটি তৈরি করার দরকার নেই:

@Inject
private Bean bean;

মনে রাখবেন যে আপনি যখন ব্যবহার করছেন তখন এটি কাজ করবে না @Named @ViewScopedকারণ শিমটি কেবলমাত্র জেএসএফ দর্শন রাষ্ট্রের দ্বারা চিহ্নিত করা যেতে পারে এবং এটি কেবল তখনই উপলভ্য হবে যখন FacesServletডাকা হবে। এর আগে যে ফিল্টারটি চলে তার আগে কোনও @Injectএড অ্যাক্সেস করা @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");

আরো দেখুন:


9
আপনি শিমটি ইনজেকশন দেওয়ার বিষয়ে দ্বিতীয় পরামর্শটি এত আশ্চর্যরকম সহজ ছিল যে আমি একেবারেই উপেক্ষা করেছি। সর্বদা হিসাবে, আপনার প্রতিক্রিয়া বিন্দু থেকে নিখুঁত। এখানে আপনার কাজের জন্য অনেক ধন্যবাদ।
jnt30

2
এর মধ্যে (জেএসএফ ২.২ হিসাবে কথা বলা) দেখে মনে হচ্ছে পদ্ধতিটি মূল্যায়নের এক্সপ্রেসগেটটি তৃতীয় প্যারামিটারের সাহায্যে প্রসারিত হয়েছিল যা প্রত্যাশিত শ্রেণিকে নির্দিষ্ট করার অনুমতি দেয় সুতরাং কাস্টিং আর প্রয়োজন হবে না। PostBean bean = context.getApplication().evaluateExpressionGet(context, "#{beanName}", PostBean.class);
মার্ক জুচলি

1
@ মার্ক: শুরু থেকেই ছিল। আমি অনুমান করি যে একটি কপিপস্ট ভুল থেকে কেবল একটি বাকী ছিল। উত্তর সংশোধন করা হয়েছে। জানানোর জন্য আপনাকে ধন্যবাদ।
বালুসসি

FacesContextসরল জাভা বর্গের মধ্যে staticইউটিলিটি পদ্ধতিটি findBean()সংজ্ঞায়িত করা সত্ত্বেও উপলব্ধ । জেএসএফ দ্বারা পরিচালিত নয় এমন সরল জাভা ক্লাসে এটি কীভাবে পাওয়া যায়?
ক্ষুদ্র

1
@ টিনি: এটিকে একই থ্রেডের মধ্যে একটি জেএসএফ শিল্পকর্ম দ্বারা ডাকা হয়।
বালাসসি

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

এটি আমাকে টাইপ করা পদ্ধতিতে ফিরে আসা জিনিসটি পেতে দেয়।


3
এটি ইতিমধ্যে বর্তমানে গৃহীত উত্তর এবং এমনকি আরও সুবিধাজনক উপায়ে আচ্ছাদিত রয়েছে ( Classযুক্তিটি এই নির্মাণে অপ্রয়োজনীয়)।
বালাসসি

3

আপনি কি এই লিঙ্কে মত একটি পদ্ধতির চেষ্টা করেছেন? আমি নিশ্চিত না createValueBinding()এখনও পাওয়া যায় কিনা তবে এই জাতীয় কোডটি সরল পুরানো সার্লেট থেকে অ্যাক্সেসযোগ্য হওয়া উচিত। এটি ইতিমধ্যে বিদ্যমান শিম প্রয়োজন।

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

এটি সম্ভবত নিয়মিত সার্লেটে কাজ করবে না। ফেসস কনটেক্সটটি হ'ল জেএসএফ লাইফসাইকেলের (সাধারণত ফেসস সার্লেট) সেট আপ করা প্রতি-অনুরোধ থ্রেড-লোকাল আর্টফ্যাক্ট।
ম্যাকডোয়েল

7
4 বছর আগে জেএসএফ ১.২ থেকে ভ্যালুবাইন্ডিং হ্রাস করা হয়েছে।
বালুসসি

@ বালুসসি: এটি দেখায় যে আমি কতটা হালাল। একত্রে, গবেষণার কৌশলগুলির জন্য অনুসন্ধান ইঞ্জিন ব্যবহার করা সমস্ত পুরানো তথ্যের সাথে প্রতিক্রিয়াশীল হতে চলেছে। @ এমসিডোয়েল: এটি বাস্তবে উপলব্ধি করে। আমি কী ঘটছে তা দেখার জন্য একটি পরীক্ষা করব।
জেমস পি।

3

নামটি পাস করে আপনি পরিচালনা করা শিমটি পেতে পারেন:

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

আমি এটি একটি সার্লেট থেকে চেষ্টা করার চেষ্টা করি কিন্তু এটি কাজ করে না।
ফার্নান্দো পাই

0

আমারও একই চাহিদা ছিল।

এটি পেতে আমি নীচের উপায়টি ব্যবহার করেছি।

আমি সেশন স্কোপ শিম ছিল।

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

আমি আমার সার্লেলেট ডপপস্ট () পদ্ধতিতে নীচের কোডটি ব্যবহার করেছি।

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

এটি আমার সমস্যার সমাধান করেছে।


আপনি কোন ধরনের সার্লেট ব্যবহার করেন? সাথী
ফার্নান্দো পাই

1
এটি এইচটিপি সার্ভলেট।
অনিল

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

এইভাবে আপনি আপনার কোডটি রিফ্যাক্টর করতে পারেন এবং সমস্যা ছাড়াই ব্যবহারগুলি ট্র্যাক করতে পারেন।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.