جرعه آخر firstcup

January 8, 2008 11:08 AM

تعريف Navigation صفحات JSF
اين پروژه شامل دو صفحه jsp است كه از تكنولوژي JSF در آنها استفاده شده. يكي greeting.jsp و ديگري response.jsp است. قواعد حرکت بين صفحات JSF بايد در فايل configuration تعريف شود. اين کار در مورد مثال جاري بدين صورت انجام مي شود:
1. ماژول firstcup-war را باز کنيد.
2. فولدر Web Pages و سپس WEB-INF را باز کنيد.
3. روي faces-config.xml دبل کليک نماييد.
4. روي اديتور کليک راست کنيد و از قسمت JavaServer Faces گزينه Add Navigation Rule را انتخاب نماييد.
5. در فيلد Rule from view عبارت greeting.jsp/ را وارد کنيد.
6. دکمه Add را کليک کنيد.
7. مراحل 4 تا 6 را تکرار کنيد. با اين تفاوت که اين بار عبارت response.jsp/ را بعنوان Rule From view وارد کنيد.
8. روي اديتور کليک راست کنيد و از JavaServer Faces گزينه Add Navigation Case را انتخاب کنيد.
9. فيلد From View را greeting.jsp/ انتخاب نماييد.
10. در فيلد From Outcome عبارت success را وارد کنيد.
11. فيلد To View را response.jsp/ انتخاب نماييد.
12. Add را کليک کنيد.
13. مراحل 8 تا 12 را تکرار کنيد. با اين تفاوت که اين بار response.jsp/ را در From View و greeting.jsp/ را در To View وارد کنيد.
بدين ترتيب دو Navigation Rule خواهيد داشت. يکي از greeting.jsp به response.jsp و ديگري برعکس.
در پايان فايل را ذخيره نماييد.


ساخت صفحه response.jsp
1. روي ماژول firstcup-war کليک راست نماييد.
2. از قسمت New گزينه JSP را انتخاب کنيد.
3. نام فايل را response وارد کنيد.
4. Finish را کليک کنيد.
5. در فايل response.jsp تگ head را تغيير دهيد که اينگونه گردد:

<head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>Response Page</title>
</head>

6. تگ هاي ابتدا و انتهاي body را پاک کنيد.
7. تگ <h1> را نيز به همراه تگ خاتمه و محتوياتش حذف نماييد.
8. تگ هاي زير را پس از تگ بسته شدن head قرار دهيد.

<%@ taglib uri="http://java.sun.com/jsf/html" prefix="h" %>
<%@ taglib uri="http://java.sun.com/jsf/core" prefix="f" %>

9. تگ هاي زير را در ادامه تگ هاي مرحله قبل در صفحه کپي کنيد:

<f:view>
<h:form>

 <h2><h:outputText value="#{bundle.YouAre} " />
 <h:outputText value="#{bundle.SameAge}" rendered="#{dukesBDay.ageDiff == 0}"/>
            
 <h:outputText value="#{dukesBDay.absAgeDiff}" rendered="#{dukesBDay.ageDiff < 0}"/>
 <h:outputText value=" #{bundle.Year} " rendered="#{dukesBDay.ageDiff == -1}"/>
 <h:outputText value=" #{bundle.Years} " rendered="#{dukesBDay.ageDiff < -1}"/>
 <h:outputText value="#{bundle.Younger}" rendered="#{dukesBDay.ageDiff < 0}"/>
           
 <h:outputText value="#{dukesBDay.absAgeDiff}" rendered="#{dukesBDay.ageDiff > 0}"/>
 <h:outputText value=" #{bundle.Year} " rendered="#{dukesBDay.ageDiff == 1}"/>
 <h:outputText value=" #{bundle.Years} " rendered="#{dukesBDay.ageDiff > 1}"/>
 <h:outputText value="#{bundle.Older}" rendered="#{dukesBDay.ageDiff > 0}"/>

</h:form>
</f:view>

10. قبل از بسته شدن تگ h:form تگ زير را قرار دهيد:

<p><h:commandButton id="back" value="#{bundle.Back}" action="success"/>

11. فايل را ذخيره نماييد.

Building, Packaging, Deploying & Running
در اين مرحله شما DukesBirthdayBean و firstcup web client راا Build خواهيد نمود، آنها را در فايل هاي EAR بصورت package درخواهيد آورد. فايل هاي EAR را در سرور deploy خوهيد نمود و سرانجام App را اجرا خواهيد کرد.
آماده سازي Deployment Descriptor
در اين مرحله برخي پارامترها که خود NetBeans در فايل Deployment Descriptor ايجاد کرده، اما ما به آنها نياز نداريم را پاک خواهيم کرد. بدين ترتيب:
1. ماژول firstcup-war را باز کنيد.
2. فولدر Configuration Files را باز کنيد.
3. روي web.xml دبل کليک نماييد.
4. در بالاي پنجره اديتور، روي تب General کليک نماييد.
5. علامت + کنار Context Parameters را انتخاب کنيد. با اين کار يک جدول باز مي شود.
6. از جدول مذکور تک تک پارامترها را انتخاب کنيد و با دکمه remove همه آنها را يکي يکي پاک نماييد.
7. در بالاي اديتور روي تب XML کليک کنيد.
8. عنصر welcome-file-list و همه اجزاي آن را حذف نماييد.
9. فايل را ذخيره نماييد.
Building و Packaging
دراين مرحله در مورد firstcup Enterprise Application عمل Building و packaging را انجام مي دهيم. بدين ترتيب:
1. firstcup را در قسمت پروژه ها انتخاب نماييد.
2. کليک راست کنيد و گزينه Build Project را انتخاب کنيد.
Deploying
در مرحله قبل شما DukesBirthdayBean enterprise bean و firstcup web client را بصورت فايل firstcup.ear پکيج نموديم. حالا آن را روي سرور deploy مي کنيم. بدين صورت:
1. firstcup را در قسمت پروژه ها انتخاب کنيد.
2. کليک راست کرده و گزينه Deploy Project را انتخاب کنيد.
Running
1. Browser را اجرا نماييد و در قسمت آدرس آن URL زير را وارد کنيد.

http://localhost:8080/firstcup

mahyar_ev | 11:08 AM | Comment(s)(0)

ساخت صفحه greeting.jsp

January 6, 2008 03:07 PM

