بصورت کلی در JSF، رویدادهای Action Event هنگامی که کاربر بر روی یک Link یا Button (کامپوننت های h:commandButton، h:commandLink) کلیک میکند، فراخوانی میگردد.

ابتدا بهتر است توضیح مختصری راجع به رویداد های Action و ActionListener داشته باشیم.

actionListener

بهتر است از actionListener هنگامی استفاده کنید که میخواهید یک رویداد از لایه Business برنامه خود را اجرا نمائید. خروجی این رویداد بهتر است از نوع void یا null باشد. بطور کلی از actionListener میتوان در موارد زیر استفاده نمود:

  • مقدار دهی و یا ویرایش یک Property و فیلد از کلاس Bean.
  • اجرای یک متد از Business Logic برنامه که هیچ خروجی نداشته باشد(از نوع void یا null باشد).

فرمت کلی و پیش فرض این رویداد بصورت زیر میباشد :

import javax.faces.ActionEvent;

public void actionListener(ActionEvent e){}

توجه داشته باشید که نمیتوان همزمان پارامتر ActionEvent و پارامترهای مورد نیاز خود را به این نوع رویداد ارسال کنید. فرمت های کلی استفاده از این رویداد بصورت زیر میباشد :

  • actionListener = "#{bean.actionLIstenerMethod()}"
  • actionListener = "#{bean.actionLIstenerMethod(arg1)}"
  • actionListener = "#{bean.actionLIstenerMethod(arg1, arg2, ...)}"

نکته مهم اینکه اگر رویداد actionListener دارای پرانتز نباشد، به پارامتر actionEvent دسترسی نخواهید داشت.

action

از این رویداد هنگامی استفاده نمائید که میخواهید علاوه بر اجرای یک متد از Business Logic برنامه، کاربر را به یک صفحه دیگر نیز ارجاع دهید. ویژگی های این رویداد را میتوان بصورت زیر خلاصه نمود:

  • در صورتی که خروجی این متد از نوع String باشد، میتواند یک outcome از Navigation-Rule را فراخوانی نمود و کاربر را به صفحه دیگری ارجاع دهد.
  • در صورت که خروجی این متد از نوع null یا void باشد، کاربر به هیچ صفحه ای ارجاع داده نشده و در همان view باقی خواهد ماند.
  • در صورتی که خروجی این متد یک عبارت رشته ای خالی و یا View ID صفحه فعلی باشد، کاربر در همان صفحه باقی مانده اما حافظه ای اختصاص یافته به ViewScoped از بین خواهد رفت(با اینکار دیگر به مقادیر کلاس Bean دسترسی نخواهید داشت).

دستورات زیر نحوه تعریف این نوع رویداد و استفاده ی در صفحه JSF را نشان میدهد:

<h:commandButton value="Test Action Event" action = "#{bean.edit(item)}" />

public void edit(Item item){

        //...

}

در JSF 2.0 میتوانید یک outcome از Navigation-Rule را مستقیماً در رویداد action بصورت زیر فراخوانی نمائید :

<h:commandLink value="Go To Next Page" action="nextPage" />

دستور فوق را میتوان بصورت زیر نیز فراخوانی نمائید :

<h:commandLink value="Go To Next Page" action="#{bean.goToNextPage}" />

public String goToNextPage(){

       return "nextPage";

}

نکته: بعلت اینکه ارسال اطلاعات توسط کامپوننتهای h:commandLink و یا h:commandButton در حالت POST صورت میگیرد، اگر میخواهید در حین ارجاع کاربر به صفحه دیگر، اطلاعاتی را در URL صفحه به کاربر نشان دهید میتوانید از کامپوننتهای h:link و h:button استفاده نمائید.

ترتینب اجرای رویداد های action و actionListener

در JSF، رویداد actionListener قبل از رویداد رویداد action در همان view اجرا میگردد. به کدهای زیر توجه نمائید :

<h:commandLink value="submit"  actionListener = "#{bean.listener1}"   action="#{bean.listener2}"

        <f:actionListener type="com.example.testActionListener"/>

</h:commandLink>

ترتیب اجرای دستورات فوق بدین صورت میباشد که ابتدا متد listener1، testActionListener اجرا شده و سپس متد listener2 اجرا میگردد.