অ্যাকশন এবং অ্যাকশনলিস্টারের মধ্যে পার্থক্য


উত্তর:


583

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>

নিম্নলিখিত ক্রমে পদ্ধতিগুলি প্রার্থনা করবে:

  1. Bean#ajaxListener()
  2. Bean#actionListener()
  3. ActionListenerType#processAction()
  4. Bean#actionListenerBinding()
  5. Bean#setProperty()
  6. Bean#action()

ব্যতিক্রম হ্যান্ডলিং

actionListenerএকটি বিশেষ ব্যতিক্রম সমর্থন করে: AbortProcessingException। যদি এই ব্যতিক্রমটি কোনও actionListenerপদ্ধতি থেকে ছুঁড়ে ফেলা হয় , তবে জেএসএফ বাকী সমস্ত অ্যাকশন শ্রোতা এবং ক্রিয়া পদ্ধতি এড়িয়ে যাবে এবং সরাসরি প্রতিক্রিয়া জানাতে এগিয়ে যাবে। আপনি কোনও ত্রুটি / ব্যতিক্রম পৃষ্ঠা দেখতে পাবেন না, জেএসএফ তবে এটি লগ করবে। এটি থেকে স্পষ্টতই করা হবে যখনই কোনওর থেকে অন্য কোনও ব্যতিক্রম ছোঁড়া হচ্ছে actionListener। সুতরাং, যদি আপনি কোনও ব্যবসায় ব্যতিক্রমের ফলস্বরূপ কোনও ত্রুটি পৃষ্ঠায় পৃষ্ঠাটি ব্লক করতে চান, তবে আপনার অবশ্যই actionপদ্ধতিটিতে কাজটি করা উচিত ।

যদি কোনও ব্যবহারের একমাত্র কারণ actionListenerহ'ল কোনও voidপদ্ধতি একই পৃষ্ঠায় ফিরে আসে, তবে এটি একটি খারাপ। actionপদ্ধতি পুরোপুরি এছাড়াও আসতে পারেন voidকি কিছু IDEs আপনি El বৈধতা মাধ্যমে বিশ্বাস যাক বিপরীত। নোট করুন যে প্রাইমফ্রিজের শোকেস উদাহরণগুলি actionListenerসমস্ত জায়গার উপরে এই ধরণের গুলি দ্বারা আবদ্ধ । এটা আসলে ভুল। এটি নিজে করার জন্য অজুহাত হিসাবে এটি ব্যবহার করবেন না।

এজ্যাক্স অনুরোধে, তবে একটি বিশেষ ব্যতিক্রম হ্যান্ডলার প্রয়োজন। আপনি listenerগুণাবলী ব্যবহার করেন <f:ajax>বা না করেন তা নির্বিশেষে is ব্যাখ্যা এবং উদাহরণের জন্য, জেএসএফ আজ্যাক্স অনুরোধগুলিতে এক্সেসপন্ড হ্যান্ডলিংয়ের দিকে যান


1
আপনি ঠিক বলেছেন যে অ্যাকশনলিস্টনারগুলিতে ব্যতিক্রমগুলি ডিফল্টরূপে গ্রাস করা হয়েছে তবে জেএসএফ 2.0 তে এই আচরণটি পরিবর্তন করা যেতে পারে। বিস্তারিত জানার জন্য নীচে আমার উত্তর দেখুন।
আরজান তিজমস

3
@ আরজান: আপনি ঠিক বলেছেন যে জেএসএফ ২.০ আপনাকে বর্জন করা ব্যতিক্রমগুলির ডিফল্ট হ্যান্ডলিংটি পরিবর্তন করতে দেয় actionListenerতবে এটি এখনও ব্যবসায়িক ক্রিয়াকলাপের actionListenerজন্য অপব্যবহারের ভাল অজুহাত তৈরি করে না ।
বালুসসি

