কিভাবে সঠিক শিমের সুযোগটি বেছে নেবেন?


381

আমি লক্ষ্য করেছি যে এখানে বিভিন্ন শিমের স্কোপ রয়েছে:

@RequestScoped
@ViewScoped
@FlowScoped
@SessionScoped
@ApplicationScoped

প্রত্যেকের উদ্দেশ্য কী? আমি আমার শিমের জন্য কীভাবে একটি উপযুক্ত সুযোগ পছন্দ করব?


উত্তর:


485

ভূমিকা

এটি শিমের সুযোগ (আজীবন) উপস্থাপন করে। আপনি যদি কোনও বেসল সার্ভলেট ওয়েব অ্যাপ্লিকেশনটির "কভারের আওতায়" কাজ করার সাথে পরিচিত হন তবে এটি বোঝা সহজ: সার্লেলেটগুলি কীভাবে কাজ করে? ইনস্ট্যান্টেশন, সেশনস, ভাগ করা ভেরিয়েবল এবং মাল্টিথ্রেডিং


@Request/View/Flow/Session/ApplicationScoped

একটি @RequestScopedবিন একটি সিঙ্গল এইচটিটিপি অনুরোধ-প্রতিক্রিয়া চক্র হিসাবে দীর্ঘ সময় বেঁচে থাকে (নোট করুন যে একটি অ্যাজাক্স অনুরোধটি একটি একক এইচটিটিপি অনুরোধ হিসাবেও গণনা করা হয়)। একটি @ViewScopedশিম যতদিন বেঁচে হিসাবে আপনি যা ফিরে কল কর্ম পদ্ধতি postbacks একই JSF দৃশ্য সঙ্গে আলাপচারিতার করছি null/ voidকোন গৌণ / পুনর্নির্দেশ ছাড়া। একটি @FlowScopedপ্রজাতি ততক্ষণ বেঁচে থাকে যতক্ষণ না আপনি প্রবাহ কনফিগারেশন ফাইলে নিবন্ধিত দর্শনগুলির নির্দিষ্ট সংগ্রহের মাধ্যমে নেভিগেট করেন। একটি @SessionScopedশিম প্রতিষ্ঠিত এইচটিটিপি অধিবেশন যতক্ষণ বেঁচে থাকে। @ApplicationScopedওয়েব অ্যাপ্লিকেশন চলাকালীন একটি শিম বেঁচে থাকে। লক্ষ্য করুন CDI @Modelমূলত একটি হল বাঁধাধরা জন্য @Named @RequestScoped, তাই একই নিয়ম প্রযোজ্য।

কোন সুযোগটি বেছে নেবে তা পুরোপুরি শিমটি ধারণ করে এবং উপস্থাপন করে এমন ডেটা (রাষ্ট্র) depends @RequestScopedসহজ এবং অ-অজ্যাক্স ফর্ম / উপস্থাপনার জন্য ব্যবহার করুন । @ViewScopedসমৃদ্ধ এজাক্স-সক্ষম গতিশীল দর্শনগুলির জন্য ব্যবহার করুন (এজাক্স ভিত্তিক বৈধতা, উপস্থাপনা, কথোপকথন, ইত্যাদি)। ব্যবহার করুন @FlowScoped"জাদুকর" ( "প্রশ্নাবলী") একাধিক পৃষ্ঠায় উপর ইনপুট ডেটা বিস্তার সংগ্রহের প্যাটার্ন জন্য। ব্যবহারের @SessionScopedক্লায়েন্ট নির্দিষ্ট ডেটার জন্য যেমন লগ-ইন ব্যবহারকারী এবং ব্যবহারকারীর পছন্দ (ভাষা, ইত্যাদি)। @ApplicationScopedঅ্যাপ্লিকেশন প্রশস্ত ডেটা / ধ্রুবকগুলির জন্য ব্যবহার করুন , যেমন ড্রপডাউন তালিকাগুলি যা সবার জন্য একই, বা কোনও বিন্যাসের পরিবর্তনশীল ছাড়াই পরিচালিত মটরশুটি এবং কেবলমাত্র পদ্ধতি রয়েছে।

