ব্যাকিং শিম (@ ম্যানেজডবিয়ান) বা সিডিআই বিনস (@ নামযুক্ত)?


109

আমি সবেমাত্র কোর জাভা সার্ভার ফেসস, 3 য় এডের মাধ্যমে পড়া শুরু করেছি এবং তারা এটি (জোর আমার):

এটি aতিহাসিক দুর্ঘটনা যে জেএসএফ পৃষ্ঠাগুলিতে ব্যবহার করা যায় এমন মটরশুটির জন্য দুটি পৃথক প্রক্রিয়া, সিডিআই মটরশুটি এবং জেএসএফ পরিচালিত মটরশুটি রয়েছে। আমরা আপনাকে সিডিআই মটরশুটি ব্যবহার করার পরামর্শ দিই যদি না আপনার অ্যাপ্লিকেশনটি অবশ্যই টমক্যাটের মতো সরল সার্লেট রানারের উপর কাজ করে।

কেন? তারা কোন ন্যায়সঙ্গততা প্রদান করে না । আমি @ManagedBeanগ্লাস ফিশ 3 তে চলতে থাকা একটি প্রোটোটাইপ অ্যাপ্লিকেশনটিতে সমস্ত মটরশুটি ব্যবহার করছি, এবং আমি সত্যিই এটির সাথে কোনও সমস্যা লক্ষ্য করিনি। আমি বিশেষত থেকে স্থানান্তরিত @ManagedBeanকরতে কিছু মনে করি না @Named, তবে কেন আমাকে বিরক্ত করা উচিত তা জানতে চাই ।



4
@ বোজো: এই প্রশ্নটি বেশ অনুরূপ, তবে প্যাসকের উত্তরটি কয়েকবার পড়ার পরেও আমি বুঝতে পারি না কেন সিডিআই আরও বেশি উন্নত। আমি সিডিআই জানি না এবং এটি "আরও ভাল" হওয়ায় এটি শিখতে পেরে আমি আনন্দিত। কেন এটা ভাল?
ম্যাট বল

"যদি না আপনার অ্যাপ্লিকেশনটি অবশ্যই টমক্যাটের মতো সরল সার্লেট রানারের উপর কাজ করে" আমি কেবল টমক্যাট ব্যবহার করি এবং আমি সিডিআইকে দৃ strongly়ভাবে প্রস্তাব দিই। টমক্যাট এটি
ঠিকঠাকভাবে

1
@ কার্লকিল্ডন "প্লেইন সার্লেটলেট রানার" একটি সিডিআইবি সক্ষম সার্ভলেট ধারককে বোঝায়। লেখার সময় টমকেট সিডিআই সমর্থন করেনি বেশ কিছুটা যাদু ছাড়া।
থরবজর্ন রাভন অ্যান্ডারসন

উত্তর:


64

সিডিআই প্লেইন জেএসএফের চেয়ে বেশি পছন্দ করা হয় কারণ সিডিআই জাভা-ই-ওয়াইড নির্ভরতা ইনজেকশনটির জন্য অনুমতি দেয়। আপনি POJO গুলিও করতে পারেন এবং সেগুলি পরিচালনা করতে পারেন। জেএসএফের সাহায্যে আপনি কেবল সিডিআই দিয়ে যা যা করতে পারেন তার একটি উপসেট ইনজেক্ট করতে পারেন।


সুতরাং মূলত, আমি সিডিআই সহ প্রায় কোনও ক্লাসের ( যেমন "সঠিক জিনিস" রয়েছে - এটি কী, কেবল একটি নো-অর্গ কনস্ট্রাক্টর? ) @ManagedBeanইনজেক্ট করতে পারি, যখন আমি যদি সরল সাথে ইঞ্জেকশন করতে চাই তবে আমাকে ব্যবহার করতে হবে JSF?
ম্যাট বল

3
@ ম্যাটবাল ম্যাট আপনার বছর পরে, আপনি এই স্থানান্তর সম্পর্কে মন্তব্য করতে পারেন?
Koray Tugay

5
@ KorayTugay আমি জুন ২০১১ সাল থেকে এই কোডটি স্পর্শ করি নি তবে আমি সিডিআইতে চলে এসেছি এবং জিনিসগুলি ঠিকঠাক কাজ করেছে। আপনি যদি আমার স্মৃতিশক্তি পেয়ে থাকেন তবে সুনির্দিষ্ট কোনও প্রশ্নের উত্তর দিতে পেরে আমি খুশি।
ম্যাট বল

170

সিডিআই ব্যবহার করুন।

JSF 2.3 অনুযায়ী, @ManagedBeanহয় অবচিত । আরও দেখুন বৈশিষ্ট ইস্যু 1417 । এর অর্থ এটি বেছে @ManagedBeanনেওয়ার কারণ নেই @Named। এটি প্রথম মোজারার ২.৩.০ বিটা সংস্করণ এম06 এ প্রয়োগ করা হয়েছিল।