اين صفحه شامل پيغام خوش آمدگويي، نمايش سن فعلي Duke و دريافت تاريخ تولد کاربر است. مراحل ساخت صفحه چنين است:
ساخت يک صفحه خالي:
1. روي ماژول firstcup-war کليک راست نماييد.
2. از قسمت New گزينه JSP را انتخاب کنيد.
3. نام فايل JSP را greeting وارد کنيد.
4. Finish را کليک کنيد.
5. تگ head را به اين صورت تغيير دهيد:

<head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>Firstcup Greeting Page</title> 
</head>

6. تگ هاي ابتدا و انتهاي body را حذف کنيد.
7. عبارت زير را حذف کنيد:

<h1>JSP Page</h1>

8. فايل را ذخيره نماييد.

Declare نمودن Tag Library هاي JSF
همانگونه که مي دانيد تکنولوژي JavaServer Faces در واقع مجموعه اي از custom tag هاي jsp است که براي نمايش کامپوننت هاي واسط کاربري ، اعتبار سنجي و ساير موارد مربوطه به کار مي رود. Custom tag ها در tag library ها تعريف مي شوند. تکنولوژي JavaServer Faces در دو tag library تعريف مي شود:
• HTML Render Kit library که در آن همه کامپوننت هاي استاندارد واسط کاربري تعريف شده اند.
• Core tag library که تگ هاي مورد نياز براي مبدل ها (convertors) ، اعتبارسنج ها (Validators) و event listener ها و ساير توابع عملکردي اشياء تعريف مي شوند.

براي استفاده از اين تگ ها در صفحه بايد tag library را declare نماييد. در اين مثال بايد خطوط زير را در فايل greeting.jsp درست پس از تگ بسته شدن head قرار دهيد:

<%@ taglib prefix="h" uri="http://java.sun.com/jsf/html" %>
<%@ taglib prefix="f" uri="http://java.sun.com/jsf/core" %>

افزودن تگ هاي f:view و f:form
يک صفحه JSF بوسيله درختي از کامپوننت هاي واسط کاربري نمايش داده مي شود. هر صفحه JSP که از تکنولوژي JSF استفاده مي کند بايد داراي تگ view باشد. اين تگ در Core tag Library تعريف شده است و ريشه يا root درخت کامپوننت ها را مشخص مي نمايد. ساير تگ هاي JSF بايد درون تگ view تعريف شوند.
همچنين از آنجا که معمولا صفحات JSF شامل فرمي براي دريافت اطلاعات از کاربر است، معمولا بايد شامل تگ form نيز باشد. همه کامپوننت هاي موجود در يک فرم بايد درون تگ form قرار گيرند.
با مثال خود بحث را پي مي گيريم.
در ادامه declare نمودن tag library ها تگ هاي view و form را بدين صورت تعريف نماييد:

<f:view>
    <h:form>
    </h:form>
</f:view>

افزودن Output Label ها براي نمايش محتواي فقط خواندني
يکي از مهمترين و پر کاربرد ترين تگ هاي JSF تگ outputText است. greeting.jsp براي نمايش پيغام خوش آمدگويي، دستورالعمل ها، Lebel ها و سن Duke از آن استفاده مي کند. براي اين کار از پيغام هاي تعريف شده در resource bundle استفاده مي نمايد. همچنين تگ outputText اي که سن Duke را نشان مي دهد از متغير age موجود در DukesBDay bean استفاده مي کند.
در داخل تگ h:form اين کد ها را بنويسيد:

<h2><h:outputText value="#{bundle.Welcome}"/></h2>
<h:outputText value="#{bundle.DukeIs} "/>
<h:outputText value="#{dukesBDay.age}"/>
<p><h:outputText value="#{bundle.Instructions}"/>
<p><h:outputText value="#{bundle.YourBD}"/>

افزودن يک کامپوننت input براي دريافت تاريخ تولد کاربر
يکي ديگر از تگ هاي پرکاربرد، تگ inputText است که يک فيلد متني براي دريافت ورودي از کاربر است. در اين مثال در صفحه greeting.jsp تاريخ تولد کاربر دريافت مي شود و مقدارش در متغير YourBD از DukesBDay Bean ريخته مي شود. بدين ترتيب:
پس از کدهاي نوشته شده از مراحل قبل، کدهاي زير را بنويسيد:

<h:inputText id="userBirthday" value="#{dukesBDay.yourBD}">
</h:inputText>

انتساب يک convertor به کامپوننت ورودي
JSF شامل مجموعه از convertor ها و validator هاي استاندارد است که مي توان به کامپوننت نسبت داد. هدف از آنها اعتبار سنجي داده هاي ورودي و كنترل انطباق آنها با الگويي خاص است. در اينجا ما مي خواهيم نحوه ورود تاريخ توسط كاربر را مشخص نماييم و روي آن كنترل داشته باشيم.
به اين منظور چنين عمل کنيد:
1. تگ زير را در داخل تگ h:inputText اضافه نماييد:

<f:convertDateTime pattern="MM/dd/yyyy"/>

2. براي نمايش الگوي ورود تاريخ به کاربر تگ زير را پس از تگ بسته شدن h:inputText قرار دهيد:

<h:outputText value="#{bundle.Pattern}"/>

3. براي اينکه در صورت بروز خطا هنگام conversion پيغامي به کاربر نشان داده شود لازم است مشخصه converterMessage را به تگ h:inputText اضافه نماييد. اين تگ بدين صورت خواهد شد:

<h:inputText id="userBirthday" 
          value="#{dukesBDay.yourBD}"
          converterMessage="#{bundle.DateError}">             
    <f:convertDateTime pattern="MM/dd/yyyy"/>
</h:inputText>

4. براي مشخص کردن جاي نمايش پيغام خطا به کاربر تگ زير را درست قبل از تگ بسته شدن h:form قرار دهيد. بدين صورت:

<p><h:message for="userBirthday" style="color:red"/>

افزودن دکمه براي submit
درست قبل از تگ message که در مرحله قبل ايجاد کرديد تگ زير را اضافه نماييد:

<p><h:commandButton value="#{bundle.Submit}" action="success"/>

در نهايت فايل را ذخيره نماييد.

پياده سازي greeting.jsp هم تمام شد. در مطلب بعد، آخرين جزء Application كه صفحه response.jsp است را خواهيم ساخت.