@ApplicationScopedসেশন / ভিউ / অনুরোধ স্কোপড ডেটার জন্য শিমের অপব্যবহার এটিকে সমস্ত ব্যবহারকারীর মধ্যে ভাগ করে নেওয়া হবে, সুতরাং অন্য যে কেউ একে অপরের ডেটা দেখতে পাবে যা কেবল সাধারণ ভুল। স্কোপড @SessionScopedডেটা দেখার / অনুরোধের জন্য শিমের আপত্তিজনক ব্যবহারের ফলে এটি সমস্ত ট্যাব / উইন্ডোগুলির মধ্যে একক ব্রাউজার সেশনে ভাগ করে নেওয়া যায়, তাই ব্যবহারকারীর অভিজ্ঞতার জন্য খারাপ এমন ট্যাবগুলির মধ্যে স্যুইচ করার পরে প্রতিটি দৃশ্যের সাথে ইন্টারঅ্যাক্ট করার সময় এন্ডুয়েসার অনিয়ন্ত্রিত হতে পারে। স্কোপড @RequestScopedডেটা দেখার জন্য শিমের সাথে আপত্তিজনক ব্যবহারের ফলে স্কোপযুক্ত ডেটা প্রতিটি একক (এজাক্স) পোস্টব্যাকে ডিফল্টরূপে পুনরায় পুনরায় তৈরি করা সম্ভব হবে, সম্ভবত অ-কার্যকারী ফর্মগুলির জন্য ( এছাড়াও এখানে পয়েন্ট 4 এবং 5 দেখুন )। @ViewScopedঅনুরোধ, সেশন বা অ্যাপ্লিকেশন স্কোপেড ডেটার জন্য শিমকে গালি দেওয়া এবং এটিকে আপত্তিজনক ব্যবহার করা@SessionScoped অ্যাপ্লিকেশন স্কোপড ডেটার জন্য বিন ক্লায়েন্টকে প্রভাবিত করে না, তবে এটি অকারণে সার্ভারের মেমরিটি দখল করে এবং এটি সরল অক্ষম।

মনে রাখবেন যে কর্মক্ষেত্রের প্রভাবের ভিত্তিতে সুযোগটি বাছাই করা উচিত নয়, যদি না আপনি সত্যিই কম মেমরির পদচিহ্ন রেখে থাকেন এবং সম্পূর্ণরূপে রাষ্ট্রবিহীন হতে চান; @RequestScopedক্লায়েন্টের অবস্থা বজায় রাখতে আপনাকে অনুরোধ পরামিতিগুলির সাথে একচেটিয়াভাবে মটরশুটি এবং ফিডল ব্যবহার করতে হবে use এছাড়াও নোট করুন যে যখন আপনার কাছে আলাদাভাবে স্কোপযুক্ত ডেটা সহ একটি জেএসএফ পৃষ্ঠা থাকে, তখন এগুলি পৃথক ব্যাকিং শিমগুলিতে ডেটার স্কোপের সাথে মিলিয়ে দেওয়ার পক্ষে একেবারে বৈধ। মটরশুটি @ManagedPropertyজেএসএফ পরিচালিত মটরশুটি বা @Injectসিডিআই পরিচালিত মটরশুটি ক্ষেত্রে কেবল একে অপরকে অ্যাক্সেস করতে পারে ।

আরো দেখুন:


@CustomScoped/NoneScoped/Dependent

এটি আপনার প্রশ্নের মধ্যে উল্লেখ করা হয়নি, তবে (উত্তরাধিকার) জেএসএফও সমর্থন করে @CustomScopedএবং @NoneScoped, যা বাস্তব বিশ্বে খুব কমই ব্যবহৃত হয়। @CustomScopedএকটি কাস্টম পড়ুন আবশ্যক Map<K, Bean>কিছু বৃহত্তর সুযোগ যা উপেক্ষিত হয়েছে মধ্যে বাস্তবায়ন Map#put()এবং / অথবা Map#get()শিম সৃষ্টি উপর আরো বেশি সূক্ষ্ম গ্রেইনড নিয়ন্ত্রণ আছে এবং / অথবা ধ্বংস করতে এ আদেশ।