1
প্রকৃতপক্ষে, ব্যবসায়িক ক্রিয়াগুলি অনুরোধ / প্রতিক্রিয়া চক্রের প্রধান "প্রবাহ" এবং কেবলমাত্র actionএটির সাথেই সম্পর্কিত। actionListenerগৌণ জিনিস জন্য হয়। কেবল এটি স্পষ্ট করে বলতে চেয়েছিলেন যে প্রয়োজনে এর ব্যতিক্রমগুলি actionListenerপ্রচার করা যেতে পারে;)
আরজান টিজমস

2
@ কাভি: actionListenerবৈশিষ্ট্যের ক্ষেত্রে ব্যবহারের সময় পদ্ধতির নামটি পছন্দমতো মুক্ত এবং এটিও হতে হবে publicprocessActionনামটি কেবল তখনই বাধ্যতামূলক যখন আপনি ব্যবহার করছেন <f:actionListener type>, কেবলমাত্র কারণ টাইপটির ActionListenerইন্টারফেসটি প্রয়োগ করতে হবে যা সঠিকভাবে এই পদ্ধতির নামটি processActionনির্দিষ্ট করে দিয়েছে।
BalusC

2
@ মুহম্মদ: অজ্যাক্স অ্যাকশন শ্রোতার সমস্ত নিয়মিত কর্ম শ্রোতার আগে আহ্বান জানানো হয়। মনে রাখবেন যে ব্যবহার করার পরেও <f:ajax>আপনি কমান্ড উপাদানগুলির ক্ষেত্রে actionব্যবসায়িক ক্রিয়াকলাপের জন্য বৈশিষ্ট্যটি ব্যবহার করতে পছন্দ করেন । যেমন <h:commandButton action="#{bean.businessAction}"><f:ajax/></h:commandButton>
বালাসসি

47

বালুসসি যেমন ইঙ্গিত করেছেন, 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>

একটি ত্রুটি পৃষ্ঠা প্রদর্শিত হচ্ছে ফলাফল।


43

অ্যাকশনলিস্টনার প্রথমে বরখাস্ত হয়ে যায়, অ্যাকশন ডাকা হওয়ার আগে এবং পরবর্তী পৃষ্ঠার অবস্থান নির্ধারণের আগে, প্রতিক্রিয়াটি সংশোধন করার একটি বিকল্প সহ।

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

এখানে সম্পর্কের বর্ণনা দেয় এমন একটি লিঙ্ক:

http://www.java-samples.com/showtutorial.php?tutorialid=605


3
এক যোগ, সাহসী অক্ষর প্রায় সব বলে।
শিরগিল ফারহান

0

টিএল; ডিআর :

ActionListenerগুলি (একাধিক হতে পারে) অর্ডার তারা আগে নথিভুক্তিকরন মধ্যে চালানোaction

দীর্ঘ উত্তর :

একটি ব্যবসায় actionসাধারণত একটি ইজেবি পরিষেবা শুরু করে এবং প্রয়োজনে চূড়ান্ত ফলাফলও নির্ধারণ করে এবং / অথবা আপনি যেটা করছেন actionListenerসেটি বেশি উপযুক্ত নয়, যদি ব্যবহারকারী যখন উপাদানগুলির সাথে ইন্টারঅ্যাক্ট করে, যেমন যেমন তারা h:commandButtonবা h:linkতারা পারে তবে এটি একটি ভিন্ন দৃশ্যে নেভিগেট করে ম্যানেজ করা শিম পদ্ধতির নামটি পাস করে পরিচালনা করা হবেactionListener কোনও ইউআই কম্পোনেন্টের বৈশিষ্ট্য হিসাবে বা একটি ActionListenerইন্টারফেস বাস্তবায়নের জন্য actionListenerএবং কোনও ইউআই অংশের বৈশিষ্ট্য হিসাবে প্রয়োগকরণ শ্রেণীর নামটি পাস করার ।

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