mahyar_ev | 03:07 PM | Comment(s)(1)

ساخت DukesBDay Managed Bean

January 5, 2008 02:52 PM

افزودن Dependency روي Enterprise Bean Module
ماژول firstcup-war به برخي از کلاس هاي firstcup-ejb وابسته است. شما بايد وجود اين وابستگي را به NetBeans اعلام نماييد. بدين ترتيب:
1. روي ماژول firstcup_war کليک راست نماييد و properties را انتخاب نماييد.
2. از category ها Libraries را انتخاب نماييد.
3. روي Add Project کليک کنيد.
4. مسير myexample/firstcup را انتخاب نماييد.
5. پروژه firstcup-ejb را انتخاب کنيد.
6 دکمه Add Project JAR Files را کليک کنيد.
7. توجه کنيد که Build Required Projects تيک خورده باشد.
8. OK را کليک نماييد.

ساخت كلاس DukesBDay و تعريف متغيرهاي لازم
DukesBDay يک Backing Bean است. منظور از Backing Bean، يک Bean کنترل شده (managed Bean ) توسط JSF است که براي ذخيره سازي داده هاي مربوط به مقادير کامپوننت هاي موجود در صفحه JSF به کار مي رود.
DukesBDay در واقع واسط بين صفحات JSF و Business Tier است. صفحات JSF اطلاعات مورد نياز خود را از اين managed Bean دريافت مي كنند و به آن نيز تحويل مي دهند.
براي ساخت کلاس DukesBDay اين مراحل را انجام دهيد:

ساخت يک کلاس خالي:
1. روي ماژول firstcup-war کليک راست کنيد.
2. از New گزينه Java Class را انتخاب نماييد.
3. نام کلاس را DukesBDay قرار دهيد.
4. Package را com.sun.firstcup.web وارد کنيد.
5. Finish را کليک کنيد.

افزودن Enterprise Bean Reference:
6. درست بعد از سطر تعريف کلاس (اولين سطر از بدنه کلاس) متغير private زير را به همراه عبارت EJB@ درج نماييد:
@EJB
Private DukesBirthdayRemote dukesBirthday;
افزودن property ها به Bean:
7. پس از تعريف متغير dukesBirthday متغيرهاي زير را بعد از آن درج نماييد:
private int age;
private Date YourBD;
private int ageDiff;
private int absAgeDiff;
8. با افزودن کدهاي زير به constructor پيش ساخته، متغيرها را initialize نماييد:
age = -1;
YourBD = null;
ageDiff = -1;
absAgeDiff = -1;
ساخت متدهاي دستيابي (Accessor Methods) براي property ها
در اين مرحله با استفاده از امكانات refactoring موجود در NetBeans متدهاي get و set را ايجاد مي كنيم. بدين ترتيب:
1. روي اديتور کليک راست کنيد.
2. از منوي باز شده گزينه Refactor و سپس Encapsulate Fields را انتخاب نماييد.
3. در فرمي که باز مي شود، تيک مربوط به getDukesBirthday و setDukesBirthday را برداريد.
4. Next را کليک نماييد.
5. در پنل refactoring روي Do Refactoring کليک کنيد. با اين کار کدهاي مربوط به get و set متغيرها به کلاس اضافه خواهند شد.

افزودن كدهاي لازم جهت دريافت سن Duke
1. ماژول firstcup-war را باز کنيد.
2. قسمت Web Service Refrences را باز کنيد.
3. وارد قسمت زير شويد:
DukesAgeService->DukesAgeService->DukesAgePort->getDukesAge
4. از اديتور در فايل DukesBDay.java متد getAge را بيابيد. سپس getDukesAge را که در مرحله قبل انتخاب نموده ايد به متد getAge قبل از عبارت return age با ماوس drag نماييد. محتويات اين متد پس از انجام اين عمل چنين خواهد شد:

public int getAge() {       

   try { // Call Web Service Operation

   com.sun.firstcup.webservice.DukesAgeService service = 

new  com.sun.firstcup.webservice.DukesAgeService();

   com.sun.firstcup.webservice.DukesAge port = service.getDukesAgePort();

   // TODO process result here

   int result = port.getDukesAge();

   System.out.println("Result = "+result);

   } catch (Exception ex) {

       // TODO handle custom exceptions here

   }

   return age;

}



5. در کدهاي متد getAge خط


int result = port.getDukesAge();


را حذف کنيد و به جايش عبارت زير را قرار دهيد.


age = port.getDukesAge();


6. خط زير را حذف نماييد:


System.out.println("Result = "+result);


افزودن كدهاي دريافت تفاوت سن از DukesBirthdayBean

داخل متد getAgeDiff درست قبل از دستور return کدهاي زير را وارد نماييد:


ageDiff = dukesBirthday.getAgeDifference(YourBD);

if (ageDiff < 0) {

    setAbsAgeDiff(Math.abs(ageDiff));

} else {

    setAbsAgeDiff(ageDiff);
}


افزودن Imort ها

1. روي اديتور کليک راست کنيد.

2. گزينه Fix Imports را انتخاب کنيد.

3. عبارت java.util.Date را براي کلاس Date انتخاب نماييد.

4. OK را کليک کنيد.



در خاتمه فايل را ذخيره نماييد.



تنظيم پيکربندي DukesBDay

تکنولوژي JSF امکان استفاده از فايل هاي Configuration را براي مقداردهي اوليه، پيکربندي و ذخيره سازي managed Bean ها در 3 scope زير مي دهد:

• Request که وقتي کاربر صفحه اي را submit مي کند آغاز مي شود و پس از ارسال پاسخ پايان مي پذيرد.

• Session که با اولين دسترسي کاربر به صفحه آغاز مي شود و پس از خاتمه يافتن session کاربر ، پايان مي يابد.

• Application که تا زماني که سرور، Application را متوقف نکرده اعتبار دارد.



Scope در managed Bean مثال ما session است.

به محض اينکه Bean ، پيکربندي شد يک صفحه JSF مي تواند آن را ايجاد کند و به آن دسترسي داشته باشد. در اينجا ما پيکربندي DukesBDay managed Bean را انجام مي دهيم:

1. ماژول firstcup-war را باز کنيد.

2. فولدر Web Pages و سپس WEB-INF را باز کنيد.

3. روي faces-config.xml دبل کليک نماييد.