এখানে চিত্র বর্ণনা লিখুন


ইতিহাস

মূল পার্থক্যটি হ'ল, @ManagedBeanজেএসএফ কাঠামো দ্বারা পরিচালিত হয় এবং এটি কেবল @ManagedPropertyঅন্য জেএসএফ পরিচালিত মটরশুটিগুলির মাধ্যমে উপলব্ধ। @NamedCDI ফ্রেমওয়ার্ক মাধ্যমে আবেদন সার্ভার (ধারক) দ্বারা পরিচালিত এবং মাধ্যমে হয় @Injectমত একটি ধারক পরিচালিত হস্তনির্মিত বস্তু যে কোন ধরণের জন্য উপলব্ধ @WebListener, @WebFilter, @WebServlet, @Path, @Stateless, ইত্যাদি এবং এমনকি একটি JSF @ManagedBean। অন্য দিক থেকে, @ManagedPropertyকোনও বা অন্য কোনও ধারক পরিচালিত শিল্পকর্মের অভ্যন্তরে কাজ করে না@Named । এটি কেবলমাত্র ভিতরেই কাজ করে @ManagedBean

আর একটি পার্থক্য হ'ল সিডিআই প্রকৃতপক্ষে প্রতি-অনুরোধ / থ্রেড ভিত্তিতে লক্ষ্য স্কোপে প্রক্সিগুলি প্রেরণকারী প্রক্সিগুলিকে ইনজেকশন দেয় (যেমন কীভাবে ইজেবি ইনজেকশন দেওয়া হয়েছে)। এই প্রক্রিয়াটি বিস্তৃত সুযোগের শিমের মধ্যে একটি সংকীর্ণ সুযোগের শিমকে ইনজেকশনের অনুমতি দেয়, যা জেএসএফ দিয়ে সম্ভব নয় @ManagedProperty। JSF "উদ্বুদ্ধ" এখানে (, এছাড়াও যে ঠিক কেন একটি সেটার প্রয়োজন বোধ করা হয় যখন একটি সেটার আবাহন করার মাধ্যমে সরাসরি শারীরিক উদাহরণস্বরূপ না সঙ্গে প্রয়োজনীয় @Inject)।

সরাসরি কোনও অসুবিধা না হলেও - অন্যান্য উপায় রয়েছে - এর পরিধিটি @ManagedBeanকেবল সীমাবদ্ধ। অন্য দৃষ্টিকোণ থেকে, আপনি যদি "অত্যধিক" প্রকাশ করতে চান না @Inject, আপনি কেবল আপনার পরিচালিত মটরশুটি রাখতে পারেন @ManagedBean। এটা protectedবনাম মত public। কিন্তু এটি আসলে গণনা করে না।

কমপক্ষে, জেএসএফ ২.০ / ২.১-তে, সিডিআই দ্বারা জেএসএফ ব্যাকিং শিমের পরিচালনার বৃহত্তম অসুবিধাটি হ'ল সিডিআই এর সমতুল্য নেই @ViewScoped@ConversationScopedঘনিষ্ঠ আসে, কিন্তু এখনও ম্যানুয়ালি শুরু এবং বাঁধন প্রয়োজন এবং এটি একটি কুশ্রী appends cidফলাফল URL গুলিতে অনুরোধ প্যারামিটার। জাইএসএফের সিডিআইতে সম্পূর্ণ স্বচ্ছভাবে ব্রিজ দিয়ে মাইফিসস সিওডি সহজ করে তোলে javax.faces.bean.ViewScopedযাতে আপনি কেবল এটি করতে পারেন @Named @ViewScoped, তবে windowIdএটি সরল ভ্যানিলা পৃষ্ঠা-পৃষ্ঠা-পৃষ্ঠা নেভিগেশনে, ফলাফলের URLগুলিতে একটি কুৎসিত অনুরোধের প্যারামিটার যুক্ত করে। ওমনিফিসগুলি একটি সত্য সিডিআই দিয়ে এগুলি সমাধান করে @ViewScopedযা স্বেচ্ছাসেবীর অনুরোধ প্যারামিটারের পরিবর্তে শিমের ক্ষেত্রটি জেএসএফ দেখার অবস্থার সাথে সংযুক্ত করে।

