سه روش برای اجرای دستورات و یا متدهای کلاسهای جاوا در هنگامی که صفحه JSF لود میگردد وجود داشته که در زیر نحوه پیاده سازی آنها را توضیح خواهیم داد.

روش اول

در این روش ابتدا یک کامپوننت h:commandButton بر روی صفحه قرار داده, خاصیت actionListener آنرا به یکی از متدهای کلاس Back Bean متصل میکنیم. سپس با استفاده از دستورات جاوااسکریپت آنرا در رویداد onload از تگ body فراخوانی میکنیم. به عنوان مثال کلاس زیر را در نظر بگیرید :

@ManagedBean

public void Test(){

         public void sayHello(){

                System.out.println("Hello World");

         }

}

کلاس فوق دارای یک متد بنام ()sayHello بوده که عبارتی را در پنجره کنسول محیط برنامه نویسی چاپ میکند.

مرحله دوم کار فراخوانی این متد در رویداد actionListener کامپوننت h:commandButton میباشد. همانطور که در آموزشهای قبلی نیز توضیح داده شده نحوه انجام این کار بدین صورت میباشد:

<h:commandButton  id="btnPageLoad"  actionListener="#{test.sayHello}" />

در کد فوق توجه داشته باشید که خاصیت ID برای کامپوننت commandButton حتما تعریف شده باشد.

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

<html>

    <h:body  onload="document.getElementById('insertForm:btnPageLoad').click();"

         <h:form id="insertForm">

                 <h:commandButton  id="btnPageLoad"  actionListener="#{test.sayHello}" />

         </h:form>

    </h:body>

</html>

نکته

  1. برای کلیک کردن هر نوع کامپوننت Button در جاوا اسکریپت باید از رویداد ()click (با حروف کوچک) استفاده نمود.
  2. در صورت تعریف خاصیت ID برای form, مقدار این خاصیت به خاصیت ID کامپوننت Button اضافه خواهد شد.
  3. مهمترین عیب این روش در اینست که در این روش, ابتدا صفحه HTML اود شده و سپس commandButton کلیک میگردد. (به عنوان مثال اگر صفحه شما تماما از Text تشکیل شده باشد, با کندی اینترنت ایران کاربر در لحظه ای کوتاه میتواند تمام صفحه HTML را دیده و سپس متد جاوا برای وی فراخوانی میگردد)

روش دوم

این روش, روشی است که خود من در اکثر برنامه ها از آن استفاده میکنم. در JSF تگی بنام f:view وجود داشته که وظیفه آن تقسیم بندی صفحه به چند view مختلف میباشد. این تگ دارای ریدادی بنام beforPhase بوده که قبلا از ایجاد و نمایش صفحه فراخوانی میگردد. که ما میتوانیم برای اجرای دستورات جاوا در زمان load صفحه از آن استفاده کنیم. برای راحتی بیشتر شما کدهای این رویداد را بصورت یک قالب طراحی کرده و در اختیار شما قرار میدهم, که میتوانید در هر صفحه این که میخواهید آنرا فراخوانی کنید.

همانطور که گفته شد مرحله اول اینکار قراردادن تگ f:view در صفحه JSF میباشد. نحوه انجام این کار در دستورات زیر نشان داده شده است:

<html>
   <h:head>
       <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
   </h:head>
   <h:body>
         <f:view beforePhase="#{test.beforePhase}"/>
         <h:form id="growlForm">
            //...... do any things  
         </h:form>

   </h:body>

</html>

iهمانطور که در دستورات فوق مشاهده میکنید رویداد beforPhase تگ f:view یک متد از کلاس Test را بنام beforePhase فراخوانی میکند. دستورات این متد در تمامی برنامه ها و صفحهات JSF ثابت میباشد. کدهای این متد بصورت زیر میباشد :

public void beforePhase(PhaseEvent e) throws Exception{
    boolean postback = e.getFacesContext().isPostback();
    PhaseId phaseId = e.getPhaseId();
   if ( (!postback && phaseId == PhaseId.RENDER_RESPONSE) ||
        (postback && phaseId == PhaseId.INVOKE_APPLICATION) ) 
   {
        this.pageLoad(postback);
   }
}
public void pageLoad(boolean isPostback) {
    if (!isPostback) {

         // Call and write any method or java command
    }
}

در بدنه متد beforePhase, رویداد دیگری بنام pageLoad تعریف شده که دارای یک پارامتر بنام isPostBack میباشد. در این رویداد ابتداد بررسی میشود که فرم Postback شده است یا نه. در صورت Postback نشدن یعنی اینکه صفحه برای اولین بار است که فراخوانی شده است و این نقطه جایی است که شما به آن نیاز دارید.

نکته: هر دو متد تعریف شده در دستورات فوق باید در کلاس Test تعریف شده باشند.

روش سوم

این روش روشی بسیار ساده بوده که میتوانید در برنامه های خود از آن استفاده نمائید. در این روش از خاصیت binding تگ h:form استفاده کرده و آنرا به فیلدی از کلاس Test متصل میکنیم. فیلد تعریف شده در کلاس تست حتماْ باید از نوع کلاس HtmlForm باشد. دستورات زیر نحوه انجام این کار را نشان میدهد:

<html>
   <h:head>
       <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
   </h:head>
   <h:body>
         <h:form binding="#{test.form}">
            //...... do any things  
         </h:form>

   </h:body>

</html>

@ManagedBean

public void Test(){

         private HtmlForm form;

         public HtmlForm getForm(){

                //... do any things

                 System.out.println("sayHello");

                 return this.form;

         }

         public setForm(HtmlForm form){

                this.form = form;

         }

}

نکته:

  1. در صورتی که میخواهید دستوری را در Load صفحه اجرا کنید, آن دستور باید در بدنه متد getForm و قبل از دستور return form نوشته شود.
  2. برای فیلد form باید هر دو متد getter/setter در کلاس Test نوشته شود.
  3. به خاصیت binding در کدهای HTML توجه کنید.