4. روي اديتور کليک راست کرده و از JavaServer Faces گزينه Add Managed Bean را انتخاب کنيد.

5. نام Bean را dukesBDay وارد کنيد.

6. کلاس را com.sun.firstcup.web.DukesBDay قرار دهيد.

7. از منوي scope گزينه session را انتخاب کنيد.

8. در قسمت Description نيز عبارت DukesBDay backing bean را وارد کنيد.

9. Add را کليک کنيد. با اينکار عناصر XML مربوطه به فايل اضافه مي شوند.

10. فايل را ذخيره نماييد.




از Application نمونه اي ما تنها صفحات greeting.jsp و respone.jsp باقي مانده كه در مطالب آينده آنها را پياده سازي خواهيم نمود. براي يادآوري اين تصوير را دوباره مشاهده كنيد.

mahyar_ev | 02:52 PM | Comment(s)(0)

ساخت firstcup Web Client

January 1, 2008 11:18 AM

براي ساخت Web Client کارهاي زير را بايد انجام دهيد:
• تنظيم firstcup-war به اين منظور که JSF را پشتيباني نمايد.
• ساخت يک Web service client
• ساخت يک resource bundle براي نگهداري پيغام هايي که توسط صفحات JSP استفاده مي شوند.
• تنظيم resource bundle در فايل configuration
• ساخت کلاس مديريت DukesBDay
• تنظيم DukesBDay در فايل configuration
• ساخت صفحه greeting.jsp
• تنظيم قواعد navigation
• ساخت صفحه response.jsp
در ادامه، مراحل بالا يک به يک توضيح داده خواهند شد.

تنظيم firstcup-war جهت پشتيبالي JSF
همه Application هاي JSF بايد شامل يک map به نمونه FacesServlet در فايل deployment descriptor باشند. نمونه FacesServlet درخواست ها را دريافت مي کند و براي پردازش به life cycle مي فرستد. همچنين مقداردهي اوليه منابع را انجام مي دهد.

اين mapping بدين صورت انجام مي شود:
1. روي ماژول firstcup-war کليک راست کنيد و properties را انتخاب نماييد.
2. از category ها framework را انتخاب نماييد.
3. روي Add کليک کنيد.
4. از ليست انتخاب ها، JavaServer Faces را انتخاب نماييد و OK را کليک کنيد.
5. Servlet URL mapping را به */firstcupWeb/ تغيير دهيد. اين مسير نمونه FacesServlet است.
6. تيک Validate XML را برداريد.
7. OK را کليک کنيد.

فوروارد صفحه index.jsp به greeting.jsp
مي خواهيم بلافاصله پس از اجراي اين Web Application به صفحه greeting.jsp برويم. لذا بايد index.jsp را به greeting.jsp فوروارد نماييم. بدين صورت:
1. ماژول firstcup-war را باز کنيد و روي Web Pages دبل کليک نماييد.
2. روي welcomeJSF.jsp کليک راست کرده بوسيله Delete آن را حذف نماييد.
3. روي index.jsp دبل کليک کنيد.
4. هر چيزي که داخل اين صفحه نوشته شده است را پاک کنيد.
5. اين عبارت را در صفحه index.jsp وارد کنيد:
6. فايل را ذخيره کنيد.

توضيح اينكه صفحه greeting.jsp را بعدا خواهيم ساخت.

ساخت Web Service Client براي وب ماژول firstcup-war
اين ماژول از وب سرويس firstcup-dukes-age استفاده مي نمايد. به اين منظور لازم است يک Web Service Client در آن ايجاد نماييد. بدين صورت:
1. ماژول firstcup-war را انتخاب کنيد.
2. از منوي File گزينه New File را انتخاب کنيد.
3. از category ها گزينه Web Services را انتخاب کنيد.
4. از انواع فايل، Web Service Client را ايجاد نماييد.
5. Next را کليک کنيد.
6. WSDL URL را انتخاب کنيد.
7. در قسمت WSDL URL مقدار زير را وارد کنيد:
http://localhost:8080/DukesAgeService/DukesAgeService?WSDL
8. در فيلد package نيز اين مقدار را وارد نماييد:
com.sun.firstcup.webservice
9. Finish را کليک کنيد.

ساخت Resource Bundle
منظور از Resource Bundle فايلي است از نوع properties كه در آن كليه متون ثابت، شامل پيغام هاي خطا و عباراتي كه در صفحه jsp به كار مي روند، تعريف مي شود. نحوه ساخت آن بدين ترتيب است:
1. ماژول firstcup-war را انتخاب نماييد.
2. از منوي فايل گزينه New File را انتخاب کنيد.
3. category را other و نوع فايل را Properties File انتخاب کنيد و Next را کليک کنيد.
4.نام فايل را WebMessages وارد نماييد.
5. فولدر را نيز اين مسير وارد کنيد:
src/java/com/sun/firstcup/web
6. Finish را کليک نماييد.
7. پس از اينکه NetBeans فايل را ايجاد نمود متن زير را در آن کپي نماييد:
Welcome=Hi. My name is Duke. Let us find out who is older -- You or me
DukeIs=Duke is
YearsOldToday=years old today.
Instructions=Enter Your birthday and click submit.
YourBD=Your birthday
Pattern=MM/dd/yyyy
DateError=Please enter the date in the form MM/dd/yyyy.
YouAre=You are
Year=year
Years=years
Older=older than Duke!
Younger=younger than Duke!
SameAge= the same age as Duke!
Submit=Submit
Back=Back
8. فايل را ذخيره کنيد.
9. در صورت نياز مي توانيد براي هر زباني مانند زبان فارسي يک Properties File مشابه بالا تهيه نماييد.
10. توسط گزينه Refresh All Files از منوي File همه فايل ها را Refresh نماييد.

تنظيم و پيکر بندي Resource Bundle
1. ماژول firstcup-war را باز کنيد. از فولدر Web Pages فولدر WEB-INF را باز کنيد.
2. روي faces-config.xml دبل کليک نماييد.
3. قبل از تگ پاياني عنصر faces-config عناصر زير را اضافه نماييد:
<application>
    <resource-bundle>          
            <base-name>com.sun.firstcup.web.WebMessages</base-name>
        <var>bundle</var> 
    </resource-bundle>
    <locale-config>
        <default-locale>en</default-locale>
        <supported-locale>es</supported-locale>
    </locale-config>