জেএসএফ ২.২ (যা এই প্রশ্ন / উত্তরের 3 বছর পরে প্রকাশিত হয়) @ViewScopedএর বাক্সের স্বাদে একটি নতুন সম্পূর্ণ সিডিআই সুসংগত টীকা সরবরাহ করে javax.faces.view.ViewScoped। জেএসএফ ২.২ এমনকি সিডিআই-সহ কেবল আসে @FlowScopedযার @ManagedBeanসমতুল্য নেই, এর ফলে জেএসএফ ব্যবহারকারীদের সিডিআইয়ের দিকে ঠেলে দেয়। প্রত্যাশাটি হ'ল @ManagedBeanএবং বন্ধুরা জাভা EE 8 অনুযায়ী অবমানিত হবে you're আপনি যদি এখনও ব্যবহার করছেন তবে @ManagedBeanভবিষ্যতে আপগ্রেড পাথের জন্য প্রস্তুত হতে সিডিআইতে স্যুইচ করার দৃ strongly় পরামর্শ দেওয়া হচ্ছে। সিডিআই জাভা ইই ওয়েব প্রোফাইলের সামঞ্জস্যপূর্ণ পাত্রে যেমন ওয়াইল্ডফ্লাই, টমইই এবং গ্লাস ফিশে সহজেই উপলব্ধ। টমক্যাটের জন্য আপনাকে এটিকে আলাদাভাবে ইনস্টল করতে হবে ঠিক যেমনটি আপনি জেএসএফের জন্য ইতিমধ্যে করেছিলেন। টমকেটে সিডিআই ইনস্টল করবেন কীভাবে দেখুন ?


4
আমি তৈরি করেছি beans.xml, রূপান্তরিত @ManagedBeanকরতে ব্যাকিং মটরশুটি @Named, এবং রূপান্তরিত @ManagedPropertyকরার @Inject। সমস্ত বিশ্বের সঙ্গে ভাল হয়। তবে, আমি যদি আমার @EJBটীকাগুলি এতে পরিবর্তন করি তবে বার্তা সহ @Injectমোতায়েন ব্যর্থ হয় ( org.jboss.weld.exceptions.DeploymentException) WELD-001408 Injection point has unsatisfied dependencies। আমি কি আসলেই @Injectকোনও @Namedবিন -ইন্টারফেস ইজেবিগুলিকে একটি শিমের সাথে ইনজেকশনের জন্য ব্যবহার করা উচিত, বা আমার সাথে থাকা উচিত @EJB? EJB গুলি একটি EJB জারে প্যাকেজ করা হয়, যেমন ওয়ার যেমন আমার সিডিআই মটরশুটি থাকে তেমন EAR তে।
ম্যাট বল

এটা ঠিক কাজ করা উচিত। আপনি কি এখনও বর্তমান ওয়েল্ড সংস্করণ দিয়ে এই সমস্যার মুখোমুখি?
বালাসসি

হায়, আমি বলতে পারছিলাম না। এই প্রশ্নটি 2 জন নিয়োগকর্তা এবং> 2 বছর আগে। বোঝোর জবাব সম্পর্কে আমার পুরানো মন্তব্যের ভিত্তিতে, আমি অবশ্যই সিডিআই / এ চলে এসেছি @Named
ম্যাট বল

"মাইফিসস সিওডি পুরোপুরি স্বচ্ছভাবে জেএসএফের জাভ্যাক্স.ফেসস.ইবিএন.ভিউসস্কিপটি সিডিআইতে ব্রিজ করে এটিকে আরও সহজ করে তোলে যাতে আপনি কেবল এটি করতে পারেন @Named @ViewScoped, তবে এটি একটি কুরুচিপূর্ণ উইন্ডো যুক্ত করে ফলাফলের URLগুলিতে অনুরোধের প্যারামিটার যুক্ত করে, সরল ভ্যানিলা পৃষ্ঠায় পৃষ্ঠা নেভিগেশনেও" " নোট করুন যে ডেল্টস্পাইকের সাথে এটি আর সত্য হয় না। উইন্ডো স্কোপের দরকার না থাকলে আপনি উভয় ডিএসআইডি এবং উইন্ডোআইডি ইউআরএল প্যারামিটার অক্ষম করতে পারেন।
জানু

1
@Jan: এবং ইতিমধ্যে, OmniFaces একটি JSF হয়েছে 2.2 মত @ViewScopedJSF 2.0 / 2.1 জন্য: showcase.omnifaces.org/cdi/ViewScoped
BalusC

16

জাভা ইই 6 এবং সিডিআই সহ আপনার পরিচালিত শিমের জন্য আলাদা বিকল্প রয়েছে have

  • @javax.faces.bean.ManagedBeanজেএসআর 314 উল্লেখ করা হয় এবং জেএসএফ 2.0 এর সাথে প্রবর্তিত হয়েছিল। মূল লক্ষ্যটি ছিল একটি জেএসএফ পৃষ্ঠার অভ্যন্তরে শিমটি ব্যবহার করার জন্য ফেস-কনফিগারেশন.এমএমএল ফাইলের কনফিগারেশন এড়ানো।
  • @javax.annotation.ManagedBean(“myBean”) এটি JSR 316 দ্বারা সংজ্ঞায়িত করা হয়েছে It এটি জাভা EE এর অন্য কোথাও ব্যবহারের জন্য জেএসএফ পরিচালিত মটরশুটিকে সাধারণীকরণ করে
  • @javax.inject.Named(“myBean”) উপরের মতো প্রায় একই রকম, সিডিআই সক্রিয় করার জন্য আপনার ওয়েব / ওয়েবে-আইএনএফ ফোল্ডারে একটি beans.xML ফাইলের প্রয়োজন নেই।