জেএসএফ @NoneScopedএবং সিডিআই @Dependentমূলত শিমের একক ইএল-মূল্যায়ন যতদিন বেঁচে থাকে। দু'টি ইনপুট ক্ষেত্রের সাথে শিমের সম্পত্তি এবং একটি বিড ক্রিয়াকে নির্দেশ করে একটি কমান্ড বোতাম সহ একটি লগইন ফর্মের কল্পনা করুন, এইভাবে মোট তিনটি EL এক্সপ্রেশন সহ কার্যকরভাবে তিনটি দৃষ্টান্ত তৈরি করা হবে। ব্যবহারকারীর নাম সেট সহ একটি, পাসওয়ার্ড সেট সহ একটি এবং এর উপরে ক্রিয়াটি চালিত হওয়ার জন্য। আপনি সাধারণত এই সুযোগটি কেবল মটরশুটিতে ব্যবহার করতে চান যা শিম যতক্ষণ ইনজেকশন করা হচ্ছে ততক্ষণ বেঁচে থাকা উচিত। সুতরাং যদি একটি @NoneScopedবা @Dependentএকটিতে ইনজেকশন দেওয়া হয় @SessionScoped, তবে এটি @SessionScopedশিমের মতো দীর্ঘকাল বেঁচে থাকবে ।

আরো দেখুন:


ফ্ল্যাশ সুযোগ

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

এটি আসলে পরিচালিত শিমের স্কোপ হিসাবে উপলভ্য নয়, যেমন এর মতো কোনও জিনিস নেই @FlashScoped। ফ্ল্যাশ সুযোগ কেবল ExternalContext#getFlash()পরিচালিত মটরশুটি এবং #{flash}EL এর মাধ্যমে একটি মানচিত্র হিসাবে উপলভ্য ।

আরো দেখুন:


4
আমি মনে করি যে " জেএসএফ-এ ভিউ স্কোপ বিনটি কখন এবং কখন ধ্বংস করা হয়? " এই প্রশ্নের আপনার উত্তরটির একটি প্রসঙ্গ এখানে প্রাসঙ্গিক।
লিই

3
@ কুল্ড: এটি একটি পুরানো সিডিআই স্কোপ এবং জেএসএফ ২.২ এ প্রতিস্থাপিত হয়েছে @FlowScoped(এটি ম্যানুয়ালি শুরু / থামানোর দরকার নেই)।
বালুসসি

1
এবং ডেল্টাসপাইক অতিরিক্তভাবে রয়েছে ViewAccesscopedএবংWindowScoped
কুকলতজে

@ বালুসসি, আমি মনে করি ViewScopedমাইফিসে ২.২-তে শিমের সাথে একটি সমস্যা রয়েছে । আমি বর্তমানে ViewScopedশিম এবং আজাক্স নিয়ে একটি সমস্যার মুখোমুখি , যা আমি এখানে পোস্ট করেছি । মাইফিজস জিরায় এই বিষয়েও আলোচনা রয়েছে।
তাপস বোস

সিডিআই চারটি অন্তর্নির্মিত স্কোপগুলি সংজ্ঞায়িত করে: @RequestScoped @SessionScoped @ApplicationScoped @ConversationScoped আপনার বর্ণিত স্কোপগুলি আলাদা কেন?
হোসেইন আকাশানী

122

জেএসএফ ২.৩ থেকে প্যাকেজ javax.faces.beanপ্যাকেজে সংজ্ঞায়িত সমস্ত বিনের স্কোপগুলি সিডিআই দিয়ে স্কোপগুলি সারিবদ্ধ করার জন্য অবচিত করা হয়েছে। তবুও এগুলি কেবল তখন প্রযোজ্য যদি আপনার শিম @ManagedBeanটিকা ব্যবহার করে । আপনি যদি ২.৩ এর নীচে জেএসএফ সংস্করণ ব্যবহার করে থাকেন তবে শেষে উত্তরাধিকারের উত্তরটি দেখুন।


