action
এবং এর মধ্যে পার্থক্য কী এবং actionListener
আমি কখন action
বনাম ব্যবহার করব actionListener
?
action
এবং এর মধ্যে পার্থক্য কী এবং actionListener
আমি কখন action
বনাম ব্যবহার করব actionListener
?
উত্তর:
বাস্তব ব্যবসায়িক ক্রিয়াকলাপ কার্যকর হওয়ার আগে আপনার actionListener
যদি একটি হুক থাকে তবে ব্যবহার করুন , যেমন এটি লগ করা এবং / অথবা অতিরিক্ত সম্পত্তি (দ্বারা ) নির্ধারণ করা এবং / অথবা যে উপাদানটি ক্রিয়া করেছে (যা দ্বারা উপলব্ধ<f:setPropertyActionListener>
ActionEvent
যুক্তি). সুতরাং, আসল ব্যবসায়িক ক্রিয়াকলাপটি শুরু হওয়ার আগে নিখুঁতভাবে প্রস্তুতির জন্য।
actionListener
পদ্ধতি ডিফল্ট নিম্নলিখিত স্বাক্ষর দ্বারা আছে:
import javax.faces.event.ActionEvent;
// ...
public void actionListener(ActionEvent event) {
// ...
}
এবং এটি কোনও পদ্ধতির প্রথম বন্ধনী ছাড়াই নীচে ঘোষণা করার কথা:
<h:commandXxx ... actionListener="#{bean.actionListener}" />
নোট করুন যে আপনি EL 2.2 দ্বারা অতিরিক্ত যুক্তিগুলি পাস করতে পারবেন না । তবে আপনি ActionEvent
কাস্টম আর্গুমেন্ট (গুলি) পাস এবং নির্দিষ্ট করে আর্গুমেন্টটিকে পুরোপুরি ওভাররাইড করতে পারেন । নিম্নলিখিত উদাহরণগুলি বৈধ:
<h:commandXxx ... actionListener="#{bean.methodWithoutArguments()}" />
<h:commandXxx ... actionListener="#{bean.methodWithOneArgument(arg1)}" />
<h:commandXxx ... actionListener="#{bean.methodWithTwoArguments(arg1, arg2)}" />
public void methodWithoutArguments() {}
public void methodWithOneArgument(Object arg1) {}
public void methodWithTwoArguments(Object arg1, Object arg2) {}
যুক্তিহীন পদ্ধতি এক্সপ্রেশনে প্রথম বন্ধনীগুলির গুরুত্বটি নোট করুন। যদি তারা অনুপস্থিত থাকতেন তবে জেএসএফ এখনও একটি পদ্ধতি আশা করবেActionEvent
যুক্তিযুক্ত ।
আপনি যদি EL 2.2+ এ থাকেন তবে আপনি এর মাধ্যমে একাধিক ক্রিয়া শ্রোতার পদ্ধতি ঘোষণা করতে পারেন <f:actionListener binding>
।
<h:commandXxx ... actionListener="#{bean.actionListener1}">
<f:actionListener binding="#{bean.actionListener2()}" />
<f:actionListener binding="#{bean.actionListener3()}" />
</h:commandXxx>
public void actionListener1(ActionEvent event) {}
public void actionListener2() {}
public void actionListener3() {}
binding
গুণাবলী মধ্যে প্রথম বন্ধনী গুরুত্ব নোট করুন । যদি তারা অনুপস্থিত থাকতেন, EL বিভ্রান্তিকরভাবে একটি নিক্ষেপ করবে javax.el.PropertyNotFoundException: Property 'actionListener1' not found on type com.example.Bean
, কারণ binding
বৈশিষ্ট্যটি ডিফল্টরূপে কোনও মূল্য প্রকাশের হিসাবে ব্যাখ্যা করা হয়, কোনও পদ্ধতি এক্সপ্রেশন হিসাবে নয়। EL 2.2+ স্টাইলের প্রথম বন্ধনী যুক্ত করা স্বচ্ছভাবে একটি মূল্য প্রকাশকে একটি পদ্ধতির এক্সপ্রেশনে রূপান্তরিত করে। আরও দেখুন এও জেএসএফ সমর্থন না করে কেন আমি << f: actionListener> কে একটি নির্বিচার পদ্ধতিতে বাঁধতে সক্ষম?
ব্যবহার করুন action
যদি আপনি একটি ব্যবসার কর্ম এবং প্রয়োজনে হাতল নেভিগেশন চালানো চাই। action
পদ্ধতি (এভাবে না) একটি আসতে পারেন String
যা গৌণ ক্ষেত্রে ফলাফল (টার্গেট দৃশ্য) ব্যবহার করা হবে। null
বা এর একটি রিটার্ন মানvoid
এটি একই পৃষ্ঠায় ফিরে যান এবং বর্তমান দৃশ্য সুযোগ টিকিয়ে রাখার দেওয়া হবে। একটি খালি স্ট্রিং বা একই ভিউ আইডির একটি রিটার্ন মানও একই পৃষ্ঠায় ফিরে আসবে, তবে দেখার সুযোগটি পুনরায় তৈরি করুন এবং এইভাবে বর্তমানে সক্রিয় দৃশ্যগুলির স্কোপড মটরশুটি ধ্বংস করুন এবং যদি প্রযোজ্য হয় তবে সেগুলি পুনরায় তৈরি করুন।
action
পদ্ধতি কোনো বৈধ হতে পারে MethodExpression
, এছাড়াও যার 2.2 আর্গুমেন্ট যেমন নীচের হিসাবে এল ব্যবহার করে:
<h:commandXxx value="submit" action="#{bean.edit(item)}" />
এই পদ্ধতি সহ:
public void edit(Item item) {
// ...
}
মনে রাখবেন যে যখন আপনার অ্যাকশন পদ্ধতিটি পুরোপুরি কোনও স্ট্রিং দেয়, তখন আপনি action
বৈশিষ্ট্যের মধ্যে ঠিক সেই স্ট্রিংটি নির্দিষ্ট করতে পারেন । সুতরাং, এটি সম্পূর্ণ আনাড়ি:
<h:commandLink value="Go to next page" action="#{bean.goToNextpage}" />
এই সংজ্ঞাহীন পদ্ধতিতে একটি হার্ডকোডযুক্ত স্ট্রিং ফিরিয়ে দেওয়া:
public String goToNextpage() {
return "nextpage";
}
পরিবর্তে, কেবলমাত্র সেই হার্ডকোডযুক্ত স্ট্রিংটি সরাসরি এট্রিবিউটটিতে রেখে দিন:
<h:commandLink value="Go to next page" action="nextpage" />
অনুগ্রহ করে নোট করুন যে এটি বদলে একটি খারাপ নকশাকে নির্দেশ করে: পোষ্ট দ্বারা নেভিগেট। এটি ব্যবহারকারী বা এসইও বান্ধব নয়। এই সবটি ব্যাখ্যা করা হয়েছে আমি h: কমান্ডলিংকের পরিবর্তে h: আউটপুটলিঙ্কটি কখন ব্যবহার করব? এবং হিসাবে সমাধান করা হবে বলে মনে করা হয়
<h:link value="Go to next page" outcome="nextpage" />
আরও দেখুন কিভাবে JSF মধ্যে নেভিগেট করতে? কীভাবে ইউআরএল বর্তমান পৃষ্ঠাকে প্রতিফলিত করে (এবং আগেরটি নয়) ।
যেহেতু জেএসএফ ২.x এর তৃতীয় উপায় আছে <f:ajax listener>
,।
<h:commandXxx ...>
<f:ajax listener="#{bean.ajaxListener}" />
</h:commandXxx>
ajaxListener
পদ্ধতি ডিফল্ট নিম্নলিখিত স্বাক্ষর দ্বারা আছে:
import javax.faces.event.AjaxBehaviorEvent;
// ...
public void ajaxListener(AjaxBehaviorEvent event) {
// ...
}
মোজারারায়, AjaxBehaviorEvent
যুক্তিটি alচ্ছিক, নীচে ভাল হিসাবে কাজ করে।
public void ajaxListener() {
// ...
}
তবে মাইফিসে এটি নিক্ষেপ করবে MethodNotFoundException
। আপনি যুক্তি বাদ দিতে চাইলে নীচে উভয় জেএসএফ বাস্তবায়নে কাজ করে।
<h:commandXxx ...>
<f:ajax execute="@form" listener="#{bean.ajaxListener()}" render="@form" />
</h:commandXxx>
অ্যাজাক্স শ্রোতা কমান্ড উপাদানগুলিতে সত্যই কার্যকর নয়। তারা ইনপুট এবং নির্বাচন উপাদান সর্বাধিক উপযোগী <h:inputXxx>
/ <h:selectXxx>
। কমান্ড উপাদানগুলিতে, কেবল action
এবং / অথবা actionListener
স্পষ্টতা এবং আরও ভাল স্ব-ডকুমেন্টিং কোডের জন্য আঁকুন। তদুপরি, পছন্দ করুন actionListener
, f:ajax listener
নেভিগেশন ফলাফলটি ফেরত সমর্থন করে না।
<h:commandXxx ... action="#{bean.action}">
<f:ajax execute="@form" render="@form" />
</h:commandXxx>
বৈশিষ্ট্যগুলির উপর execute
এবং render
বৈশিষ্ট্যের জন্য, বোঝার জন্য প্রাইমফিজ প্রসেস / আপডেট এবং জেএসএফ এফ: অ্যাজাক্স এক্সিকিউট / রেন্ডার অ্যাট্রিবিউটগুলি ।
actionListener
গুলি সবসময় প্রার্থনা করছে সামনেaction
তারা দৃশ্য ঘোষণা করা হয় এবং উপাদান সংযুক্ত একই আদেশ। যে কোনও ক্রিয়া শ্রোতার আগেf:ajax listener
সর্বদা অনুরোধ করা হয় । সুতরাং, নিম্নলিখিত উদাহরণ:
<h:commandButton value="submit" actionListener="#{bean.actionListener}" action="#{bean.action}">
<f:actionListener type="com.example.ActionListenerType" />
<f:actionListener binding="#{bean.actionListenerBinding()}" />
<f:setPropertyActionListener target="#{bean.property}" value="some" />
<f:ajax listener="#{bean.ajaxListener}" />
</h:commandButton>
নিম্নলিখিত ক্রমে পদ্ধতিগুলি প্রার্থনা করবে:
Bean#ajaxListener()
Bean#actionListener()
ActionListenerType#processAction()
Bean#actionListenerBinding()
Bean#setProperty()
Bean#action()
actionListener
একটি বিশেষ ব্যতিক্রম সমর্থন করে: AbortProcessingException
। যদি এই ব্যতিক্রমটি কোনও actionListener
পদ্ধতি থেকে ছুঁড়ে ফেলা হয় , তবে জেএসএফ বাকী সমস্ত অ্যাকশন শ্রোতা এবং ক্রিয়া পদ্ধতি এড়িয়ে যাবে এবং সরাসরি প্রতিক্রিয়া জানাতে এগিয়ে যাবে। আপনি কোনও ত্রুটি / ব্যতিক্রম পৃষ্ঠা দেখতে পাবেন না, জেএসএফ তবে এটি লগ করবে। এটি থেকে স্পষ্টতই করা হবে যখনই কোনওর থেকে অন্য কোনও ব্যতিক্রম ছোঁড়া হচ্ছে actionListener
। সুতরাং, যদি আপনি কোনও ব্যবসায় ব্যতিক্রমের ফলস্বরূপ কোনও ত্রুটি পৃষ্ঠায় পৃষ্ঠাটি ব্লক করতে চান, তবে আপনার অবশ্যই action
পদ্ধতিটিতে কাজটি করা উচিত ।
যদি কোনও ব্যবহারের একমাত্র কারণ actionListener
হ'ল কোনও void
পদ্ধতি একই পৃষ্ঠায় ফিরে আসে, তবে এটি একটি খারাপ। action
পদ্ধতি পুরোপুরি এছাড়াও আসতে পারেন void
কি কিছু IDEs আপনি El বৈধতা মাধ্যমে বিশ্বাস যাক বিপরীত। নোট করুন যে প্রাইমফ্রিজের শোকেস উদাহরণগুলি actionListener
সমস্ত জায়গার উপরে এই ধরণের গুলি দ্বারা আবদ্ধ । এটা আসলে ভুল। এটি নিজে করার জন্য অজুহাত হিসাবে এটি ব্যবহার করবেন না।
এজ্যাক্স অনুরোধে, তবে একটি বিশেষ ব্যতিক্রম হ্যান্ডলার প্রয়োজন। আপনি listener
গুণাবলী ব্যবহার করেন <f:ajax>
বা না করেন তা নির্বিশেষে is ব্যাখ্যা এবং উদাহরণের জন্য, জেএসএফ আজ্যাক্স অনুরোধগুলিতে এক্সেসপন্ড হ্যান্ডলিংয়ের দিকে যান ।
actionListener
তবে এটি এখনও ব্যবসায়িক ক্রিয়াকলাপের actionListener
জন্য অপব্যবহারের ভাল অজুহাত তৈরি করে না ।
action
এটির সাথেই সম্পর্কিত। actionListener
গৌণ জিনিস জন্য হয়। কেবল এটি স্পষ্ট করে বলতে চেয়েছিলেন যে প্রয়োজনে এর ব্যতিক্রমগুলি actionListener
প্রচার করা যেতে পারে;)
actionListener
বৈশিষ্ট্যের ক্ষেত্রে ব্যবহারের সময় পদ্ধতির নামটি পছন্দমতো মুক্ত এবং এটিও হতে হবে public
। processAction
নামটি কেবল তখনই বাধ্যতামূলক যখন আপনি ব্যবহার করছেন <f:actionListener type>
, কেবলমাত্র কারণ টাইপটির ActionListener
ইন্টারফেসটি প্রয়োগ করতে হবে যা সঠিকভাবে এই পদ্ধতির নামটি processAction
নির্দিষ্ট করে দিয়েছে।
<f:ajax>
আপনি কমান্ড উপাদানগুলির ক্ষেত্রে action
ব্যবসায়িক ক্রিয়াকলাপের জন্য বৈশিষ্ট্যটি ব্যবহার করতে পছন্দ করেন । যেমন <h:commandButton action="#{bean.businessAction}"><f:ajax/></h:commandButton>
।
বালুসসি যেমন ইঙ্গিত করেছেন, actionListener
ডিফল্টরূপে ব্যতিক্রমগুলি গ্রাস করে তবে জেএসএফ ২.০ এ আরও কিছুটা আছে। যথা, এটি কেবল গিলতে এবং লগ করে না, তবে প্রকৃতপক্ষে ব্যতিক্রমটি প্রকাশ করে।
এটি এই জাতীয় কলের মাধ্যমে ঘটে:
context.getApplication().publishEvent(context, ExceptionQueuedEvent.class,
new ExceptionQueuedEventContext(context, exception, source, phaseId)
);
এই ইভেন্টটির জন্য ডিফল্ট শ্রোতা ExceptionHandler
মোজরার জন্য সেট করা আছে com.sun.faces.context.ExceptionHandlerImpl
। এই প্রয়োগটি মূলত কোনও ব্যতিক্রম পুনর্বিবেচনা করবে, যদি এটি লগ-ইন হওয়া কোনও অ্যাওর্টপ্রসেসিং এক্সেকশন সম্পর্কিত হয়। অ্যাকশনলিস্টেনাররা ক্লায়েন্ট কোড দ্বারা এমন একটি অ্যাওর্টপ্রসেসিংএক্সসেপশন ব্যতিক্রমকে আবৃত করে যা কেন সর্বদা লগ থাকে তা ব্যাখ্যা করে।
এটি ExceptionHandler
কাস্টম প্রয়োগের সাথে ফেস-কনফিগারেশন.এক্সএমএল-তে প্রতিস্থাপন করা যেতে পারে:
<exception-handlerfactory>
com.foo.myExceptionHandler
</exception-handlerfactory>
বিশ্বব্যাপী শোনার পরিবর্তে একটি একক শিমও এই ঘটনাগুলি শুনতে পারে। নীচে এটি ধারণার একটি প্রমাণ:
@ManagedBean
@RequestScoped
public class MyBean {
public void actionMethod(ActionEvent event) {
FacesContext.getCurrentInstance().getApplication().subscribeToEvent(ExceptionQueuedEvent.class, new SystemEventListener() {
@Override
public void processEvent(SystemEvent event) throws AbortProcessingException {
ExceptionQueuedEventContext content = (ExceptionQueuedEventContext)event.getSource();
throw new RuntimeException(content.getException());
}
@Override
public boolean isListenerForSource(Object source) {
return true;
}
});
throw new RuntimeException("test");
}
}
(দ্রষ্টব্য, শ্রোতার সাধারণভাবে কোডিং করা উচিত নয়, এটি কেবল প্রদর্শনের উদ্দেশ্যে!)
এই জাতীয় ফেসলেট থেকে এটি কল করা:
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core">
<h:body>
<h:form>
<h:commandButton value="test" actionListener="#{myBean.actionMethod}"/>
</h:form>
</h:body>
</html>
একটি ত্রুটি পৃষ্ঠা প্রদর্শিত হচ্ছে ফলাফল।
অ্যাকশনলিস্টনার প্রথমে বরখাস্ত হয়ে যায়, অ্যাকশন ডাকা হওয়ার আগে এবং পরবর্তী পৃষ্ঠার অবস্থান নির্ধারণের আগে, প্রতিক্রিয়াটি সংশোধন করার একটি বিকল্প সহ।
যদি আপনার একই পৃষ্ঠায় একাধিক বোতাম থাকে যা একই জায়গায় যেতে পারে তবে কিছুটা আলাদা কাজ করা উচিত, আপনি প্রতিটি বোতামের জন্য একই ক্রিয়াটি ব্যবহার করতে পারেন তবে কিছুটা ভিন্ন কার্যকারিতা পরিচালনা করতে একটি পৃথক অ্যাকশনলিস্টনার ব্যবহার করতে পারেন।
এখানে সম্পর্কের বর্ণনা দেয় এমন একটি লিঙ্ক:
টিএল; ডিআর :
ActionListener
গুলি (একাধিক হতে পারে) অর্ডার তারা আগে নথিভুক্তিকরন মধ্যে চালানোaction
দীর্ঘ উত্তর :
একটি ব্যবসায় action
সাধারণত একটি ইজেবি পরিষেবা শুরু করে এবং প্রয়োজনে চূড়ান্ত ফলাফলও নির্ধারণ করে এবং / অথবা আপনি যেটা করছেন actionListener
সেটি বেশি উপযুক্ত নয়, যদি ব্যবহারকারী যখন উপাদানগুলির সাথে ইন্টারঅ্যাক্ট করে, যেমন যেমন তারা h:commandButton
বা h:link
তারা পারে তবে এটি একটি ভিন্ন দৃশ্যে নেভিগেট করে ম্যানেজ করা শিম পদ্ধতির নামটি পাস করে পরিচালনা করা হবেactionListener
কোনও ইউআই কম্পোনেন্টের বৈশিষ্ট্য হিসাবে বা একটি ActionListener
ইন্টারফেস বাস্তবায়নের জন্য actionListener
এবং কোনও ইউআই অংশের বৈশিষ্ট্য হিসাবে প্রয়োগকরণ শ্রেণীর নামটি পাস করার ।