</application>
4. فايل را ذخيره نماييد.

در مطلب بعد ساخت كلاس DukesBDay از اجزاي web client را خواهيم ديد. براي يادآوري اين تصوير را ببينيد.

mahyar_ev | 11:18 AM | Comment(s)(0)

ساخت firstcup Enterprise Application

December 31, 2007 02:17 PM

بحث را با ساخت firstcup Enterprise Application پي مي گيريم. اين Enterprise Application همانگونه كه در تصوير نيز مشخص است شامل يك Web Application و يك EJB است.

ساخت پروژه
1. از منوي فايل New Project را انتخاب كنيد.
2. از Category ها گزينه Enterprise را انتخاب كنيد.
3. از پروژه ها Enterprise Application را انتخاب نماييد.
4. Next را كليك كنيد.
5. نام پروژه را firstcup قرار دهيد.
6. Location پروژه را مسير فولدر myexample كه قبلا ساخته ايد قرار دهيد.
7. بقيه تنظيمات موجود را تغيير ندهيد و روي Finish كليك كنيد.

تنظيم Context Root
اين مرحله براي فراهم نمودن امكان شناسايي WebApp در J2EE server است.
1. از قسمت پروژه ها firstcup را بازكنيد
2. روي گزينه application.xml از Configuration Files دبل كليك نماييد.
3. در اين فايل عنصر context-root را بيابيد.
4. مقدار موجود را از firstcup_war به firstcup تغيير دهيد و فايل را ذخيره كنيد.
5. در قسمت قسمت پروژه ها، روي firstcup-war كليك راست كنيد و properties را انتخاب نماييد.
6. از category ها، Run را انتخاب كنيد.
7. مسير Context را به firstcup/ تغيير دهيد و OK را كليك كنيد.

ساخت Enterprise Bean

اين Enterprise Bean يك Stateless session bean است. منظور اين است كه نيازي به تعامل با client و نگهداري state جاري ندارد. به عبارت ديگر درخواست هاي ارسالي به اين Bean هيچ وابستگي به حالت قبلي و بعدي client ندارد.
اين Enterprise Bean شامل دو كلاس است : يكي DukesBirthdayBean و ديگري DukesBirthdayRemote .

ساخت كلاس DukesBirthdayBean
1. از قسمت پروژه ها firstcup-ejb را انتخاب كنيد.
2. از منوي فايل گزينه New File را انتخاب نماييد.
3. از category ها Enterprise را انتخاب نماييد.
4. از قسمت File Types گزينه Session Bean را انتخاب نماييد.
5. Next را کليک کنيد.
6. نام EJB را DukesBirthdayBean قرار دهيد.
7. نام Package را com.sun.firstcup.ejb وارد نماييد.
8. Session Type را مساوي stateless قرار دهيد.
9. تيک فيلد Local را برداريد و Remote را تيک بزنيد.
10. Finish را کليک کنيد.

اصلاح کدهاي DukesBirthdayBean.java
اين کلاس حاوي کدهايي است که تفاوت سال سن Duke و کاربر را محاسبه مي نمايد.
1. ابتدا Constructor پيش فرض را که NetBeans ايجاد کرده، حذف کنيد.
2. در درون بدنه کلاس، کدهاي زير را کپي نماييد.

private static Logger logger = Logger.getLogger("com.sun.firstcup.ejb.DukesBirthdayBean");
    
public int getAgeDifference(Date date){
    int ageDifference;
        
    Calendar theirBirthday = new GregorianCalendar();
    Calendar dukesBirthdaye = new GregorianCalendar(1995,Calendar.MAY,23);
        
    // Set the Calendar object to the passed in Date
    theirBirthday.setTime(date);
        
    // Subtract the user's age from Duke's age
    ageDifference = dukesBirthdaye.get(Calendar.YEAR) - theirBirthday.get(Calendar.YEAR);
    logger.info("Raw ageDifference is: "+ageDifference);
    // Check to see if Duke's birthday occurs before the user's. If so, 
    // subtract one from the age difference
    if (dukesBirthdaye.before(theirBirthday) && (ageDifference > 0)){
        ageDifference--;
    }
    logger.info("Final ageDifference is: "+ageDifference);
       
    return ageDifference;
}

3. روي اديتور کليک راست کنيد و Fix Imports را انتخاب نماييد.
4. java.util.date را براي کلاس date و java.util.logging.logger را براي کلاسlogger انتخاب نماييد و OK را کليک کنيد.
5. روي بدنه متد getAgeDifference کليک راست کنيد و از منوي EJB Methods گزينه Add to Remote Interface را انتخاب کنيد.
6. فايل را ذخيره کنيد.

اصلاح کد DukesBirthdayRemote.java
اين كلاس بعنوان رابط كلاس DukesBirthdayBean عمل مي كند و اجزاي Web Tier براي دسترسي به DukesBirthdayBean از DukesBirthdayRemote استفاده خواهند كرد.
اين كلاس توسط NetBeans ايجاد مي شود. شما فقط بايد تغييرات لازم را در آن اعمال كنيد. بدين ترتيب:
1. ماژول firstcup-ejb را از قسمت پروژه ها باز کنيد.
2. روي DukesBirthdayRemote.java در پکيچ com.sun.firstcup.ejb دبل کليک کنيد.
3. پس از باز شدن فايل ، روي اديتور کليک راست کرده و گزينه Fix Imports را انتخاب کنيد.
4. براي کلاس Date گزينه java.util.Date را انتخاب کنيد.
5. در صورتي که دستور throws در تعريف متد وجود داشت، آن را حذف نماييد.
6. فايل را ذخيره کنيد.

با ساخت EJB پياده سازي Business Tier از معماري پايان يافت.
در ادامه به پياده سازي ماژول هاي Web Tier خواهيم پرداخت.

mahyar_ev | 02:17 PM | Comment(s)(0)

ساخت وب سرويس DukesAge

December 30, 2007 03:23 PM

پياده سازي Application معرفي شده در مطلب قبل را آغاز مي كنيم.

ايجاد يک فولدر براي پروژه
ابتدا براي قرار دادن كليه فايل هاي مربوط به پروژه يك فولدر خاص ايجاد مي نماييم. نام اين فولدر را myexample بگذاريد.

ايجاد وب سرويس