জেএসএফ ২.৩ থেকে এখানে এমন স্কোপ রয়েছে যা জেএসএফ ব্যাকিং শিমের জন্য ব্যবহার করা যেতে পারে:

1@javax.enterprise.context.ApplicationScoped .: অ্যাপ্লিকেশন সুযোগ ওয়েব অ্যাপ্লিকেশন পুরো সময়কালের জন্য স্থায়ী। সেই সুযোগটি সমস্ত অনুরোধ এবং সমস্ত সেশনের মধ্যে ভাগ করা আছে। আপনার কাছে পুরো অ্যাপ্লিকেশনের জন্য ডেটা থাকলে এটি কার্যকর।

@javax.enterprise.context.SessionScoped : অধিবেশন সমাপ্তি অবধি অধিবেশন প্রতিষ্ঠার সময় থেকে অধিবেশন সুযোগটি স্থায়ী। একই HTTP অধিবেশনগুলিতে ঘটে যাওয়া সমস্ত অনুরোধগুলির মধ্যে সেশন প্রসঙ্গটি ভাগ করা হয়। এটি কার্যকর যখন আপনি নির্দিষ্ট সেশনের জন্য নির্দিষ্ট ক্লায়েন্টের জন্য ডেটা সংরক্ষণ করতে চাইবেন না useful

@javax.enterprise.context.ConversationScoped :: কথোপকথনের ক্ষেত্রটি শিমের জীবন যেমন রয়েছে তেমন লগ হিসাবে। সুযোগটি 2 পদ্ধতি সরবরাহ করে: Conversation.begin()এবং Conversation.end()। শিমের জীবন শুরু বা শেষ করতে এই পদ্ধতিগুলি স্পষ্টভাবে বলা উচিত।

@javax.enterprise.context.RequestScoped :: অনুরোধের সুযোগটি স্বল্পস্থায়ী। এটি যখন কোনও HTTP অনুরোধ জমা দেওয়া হয় এবং ক্লায়েন্টকে প্রতিক্রিয়া ফেরত দেওয়ার পরে শেষ হয় তখন এটি শুরু হয়। আপনি যদি একটি পরিচালিত শিমকে অনুরোধের সুযোগে রাখেন তবে প্রতিটি অনুরোধের সাথে একটি নতুন উদাহরণ তৈরি করা হবে। আপনি যদি সেশন স্কোপ স্টোরেজ ব্যয়ের বিষয়ে উদ্বিগ্ন হন তবে অনুরোধের সুযোগটি বিবেচনা করা উচিত।

@javax.faces.flow.FlowScoped :: প্রবাহ বেঁচে থাকে ততক্ষণ ফ্লো স্কোপ থাকে। কোনও প্রবাহকে পৃষ্ঠাগুলির একটি সেট (বা মতামত) হিসাবে সংজ্ঞায়িত করা যেতে পারে যা কাজের একককে সংজ্ঞায়িত করে। ব্যবহারকারী যতক্ষণ না ফ্লোতে নেভিগেট করে ততক্ষণ ফ্লো স্কোপড সক্রিয় থাকে।

6.@javax.faces.view.ViewScoped : দৃশ্য সুযোগ থেকে যায় একটি শিম যখন একই JSF পৃষ্ঠা redisplayed করা হয়। ব্যবহারকারী অন্য পৃষ্ঠায় নেভিগেট করার সাথে সাথে শিম সুযোগের বাইরে চলে যায়।


নিম্নলিখিত উত্তরাধিকারের উত্তরটি ২.৩ এর আগে জেএসএফ সংস্করণ প্রয়োগ করে

জেএসএফ 2.x হিসাবে 4 টি শিমের স্কোপ রয়েছে:

  • @SessionScoped
  • @RequestScoped
  • @ApplicationScoped
  • @ViewScoped

অধিবেশন সুযোগ: অধিবেশন সমাপ্তি অবধি অধিবেশন প্রতিষ্ঠার সময় থেকে অধিবেশন সুযোগটি স্থায়ী। যদি ওয়েব অ্যাপ্লিকেশনটি এইচটিটিপিএসশন অবজেক্টে অবৈধ পদ্ধতিটি আহ্বান করে বা সময়সাপেক্ষে আউট হয় তবে একটি সেশন সমাপ্ত হবে।

