طراحی مدل های MVC در JSF 2.0- روش اول

روش اول:

برای آشنایی با این روش, بهتر است هر لایه را بصورت جداگانه معرفی نموده و در پایان این بحث مزایا و معایب آنرا توضیح دهیم:

لایه View

این لایه متشکل از صفحات وب, کتابخانه های جاوا اسکریپت, و فایلهای CSS میباشد. صفحات وب در این لایه عموما از فایلهایی با پسوند xhtml ایجاد میشوند.

لایه Controller

این لایه متشکل از فایلها و کلاسهای جاوا بوده که با علامتهای Named@ و ManagedBean@ ایجاد میگردند. وظیفه این لایه مدیریت داده هاو رکورد ها قبل از ارسال به پایگاه داده (لایه Model) و یا ایجاد اطلاعات لازم برای نمایش در لایه View میباشد.

لایه Model

این لایه متشکل از توابع JDBC و دستورات SQL برای ارتباط با پایگاه های داده میباشد. این لایه در ارتباط مستقیم با لایه Controller بوده و اطلاعات را مستقیما از لایه View دریافت نمیکند.

در سیستم های نوین, از دستورات JDBC بصورت مستقیم کمتر استفاده شده و در عوض از کلاسهای Entity‌Bean و SessionBean و یا دستورات Hibernate استفاده میگردد.

نمونه ای از کلاسهای در این سه لایه بصورت زیر میباشد :

ٰView Layer:

<html xmlns="http://www.w3.org/1999/xhtml"
       xmlns:ui="http://java.sun.com/jsf/facelets"
       xmlns:f="http://java.sun.com/jsf/core"
       xmlns:p="http://primefaces.org/ui"
       xmlns:h="http://java.sun.com/jsf/html">
<h:head>
         <h:outputStylesheet library="css" name="default.css"></h:outputStylesheet>
         <title>تست</title>
</h:head>
<h:body>
<h:form id="growlForm">
     <p:commandButton value="Excute Method"  actionListener="#{testBean.testMethod}"/>
</h:form>

Controller Layer:

@ManagedBean
@ViewScoped
public class TestBean implements Serializable{

         @EJB private PayboxFacade pbFacade;

         public void testMethod(){

                System.out.println(pbFacade.find_test(1).getName());

         }

}

Model Layer:

@SuppressWarnings("serial")
@Stateless
public class PayboxFacade implements Serializable{
     public PayboxFacade() {
     }

     public Test find_test(Long serialid){
         return (Test)this.em.createQuery("select t from Test t where t.serialid =?1")
                .setParameter("1", serialid).getSingleResult();
     }

}

توضیحات لایه های فوق بدین صورت میباشد:

ابتدا برنامه پس از اجرا یک ارتباط با پایگاه داده برقرار نموده و جدول Test از پایگاه داده Sql Server را فراخوانی میکند. این کار در لایه Model با استفاده از Entity Bean ها اتفاق خواهد افتاد. سپس کاربر با اجرای صفحه xhtml و فراخوانی متد testMethod دستور SQL  را بر روی جدول Test اجرا خواهد نمود.

در این روش لایه Model  با استفاده از علامت EJB@  در لایه Controller فراخوانی خواهد شد.

معایت این روش:

اگر بخواهیم از Ajax در صفحات خود استفاده کنید, ناچارا میبایست از ٰViewScoped@ در لایه Controller استفاده نماید, برای استفاده از این Scope باید حتما تمامی کلاسها اعم از کلاسهای Controller و کلاسهای لایه Model مانند SessionBean ها با استفاده از اینترفیس Seralizable ایجاد گردند.

از طرف دیگر برای استفاده از این دو قابیلت یعنی ViewScope@ و SessionBean با هم, باید پارامتری بصورت زیر در فایل web.xml تعریف نمائید :

<context-param>
    <param-name>javax.faces.STATE_SAVING_METHOD</param-name>
    <param-value>server</param-value>
</context-param>

این پارامتر وظیفه تنظیم نحوه ذخیره سازی اطلاعات بین سرور و کلاینت را بر عهده داشته و میتواند دو مقدار بصورت زیر قبول نماید:

  • Server : اگر این پارامتر با مقدار Server فراخوانی گردد, تمامی مکالمات بین کلاینت و سرور در آبجکت های ViewState و بر روی سرور ذخیره میگردد. استفاده از این پارامتر برای سیستمهایی با پهنای باند کم بسیار مفید بوده و موجب افزایش سرعت بارگذاری صفحات میباشد. البته این نکته فراموش نشود که اینکار موجب میگردد منابع سرور بخصوص حافظه سرور و حافظه JVM بطور چشمگیری مورد استفاده قرار گیرد.
  • client: اگر این پارامتر با مقدار Client فراخوانی گردد, تمامی مکالمات بین سرور و کلاینت در HiddenText ها و بر روی سیستم کاربر ذخیره میگردد. این روش برای سیستمهای که از پهنای باند بالاتری برخوردار میباشند توصیه میگردد.

نکته : در این روش اگر این پارامتر با مقدار Client تنظیم گردد, برنامه اجرا نشده و پیغام خطایی در سرور اتفاق خواهد افتاد.

با توجه به توضیحات گفته شده باید گفت که با اجرای این روش MVC ,منابع سرور مورد استفاده بیشتری قرار خواهد گرفت که در برخی موارد حتی میبایست سرور را ریستارت نمود.

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

نکته: اگر از ViewScoped@ استفاده نمیکنید این روش بهترین روش برای طراحی مدل MVC میباشد و می توانید مقدار پارامتر فوق را بصورت client تنظیم نمائید. برای آشنایی بیشتر با این روش حتما به دستورات فوق توجه نمائید.

هر گونه سوال در خصوص نحوه پیاده سازی این روش را نیز بصورت Comment بیان کنید.