خروجي اين وب سرويس، برگرداندن سال سن Duke ، است. اين وب سرويس هيچ پارامتر ورودي ندارد.
در اين مرحله يك پروژه براي اين وب سرويس ايجاد مي كنيم. سپس يك كلاس جاوا ساده مي سازيم و تغييرات لازم را براي تبديل آن به يك وب سرويس اعمال مي كنيم و كدهاي لازم را مي نويسيم.
مراحل گام به گام ساخت آن بدين شرح است:

تعريف پروژه
1. در NetBeans از منوي File منوي New Project را انتخاب نماييد.
2. در category هاي موجود web را انتخاب کنيد.
3. از انواع پروژه ها Web Application را انتخاب نماييد.
4. Next را کليک کنيد.
5. نام پروژه را firstcup-dukes-age قرار دهيد.
6. Location پروژه را همان فولدر myexample که ساخته ايد قرار دهيد.
7. App Server را Java System Application Server انتخاب کنيد.
8. Java EE version را Java EE 5 قرار دهيد.
9. Finish را کليک کنيد. اکنون بايد پروژه شما ساخته شده باشد و در پنل Projects در سمت چپ NetBeans قابل رويت باشد.
10. در قسمت web pages از منوي درختي پروژه فايل index.jsp را بيابيد. روي آن کليک راست کنيد و سپس با استفاده از گزينه delete آن را حذف کنيد.


ساخت کلاس DukesAge
1. پروژه firstcup-dukes-age را در NetBeans انتخاب کنيد.
2. از منوي File گزينه New File را انتخاب کنيد.
3. از category ها Java Classes را انتخاب کنيد.
4. از انواع فايل نيز Java Class را انتخاب کنيد.
5. Next را کليک کنيد.
6. نام کلاس را DukesAge قرار دهيد.
7. در قسمت Package عبارت com.sun.firstcup.webservice را تايپ کنيد.
8. Finish را کليک کنيد. با اين کار فايل DukesAge.java در همان Package مشخص شده ايجاد مي شود و براي ويرايش، در صفحه باز مي شود.

تعريف کلاس DukesAge بعنوان يک وب سرويس
براي اين کار عبارت WebService@ را درست قبل از جايي که کلاس، تعريف شده قرار دهيد. بدين صورت:

@WebService
public class DukesAge {

}

حذف Constructor پيش ساخته
از آنجا که وب سرويس نياز به constructor ندارد. آن را از کلاس DukesAge حذف کنيد.

افزودن متد getDukesAge
متدي به نام getDukesAge با خروجي int در داخل کلاس، ايجاد کنيد و قبل از آن نيز عبارت WebMethod@ را قرار دهيد. بدين صورت:

@WebMethod
public int getDukesAge() {
}

سپس دستورات زير را در بدنه متد کپي کنيد.

Calendar dukesBirthday = new GregorianCalendar(1995,Calendar.MAY,23);
Calendar now = Calendar.getInstance();
int dukesAge = now.get(Calendar.YEAR) - dukesBirthday.get(Calendar.YEAR);
dukesBirthday.add(Calendar.YEAR,dukesAge);

if (now.before(dukesBirthday)){
    dukesAge--;
}
return dukesAge;

رفع مشكل Import
1. روي اديتور كليك راست نماييد .
2. گزينه Fix Imports را انتخاب نماييد.
3. پكيج javax.jws.WebService را براي کلاس WebService انتخاب نماييد.

Build و Deploy نمودن وب سرويس
از پنل پروژه ها firstcup-dukes-age را انتخاب نموده و کليک راست کنيد. سپس گزينه Build Project را انتخاب نماييد. با اين کار پروژه در firstcup-dukes-age.war پکيج مي شود.
پس از پايان build مجددا كليك راست نماييد و اين بار گزينه Deploy Project را انتخاب كنيد.

mahyar_ev | 03:23 PM | Comment(s)(0)

اولين فنجان

December 26, 2007 01:07 PM

همانگونه كه در مطالب قبلي نوشتم، قصد دارم كه يك Web Application را شروع كنم و روي جزئيات طراحي و پياده سازي اش متمركز شوم. بعنوان اولين پروژه، بهتر آن ديدم كه firstcup خود جاوا را براي اين كار انتخاب كنم كه خود sun آن را بعنوان اولين گام در نظر گرفته. در مطالب آتي طراحي و پياده سازي كليه ماژول ها را آنطور كه در مستندات firstcup ارائه شده در اينجا خواهم آورد. درخاتمه بحث هم به اميد خدا كل مطالب را يك جا بصورت يك فايل براي دانلود در اين وبلاگ خواهم گذاشت. پس علاقمندان جاوا با من همراه شويد. ضرر نمي كنيد.

نرم افزارهای مورد نیاز
براي پياده سازي و اجراي اين Application به نرم افزارهاي زير نياز خواهيد داشت.
• Java EE 5 SDK
• NetBeans IDE 5.5
دوستان خارج از ايران مي توانند آنها را از سايت sun دانلود نمايند. اما در مورد دوستان داخل ايران لينك هاي دانلود اين نرم افزارها را مي توانيد اينجا بيابيد البته متاسفانه لينك ارائه شده در اين آدرس هم توسط بعضي ISP ها فيلتر شده. درصورت فيلتر بودن ISP هاي ديگر را امتحان كنيد.
نكته: استفاده از هر IDE دیگری نیز که با Java EE 5 سازگار باشد امکان پذیر است. اما شرح مراحل کاری که در اینجا ارائه شده با توجه به امكانات NetBeans 5.5 است.

شرح كاركرد Application
نحوه كاركرد Application بدين صورت است كه وقتي شما آن را توسط Browser اجرا مي كنيد، در صفحه اي تاريخ ميلادي تولد شما دريافت مي شود. سپس Application تاريخ تولد شما را با تاريخ تولد Duke كه يك تاريخ مشخص ( 23 ماه مي 1995 ، تاريخي كه اولين نسخه دمو زبان جاوا عرضه عمومي شد) است مقايسه مي نمايد. درنهايت Application وضعيت سن شما را نسبت به Duke به عنوان پاسخ برمي گرداند. اينكه آيا شما بزرگتر، كوچكتر يا هم سن Duke هستيد.