রিকোয়েস্টস্কোপ: অনুরোধের সুযোগটি স্বল্পস্থায়ী। এটি যখন কোনও HTTP অনুরোধ জমা দেওয়া হয় এবং ক্লায়েন্টকে প্রতিক্রিয়া ফেরত দেওয়ার পরে শেষ হয় তখন এটি শুরু হয়। আপনি যদি একটি পরিচালিত শিমকে অনুরোধের সুযোগে রাখেন তবে প্রতিটি অনুরোধের সাথে একটি নতুন উদাহরণ তৈরি করা হবে। আপনি যদি সেশন স্কোপ স্টোরেজ ব্যয়ের বিষয়ে উদ্বিগ্ন হন তবে অনুরোধের সুযোগটি বিবেচনা করা উচিত।

অ্যাপ্লিকেশনস্কোপ: ওয়েব অ্যাপ্লিকেশনটির পুরো সময়কালের জন্য অ্যাপ্লিকেশন সুযোগটি বহাল থাকে। সেই সুযোগটি সমস্ত অনুরোধ এবং সমস্ত সেশনের মধ্যে ভাগ করা আছে। যদি ওয়েব অ্যাপ্লিকেশনটির সমস্ত দৃষ্টান্তের মধ্যে একটি একক শিম ভাগ করে নেওয়া হয় তবে আপনি পরিচালিত মটরশুটিগুলি প্রয়োগের সুযোগে রাখুন scope শিমটি তৈরি করা হয় যখন অ্যাপ্লিকেশনটির কোনও ব্যবহারকারীর দ্বারা এটি প্রথম অনুরোধ করা হয়, এবং অ্যাপ্লিকেশন সার্ভার থেকে ওয়েব অ্যাপ্লিকেশনটি সরিয়ে না দেওয়া পর্যন্ত এটি বেঁচে থাকে।

ভিউস্কোপ: জেএসএফ 2.0 তে দেখার সুযোগ যুক্ত করা হয়েছিল। একই জেএসএফ পৃষ্ঠাটি পুনঃনির্দেশ করা অবস্থায় দেখার সুযোগে একটি বিন রয়েছে ists (জেএসএফ স্পেসিফিকেশনটি জেএসএফ পৃষ্ঠার জন্য শব্দ শব্দটি ব্যবহার করে)) ব্যবহারকারী কোনও ভিন্ন পৃষ্ঠায় নেভিগেট করার সাথে সাথে শিমের সুযোগ ছাড়িয়ে যায়।

আপনার প্রয়োজনীয়তার উপর ভিত্তি করে সুযোগটি চয়ন করুন।

উত্স: কোর জাভা সার্ভারের ডেভিড গেরি এবং কে হোরস্টম্যান দ্বারা তৃতীয় সংস্করণের মুখোমুখি [পৃষ্ঠা নং] 51 - 54] এখানে চিত্র বর্ণনা লিখুন


আপনি কি দয়া করে পরিষ্কার করতে পারেন, "এইচটিটিপিএসশন অবজেক্টে invalidate()অবৈধ পদ্ধতি ": পদ্ধতি বা অবৈধ পদ্ধতি দ্বারা আপনার অর্থ কী ?
আলেকজান্ডার পোজডনিভ

1
কিছুটা পুরানো এবং জবাব পেতে দেরি হতে পারে, তবে এটি পরিষ্কার করতে: FacesContext.getCurrentInstance().getExternalContext().invalidateSession();আপনার "লগআউট বিন" তে আহবান করা তার অর্থ means
রোল্যান্ড

1
এটি উত্তরাধিকারের উত্তরে পরিণত হয়েছে, এই মুহূর্তে 8 টি স্কোপ রয়েছে
ইওকস

@ কিশোরপ্রকাশ: কিছুকাল এখন 6 মাস আগে। ;-)
কুকল্টেজে

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