1
প্রথম দুটির মধ্যে পার্থক্য কী?
ম্যাট বল

প্রথম টীকাটির লক্ষ্য হ'ল জেএসএফ-এর ব্যবহারের জন্য ফেস-কনফিগারেশন.এক্সএমএলে বিন বিন্যাসটি প্রতিস্থাপন করা। দ্বিতীয়টি ধারণাটি "জাভা ই 6 ধারক" এ অনুলিপি করে। এটিতে আরও ফাংশন রয়েছে (যেমন @ পোস্টকন্সট্রাক্ট এবং @ প্রিস্ট্রোস্ট্রয় টীকা), তবে জেএসএফ পৃষ্ঠা দ্বারাও প্রকাশযোগ্য (এক্সপ্রেশন ভাষা সহ) by
h2mch

1
তোমার একটা beans.xmlফাইল দরকার কেন ? আজও কি এটি সত্য?
থুফির

2
না, জাভাএই with এর সাথে আপনার আর beans.xML দরকার নেই। দেখতে docs.oracle.com/javaee/7/tutorial/doc/cdi-adv001.htm
h2mch

1
জাভাএই With এর সাথে আপনার বিনস.এক্সএমএল দরকার নেই: ডকস.ওরকল / জাভা / //tutorial/cdi-adv001.htm (সঠিক লিঙ্ক) ব্লগস.ওরকল / টায়াকুরিয়াম / সেন্ট্রি /… (জাভাতে ডিফল্ট সিডিআই সক্ষমকরণ EE 7)
এম আতিফ রিয়াজ

2

আমি গ্লাস ফিশ 3.0.০.১ এ সিডিআই ব্যবহার করছিলাম, তবে এটি কাজ করতে আমাকে সিয়াম 3 ফ্রেমওয়ার্ক (ওয়েল্ড) আমদানি করতে হয়েছিল। এটি বেশ ভাল কাজ করেছে।

গ্লাসফিশে ৩.১ সিডিআই কাজ করা বন্ধ করে দিয়েছিল এবং সিয়াম ওয়েল্ড এটি দিয়ে কাজ করা বন্ধ করে দিয়েছে। আমি এটিতে একটি ত্রুটি খুলেছি তবে এটি এখনও ঠিক করে দেখিনি। আমাকে আমার সমস্ত কোডটি জাভ্যাক্স.ফেসগুলি ব্যবহার করে রূপান্তর করতে হয়েছিল * * টীকাগুলি তবে তারা সিডিআইতে কাজ করার পরে আমি আবার ফিরে যেতে চাই।

আমি সম্মত হই যে আপনার সিডিআই ব্যবহার করা উচিত, তবে একটি সমস্যা যা আমি এখনও সমাধান করতে দেখিনি তা হ'ল @ ভিউস্কোপড টিকাটি কী করা উচিত। আমার প্রচুর কোড রয়েছে যা এটি নির্ভর করে। আপনি যদি @ManagedBean এর সাথে না ব্যবহার করেন তবে @ ভিউস্কোপেড কাজ করে কিনা তা পরিষ্কার নয়। যদি কেউ এটি স্পষ্ট করতে পারে তবে আমি এটির প্রশংসা করব।


-1

সিডিআইতে যাওয়ার জন্য একটি ভাল কারণ: আপনার কাছে একটি সাধারণ সেশন-স্কোপড রিসোর্স থাকতে পারে (উদাহরণস্বরূপ ব্যবহারকারীর প্রোফাইল) @Inject'জেএসএফ পরিচালিত মটরশুটি এবং আরআরএসটি পরিষেবা উভয় (যেমন, জার্সি / জ্যাকস-আরএস) এড করতে পারেন।

অন্যদিকে, @ViewScopedজেএসএফের সাথে লেগে থাকার জন্য একটি বাধ্যতামূলক কারণ @ManagedBean- বিশেষত উল্লেখযোগ্য এজেএক্স সহ কোনও কিছুর জন্য। সিডিআইতে এর কোনও মানক প্রতিস্থাপন নেই is

দেখে মনে হচ্ছে এটির @ViewScopedসিডিআই মটরশুটিগুলির জন্য পছন্দসই টীকায়নের জন্য কিছুটা সমর্থন থাকতে পারে তবে আমি এটির সাথে ব্যক্তিগতভাবে খেলিনি।

http://seamframework.org/Seam3/FacesModule

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