معماری
این App شامل سه کامپوننت اصلی است:
• DukesAgeService : یک Web Service است و با JAX-WS پیاده می شود و سن Duke را محاسبه می نماید.
• DukesBirthdayBean : یک Enterprise bean است که تفاوت سن وارد شده توسط کاربر را از سن Duke محاسبه می کند.
• firstcup : یک WebApp که با JSF ساخته می شود. firstcup از DukeAgeService برای نمایش سن Duke استفاده می کند. همچنین تاریخ وارد شده توسط کاربر را می خواند. با استفاده از DukesBirthdayBean تعیین می کند که سن کدام بیشتر است. سپس تفاضل دو سن را برای کاربر نمایش می دهد.

این WebApp شامل فایل های زیر است:
• فایل greeting.jsp یک صفحه jsp است که کاربر می توان درآن تاریخ تولد خود را وارد کند.
• فایل response.jsp یک صفحه jsp است که پاسخ را به کاربر نشان مي دهد و اعلام مي كند که آیا سن او از Duke بیشتر است یا کمتر يا هم سن هستند.
• فایل DukesBDay.java که یک managed Bean است و مشخصه ها را تعریف می کند، سن جاری Duke را از Web Service می گیرد. همچنین تفاضل دو سن را از enterprise Bean دریافت میکند.
• فایل faces-config.xml برای configure نمودن بخش های مرتبط با JSF به کار می رود.
• فایل web.xml که Deployment Descriptor برنامه است و تنظیمات App برای نصب در آن ثبت می گردد.

Tier ها در این مثال
این مثال دارای
یک کامپوننت Web Tierيعني firstcup
دو کامپوننت Business Tier يعني DukeAgeService و DukesBirthdayBean
است.
Browser کاربر client Tier است. ضمنا این مثال EIS Tier ندارد.

Tier هاي اين Application را به همراه كليه فايل ها و كلاس هاي اصلي Application در شكل زير ملاحظه مي كنيد.

firstcupArchitecture_small.JPG
تصوير بزرگتر

در مطلب بعد پروژه را با پياده سازي وب سرويس DukesAge ادامه خواهم داد.

mahyar_ev | 01:07 PM | Comment(s)(0)

استفاده از Web Service در برنامه

October 1, 2007 12:49 PM

در مطلب قبل چگونگي ايجاد يك Web Service را ديديم. در اين مطلب يك Web Service Client خواهيم ساخت كه از Web Service ساخته شده در قسمت قبل استفاده كند. براي اينكار ما همچنان ازJavaEE 5 و NetBeans IDE 5.5 استفاده خواهيم نمود.

مراحل كار:

1- ساخت يك Web Application
همانگونه كه در مطلب قبل نيز توضيح داده شد براي ساخت يك Web Application بايد پس از اجراي NetBeans IDE از منوي File منوي New Project را انتخاب نماييد. با اين كار فرم ديگري باز مي شود. در فرم مذكور از قسمت Web گزينه Web Application را انتخاب كرده، دكمه Next را بفشاريد. در مرحله بعدي، نام پروژه و مسير آن را مشخص كنيد و دكمه Finish را بزنيد.

نكته: اجباري نيست كه براي استفاده از Web Service حتما يك Web Application داشته باشيد. مي توان Web Service را از داخل هر Application جاوا فراخواني كرد. در اينجا بعنوان نمونه از Web Application براي اين كار استفاده شده است.

2- ساخت يك package
در NetBeans روي پروژه راست كليك كرده، گزينه New و سپس Java Package را انتخاب نماييد. در فرمي كه باز مي شود نام package را WSClientPac وارد كنيد. همچنين فيلد location را Source Package قرار دهيد. در انتها دكمه Finish را فشار دهيد.

3- ساخت يك Web Service Client
روي پروژه راست كليك كرده، گزينه New و سپس Web Service client را انتخاب نماييد. فرمي باز مي شود. در اين فرم اولا گزينه WSDL URL را انتخاب كنيد و مسير فايل wsdl مربوط به Web Service را در باكس مقابل آن وارد كنيد. همچنين فيلد package را با WSClientPac پر كنيد. دكمه Finish را در پايان فشار دهيد. اگر خطايي رخ ندهد، با اين كار در مسير پروژه فولدري به نام Web Service Refrences ايجاد مي شود كه مشخصات Web Service Client مربوطه را در خود دارد.

سوال: فايل wsdl چيست و چطور آن را بيابيم؟
wsdl مخفف Web Service Description Language ، فايلي است به فرمت XML كه مشخصات Web Service را در خود دارد. براي استفاده از Web Service بايد مسير فايل wsdl آن را بدانيد. همه توليد كنندگان Web Service اين مسير را در اختيار استفاده كنندگان قرار مي دهند.
در مورد Web Service اي كه در قسمت قبل ساختيم، براي پيدا كردن مسير اين فايل، روي Web Service مربوطه راست كليك كنيد و گزينه peoperties را انتخاب كنيد. مسير wsdl در پايين اين صفحه نوشته شده است. اين مسير بايد چنين باشد:

http://localhost:8080/TestWebApplication/TestWebServiceService?wsdl

4- ايجاد يك كلاس براي فراخواني Web Service و نوشتن كدهاي لازم
روي پروژه راست كليك كرده و New و سپس Java Class را انتخاب كنيد. نام كلاس را HelloClient وارد كنيد. همچنين فيلد Package را هم با WSClientPac مقداردهي كنيد. دكمه Finish را بزنيد.
بدين ترتيب فابل HelloClient.java ساخته مي شود كه حاوي كدهاي اوليه تعريف كلاس است. كدهاي لازم را به اين فايل اضافه كنيد تا نهايتا محتويات فايل به اين صورت شود:

package WSClientPac;

import javax.xml.ws.WebServiceRef;
import WSClientPac.TestWebService;
import WSClientPac.TestWebServiceService;

public class HelloClient {
    static TestWebServiceService service = new TestWebServiceService();
   
    public HelloClient() {}
   
    public String getHello(String name){
        String result="";
        try{
            TestWebService port = service.getTestWebServicePort();
            result = port.sayHello(name);
        } catch (Exception e){
             result = e.toString();
        }
       
        return result;
    }
   
}
 

5- فراخواني متد getHello
در قسمت body فايل index.jsp واقع در فولدر Web Pages دستورات زير را اضافه نماييد:

<%@ page import="WSClientPac.HelloClient" %>
<% HelloClient hc = new HelloClient(); %>
<p><%= hc.getHello("JavaBorder") %> </p>

6- اجراي برنامه
با F6 برنامه را اجرا كرده و نتيجه را در Browser ببينيد. اگر خطايي رخ ندهد، در خروجي بايد پيغام "Hello, JavaBorder" را ببينيد. البته فراموش نكنيد كه قبل از اجراي برنامه Web Service را Deploy نماييد.

mahyar_ev | 12:49 PM | Comment(s)(2)

ايجاد web service در JavaEE 5 توسط NetBeans 5.5

September 24, 2007 10:55 AM

در JavaEE 5 از تكنولوژي JAX-WS براي ساخت و استفاده از Web Service هاي XML اي استفاده مي شود. JAX-WS مخفف Java API for XML Web Services مي باشد.
همانگونه كه مي دانيد برقراري ارتباط در Web service ها با پروتوكل SOAP انجام مي شود. اين پروتوكل تبادل اطلاعات را به فرمت XML بر بستر پروتوكل HTTP فراهم مي سازد.

ساخت يك Web Service ساده در يك Web Application:

1- ايجاد يك Web Application در NetBeans IDE:
پس از اجراي NetBeans IDE از منوي File منوي New Project را انتخاب نماييد. با اين كار فرم ديگري باز مي شود. در فرم مذكور از قسمت Web گزينه Web Application را انتخاب كرده، دكمه Next را بفشاريد. در مرحله بعدي، نام پروژه و مسير آن را مشخص كنيد و دكمه Finish را بزنيد. بدين ترتيب يك Web Application خالي ساخته ايد.

2- ايجاد يك Package:
در تب هاي سمت چپ NetBeans تب Projects را انتخاب نماييد و داخل آن روي پروژه اي كه در مرحله قبل ايجاد كرده ايد راست كليك كنيد. از منوي New گزينه Java Packageرا انتخاب كنيد. فرمي باز مي شود كه در آن نام Package خود را وارد كنيد. در اين مثال نام آن را TesWebServicePac وارد كنيد. همچنين فيلد location را Source Package قرار دهيد. در انتها دكمه Finish را فشار دهيد.

3- افزودن يك Web Service:
از همان منوي مرحله قبل يعني راست كليك روي پروژه و انتخاب New وارد شويد اما اين بار گزينه Web Service را انتخاب نماييد. نام Web Service را TestWebService وارد كنيد و TestWebServicePac را بعنوان package آن انتخاب نماييد. سپس دكمه Finish را بزنيد.
با اين كار در فولدر Web Services پروژه، آيكوني به نام TestWebService ايجاد مي گردد. روي آن كليك نماييد تا فايل TestWebService.java براي ويرايش باز شود.

4-نوشتن كدهاي لازم:
خود NetBeans بخش هايي از كد را مي سازد. اما بدنه كلاس و متدهاي آن را شما بايد خود كدنويسي كنيد. به هر حال در نهايت داخل TestWebService.java اين كدها بايد نوشته شوند:

package TesWebServicePac;

import javax.jws.WebMethod;
import javax.jws.WebService;

@WebService()
public class TestWebService {
    private String message = new String("Hello, ");
   
    public void TestWebService(){}
   
    @WebMethod()
    public String SayHello(String name) {
        return message+name+".";
    }
}
 

عبارت WebService@ مشخص مي كند كه كلاس مربوطه يك Web Service است. عبارت WebMethod@ قبل از متد مشخص مي كند كه اين متد از Operation هاي Web Service است و توسط Web Application هاي ديگر قابل فراخواني است.
متد SayHello كاركردي بسيار ساده دارد. يك اسم را بعنوان پارامتر ورودي مي گيرد و همان اسم را به علاوه عبارت Hello"" بر مي گرداند.

5- Deploy كردن پروژه:
قبل از تست Web Service لازم است كه Application را Deploy نماييد. به اين منظور Application را انتخاب و روي آن راست كليك كنيد. سپس گزينه Deploy Project را انتخاب نماييد. صبر كنيد تا عمليات Deploy خاتمه يابد.

6- نحوه تست Web Service:
Web Service ها براي تست نياز به يك Web Service Client دارند. اما NetBeans IDE خود، ابزار تست آنها را در اختيار برنامه نويس گذارده است. كافي است، آن Web Service را انتخاب كرده و روي آن راست كليك كنيد. سپس گزينه Test Web Service را انتخاب نماييد. با اين كار در Browser شما صفحه اي باز مي شود كه از شما پارامتر مورد نظر را مي گيرد و پس از submit كردن، خروجي متد مربوطه را به همراه ساختار SOAP Request و SOAP Response به فرمت XML نمايش مي دهد.

mahyar_ev | 10:55 AM | Comment(s)(0)

خطاي Password Protected Site هنگام اجراي NetBeans IDE

September 8, 2007 05:26 PM

هنگامي كه NetBeans IDE 5.5 را اجرا مي كنيد، معمولا وقتي كه از طريق يك Proxy server به اينترنت وصل شده ايد يك پيغام جهت دريافت UserName و Password مشاهده خواهيد نمود كه عنوانش اين است: Password Protected Site
آن UserName و Password مربوط به Tomcat Server است و آن را مي توانيد در فايل tomcat-users.xml بيابيد. اين فايل را در مسير نصب NetBeans جستجو كنيد. در مسيري مانند اين، آن را خواهيد يافت:

Program Files\netbeans-5.5\enterprise3\apache-tomcat-5.5.17\conf\tomcat-users.xml

يكي از UserName و Password ها احتمالا اين است: User = tomcat Pass = tomcat
اگر UserName و Password كه آنجا مشخص شده را در فرم مربوطه وارد كنيد، احتمالا فرم بسته نمي شود و مشكل شما حل نشده باقي مي ماند.

جهت رفع اين اشكال يك لحظه يا شبكه خود را disable كنيد يا كابل شبكه تان را قطع نماييد. صبر كنيد تا در فرم welcome در قسمت articles and news و Blogs پيغام Can not Connect to internet ظاهر شود. سپس UserName و Password را وارد كنيد. احتمالا اين بار مي توانيد وارد NetBeans IDE شويد. بلافاصله تيك Show On Startup را در صفحه Welcome برداريد تا در دفعات بعدي ديگر با اين مشكل مواجه نشويد. شبكه تان را Enable نماييد يا كابل را مجددا وصل كنيد.

mahyar_ev | 05:26 PM | Comment(s)(0)