اسباب کشی

November 10, 2008 01:10 PM

سلام دوستان، چندی است که به نوشته های پراکنده ام در اینجا و آنجا سر و سامانی داده ام. می‌خواهم از این پس نوشته‌های خود ازجمله نرم ا�?زاری، سینمایی و دیگر را در یک جا منتشر کنم. از این رو سایت پاس‌پارس را راهش انداخته ام. پس دیگر گمان نمی‌کنم در این وبلاگ چیزی بنویسم. همراهان این وبلاگ پس از این در بخش یادداشت های نرم ا�?زاری پاس‌پارس می توانند نوشته های نرم ا�?زاری مرا دنبال کنند. نوشته های قابل است�?اده این وبلاگ را هم به آنجا برده‌ام. همچنین سپاسگزار می‌شوم که مرا از نظرات خود بهره مند سازید. پس شما را در پاس‌پارس و یادداشت های نرم ا�?زاری پاس‌پارس می‌بینم...

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

مصاحبه با كي هورستمن

May 7, 2008 02:52 PM

مصاحبه با "كي هورستمن" يكي از نويسندگان هسته جاوا را مي توانيد اينجا بخوانيد. به عنوان يك جاواكار متعصب بعضي نظراتش جالب است.

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

جاوا و ديگر زبان هاي برنامه نويسي

April 13, 2008 02:53 PM

يادش به خير، آن روزها كه ما نرم ا?زار مي خوانديم (همه اش ده دوازده سال پيش) غير از چهار پنج زبان برنامه نويسي اصلي، زبان ديگري نبود. از اين چهار پنج تا هم ?قط دو زبان C و پاسكال بود كه بعنوان زبان هاي اصلي برنامه نويسان شناخته مي شد و ساير زبان ها از جمله ?رترن و كوبول و اسمبلي و بيسيك، كاربردهاي خاص داشتند. اما امروزه زبان هاي برنامه نويسي بسياري وجود دارد. علاوه بر آنها تكنولوژي هاي ديگري نيز هستند كه دانستن آنها براي هر برنامه ساز ضروري است.
ديگر بر هيچ آدم نرم ا?زاري اي پوشيده نيست كه دانستن يك زبان برنامه نويسي و چسبيدن به آن براي سرپا و زنده ماندن در دنياي نرم ا?زار ك?ايت نمي كند. امروزه شما بعنوان يك برنامه نويس بايد با انواع زبان ها و تكنولو?ژي ها آشنا باشيد.

Java
C#
PHP
Ruby
HTML
SQL
ASP
Perl
JavaScript

اين ?قط مشتي از خروار است.
براي ما آموختن همه اين زبان ها كه امكان پذير نيست. اما براي بقا در دنياي نرم ا?زار لازم است حداقل با زبان هاي مهم تر و پر كاربردتر آشنا شويم.

اما چرا اين حر? ها را در اين وبلاگ مي زنم. راستش با وجوديكه تا كنون بيشتر روي جاوا متمركز بوده ام، اما مدتي است به زبان هاي ديگر هم توجه نشان مي دهم و سعي مي كنم حر? هاي موا?قين و مخال?ين جاوا را بشنوم. قصدم اين است كه جايگاه زبان جاوا را در ميان ساير زبان هاي برنامه نويسي بيابم و نقاط قوت و ضع? آن را شناسايي كنم.

در اين رابطه چند سوال دارم:
1- بطور كلي جايگاه جاوا در ميان ساير زبان هاي برنامه نويسي كجاست؟
2- آشنايي با جاوا تا چه حد براي برنامه نويسان لازم است؟
3- آيا جاوا كا?ي است؟ اگر نه، دانستن چه زبان ها و تكنولوژي هاي ديگري لازم است و چرا؟

به نظرم اين موضوع خوبي است براي گ?ت و گو. پس نظر بدهيد.

mahyar_ev | 02:53 PM | Comment(s)(4)

يك بهاريه كوتاه

March 17, 2008 01:15 PM

مدتي است كه مطلب نويي در اين وبلاگ ننوشته ام. دلايلش زياد است. اول همان بهانه هميشگي "وقت ندارم". ديگر اينكه غير از جاوا دغدغه هاي نرم ا?زاري و غير نرم ا?زاري ديگري هم داشته ام كه وقتم را پر كرده است. با اين حال همچنان يك چشمم به اين وبلاگ است و همه جا سرك مي كشم تا مطلبي در خور نوشتن در اينجا بيابم.
و اما قصدم از نوشتن اين مطلب، اول اعلام حضور است و اينكه هنوز هستم و حواسم به اين وبلاگ هم هست. دوم عرض تبريك سال نو به همه ?ارسي زبانان. چه آنها كه اهل جاوا هستند و چه ديگران. اميد كه سال 87 سالي خوش و پر از مو?قيت براي شما و من باشد و همه از زندگي راضي باشيم. چون آنچه مهم است خود زندگي است. جاوا و دات نت و وب و بقيه، وسيله اند.
اميدوارم رخوت زمستاني اين وبلاگ هم هرچه زودتر تمام شود و به همت شما و من، Javaborder دوباره بهاري شود.

mahyar_ev | 01:15 PM | Comment(s)(1)

يك كد جاوا اسكريپت ديگر براي �?رمت بندي HTML

January 28, 2008 02:15 PM

قبلا يك كد جاوا اسكريپت براي �?رمت بندي متن بصورت HTML در اين وبلاگ قرار داده بودم (اينجا). آن برنامه است�?اده اش كمي سخت بود و كاربر كنترلي روي �?رمت بندي نداشت. يك نسخه ديگر از آن نوشته ام كه شباهت بيشتري با اديتورهاي HTML مرسوم در وبلاگ ها دارد و عملكردش بيشتر قابل كنترل است. Source آن را از اينجا مي توانيد دريا�?ت نماييد.

mahyar_ev | 02:15 PM | Comment(s)(2)

دانلود firstcup

January 27, 2008 02:39 PM

كليه مطالب ارائه شده در خصوص پياده سازي firstcup Enteprise Application را در يك ?ايل PDF آماده كرده ام كه از اينجا قابل دريا?ت است.
در ضمن باعث خوشحالي من است كه دوستاني كه اين مطالب را مي خوانند نظرات خود را درباره آن اعلام كنند.
به نظر شما مجموعه مطالب مربوط به firstcup چطور بود؟ كم و كسري هايش چه بود؟ آيا اين رويه را ادامه دهم يا خير؟ چه پيشنهاد يا انتقادي براي بهتر شدن مطالب داريد؟
ممنون

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

جرعه آخر 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)

مشخصات Tier ها

December 16, 2007 03:36 PM

Tired Applications:
WebApp معمولا شامل Client Tier و Middle Tier و Data Tier است. توجه JavaEE بر لايه مياني است.
از نظر منطقي نيز مي توان لايه هاي App را بدين صورت درنظر گر�?ت:

Client Tier: عبارت است از کاربري که به WebApp دسترسي مي يابد. تعري�? مشخصات اين بخش از دسترس برنامه ساز خارج است.

Web Tier: عبارت است از کامپوننت هايي که ارتباط بين client را با Business tier برقرار مي کنند. وظاي�? اصلي آن عبارت است از:
• ايجاد محتواي ديناميک به �?رمت هاي گوناگون (براي client هاي گوناگون)
• دريا�?ت اطلاعات وارد شده توسط کاربر و برگرداندن نتايج توليد شده توسط Business Tier
• کنترل گشت و گذار client در ص�?حات
• مديريت وضعيت داده هاي session کاربر
• انجام برخي کارهاي پايه اي و نگهداري موقت برخي داده ها در JavaBean ها
تکنولوژي هايي که در لايه Web tier است�?اده مي شوند عبارتند از
• Servlet
• JSP
• JSF يا JavaServer Faces
• JavaServer Pages Standard Tag Library
• JavaBeans Component

Business Tier: اين لايه شامل کامپوننت هايي است که Business logic را پياده مي کنند. منظور از Business logic کدهايي است که امکان است�?اده از توابع و کارهاي خاص حوزه کاري مربوطه را �?راهم مي کنند. در يک App که از طراحي خوبي برخوردار است، بايد توابع و کارکردهاي اصلي در اين لايه پياده شوند.
تکنولوژي هايي که در اين لايه است�?اده مي شوند:
• Enterprise JavaBeans components
• JAX-WS web service endpoints
• Java Persistence API entities

Enterprise Information Systems Tier يا EIS:
اين لايه شامل database server ها، سيستم هاي resource planning و کليه منابع داده اي است. معمولا اين منابع روي کامپيوترهايي غير از سرور JavaEE نصب هستند. اتصال به آنها توسط کامپوننت هاي Business tier انجام مي شود.
در اين لايه از تکنولوژي هاي زير است�?اده مي شود:
• JDBC يا Java Database Connectivity API
• Java Persistence API
• J2EE Connector Architecture
• Java Transaction API يا JTA

منبع: FirstCup

mahyar_ev | 03:36 PM | Comment(s)(2)

JavaEE Web Application

December 16, 2007 03:30 PM

صحبت را با نگاهي به م?هوم Web Application در JavaEE ادامه مي دهم.
Web Application چيست؟
يکي از تعاري? Web Application مي گويد که Web Application نرم ا?زاري است که تحت وب مورد دستيابي قرار مي گيرد. يکي از دلايل عموميت يا?تن Web Application ها اين است که از همه جا قابل دسترسي است و دسترسي به آن نياز به نصب نرم ا?زارخاصي روي client ندارد.

اما Sun، يک Web Application را بعنوان يک Web Server يا Application Server پيشر?ته تعري? مي کند و به دو گونه، تقسيم مي کند.:
• Presentation-oriented: اين نوع WebApp ص?حات وبي ايجاد مي کند که امکان تعامل با کاربر را ?راهم مي سازند. اين ص?حات مي تواند انواع markup language ها همچون HTML و XML را دربر مي گيرد. همچنين محتواي آنها بصورت ديناميک، با توجه به درخواست کاربر توليد مي شوند.
• Service-oriented: اين نوع WebApp امکان است?اده از Web Service را ?راهم مي کنند. اغلب Presentation-oriented App ها بعنوان client براي Service-oriented App ها هستند.

در Java 2 platform توليد محتواي ديناميک با ص?حات jsp يا Servlet ها انجام مي شود که به Web Component معرو?ند.
Servlet ها کلاس هاي ايجاد شده به زبان جاوا هستند که بصورت ديناميک درخواست ها را پردازش و پاسخ ها را توليد مي کنند. ص?حات jsp ?ايل هاي متني هستند که بعنوان servlet عمل مي کنند اما ر?تار آنها در توليد محتواي ديناميک قابل درک تر است. اگرچه jsp و servlet به جاي يکديگر قابل است?اده هستند ، اما هر کدام نقطه قوت و ضع? خاص خود را دارند. Servlet ها بيشتر براي ايجاد Service-oriented App ها ، همچنين توابع کنترلي Presentation-oriented App مناسب هستند. اما jsp ها بيشتر براي توليد متن هاي markup مثل HTML، WML، XML و SVG (Scalable Vector Graphics) مناسب هستند.
پس از معر?ي Servlet و jsp، تکنولوژي ها و framework هاي جديدي براي توليد WebApp ها ايجاد شد. از جمله JSF. با اين حال Servlet زيربناي همه تکنولوژي هاي مذکور است.
هريک از تکنولوژي هاي بعد از Servlet لايه اي بر abstraction ا?زودند و باعث ا?زايش سرعت و ارتقاء کي?يت توليد WebApp ها شدند.
Web Component ها روي پلت?رمي به نام Web Container اجرا مي شوند. Web Container انواع سرويس ها و امکانات لازم براي است?اده Web Component ها، همچنين امکان دسترسي به ساير API ها را ?راهم مي سازد.
ر?تار WebApp هنگامي که روي Web Containerنصب (deploy) مي شود قابل تنظيم (configuration) است. اين تنظيمات در ?ايل هايي به ?رمت XML به نام Deployment descriptor يا DD درج مي شوند.

مراحل توليد يک WebApp :
1. ايجاد کدهاي برنامه
2. ايجاد DD برنامه
3. کامپايل برنامه با همه کلاس هاي کمکي است?اده شده توسط Web Componnet ها
4. ?رايند اختياري Package کردن App به يک Deployment unit
5. Deploy کردن App روي Web Container
6. انتساب WebApp به يک URL

منبع: Java EE Tutorial

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

جاوا آسان نمود اول، ولي افتاد مشكل ها !

December 15, 2007 01:43 PM

مطالبي كه تا به حال در اين وبلاگ نوشته ام، تقريبا همه اش چيزهايي بوده كه در همان زمان نوشتن تجربه اش كردم و درگيرش بوده ام. در واقع بهتر است بگويم در همان زمان،خودم هم آنها را ياد گر�?ته ام. در واقع اين وبلاگ نمايانگر سير آموخته هاي من در مورد جاوا است. اينكه در هر زمان روي چه بخشي از جاوا دست گذاشته ام و بعدش سراغ چه ر�?ته ام. قبلا هم گ�?ته ام كه از نوشتن در اين وبلاگ دو هد�? را دنبال كرده ام. اول اينكه برايم انگيزه اي شود براي بيشتر مطالعه كردن. دوم اينكه جوابي به سوالات خودم در مورد جاوا بدهم. سوالاتي كه ممكن است سوال ديگران هم باشد.
اصولا جاوا زبان خاصي است و با ساير زبان هاي برنامه نويسي ت�?اوت دارد. جاوا حد و مرز ندارد. شايد اين، بخاطر open source بودن آن باشد كه امكان چنين رشد و گسترش عجيب و غريبي را به آن داده است. جاوا نه �?قط يك سينتكس كه مجموعه از استانداردها، pattern ها، كتابخانه و Framework هايي است كه روز به روز نيز در حال گسترش اند. هر از گاهي Framework هاي قبلي، جاي خود را به نسخه هاي پيشر�?ته تر و جديد تر مي دهند. موارد كاربرد جاوا نيز �?راوان است و تقريبا همه بخش هاي نرم ا�?زاري را دربر مي گيرد. از نرم ا�?زار هاي دسكتاپ گر�?ته تا تحت وب و موبايل و غيره.
تا به حال در اين وبلاگ در هر برهه، موضوعي را بعنوان محور بحث، انتخاب كرده ام و تا حدي كه در توانم بوده به آن پرداخته ام و سعي كرده ام كه به نتيجه اي برسانمش. مثلا jsp يا XML يا jsf. اما هنوز شايد خواننده نوشته هاي من با ذات و جوهره جاوا آشنا نشده باشد (چون خودم هم هنوز آشنا نيستم). در واقع آنچه تا به حال ارائه كرده ام، معر�?ي تكنولوژي ها و framework هاي مطرح و آشنا در جاوا بوده.
شايد الان وقتش باشد كه كمي تغيير رويه دهم و از معر�?ي framework صر�? �?اصله بگيرم و نگاهي كاربردي تر، عملي تر و عميق تر به جاوا بيندازم و در اين رهگذار به اصول طراحي و ساير مباحثي كه تا به حال �?رصتش پيش نيامده، بپردازم. از اين رو تصميم دارم از انواع application هاي جاوا نمونه هايي را انتخاب كنم و آرام آرام پيش ببرم و اين اصول را در آنها پياده كنم.
مي دانم كاري كه مي خواهم انجام دهم كار سختي است (حداقل براي من). چون دانش و تجربه لازم را ندارم. مخصوصا اينكه غير از پروژه هايي كه خودم تعري�? كرده ام، هيچ پروژه واقعي، در اين زمينه انجام نداده ام. اين نكته هم مي تواند عيب تلقي شود و هم حسن. عيبش كه معلوم است. تجربه چيزي است كه آدم با خواندن هزار كتاب هم به دست نمي آورد. مخصوصا در نرم ا�?زار، هميشه قواعد تئوري نوشته شده در كتابها جواب نمي دهد و بعضا بايد با توجه به مشكلات عملي پيش آمده حين كار، رويه خاصي برگزيد. اين قابليت و توانايي بدست نمي آيد مگر با تجربه و لمس عملي مشكلات. اما حسن اين كار چيست. حسنش اين است كه مبناي كار من اصول تئوري و آموزشي جاوا است و از اين نظر خودم و خواننده را با م�?اهيم نظري اين زبان بطور عملي آشنا مي سازد و در جاوا راهش مي اندازد.
براي شروع كار تصميم دارم يك Web Application نمونه اي را با جاوا شروع كنم و قدم به قدم پيش ببرم. روي لايه ها تمركز كنم. در هر لايه Framework هاي مورد است�?اده را نام ببرم و الگوهاي طراحي هر لايه را ذكر كنم و انواع روش هاي ممكن را معر�?ي كنم.
كار سختي است، براي من راه نابلد. به كمك و راهنمايي دوستان بسيار نياز خواهم داشت. چون قطعا نوشته هايم خالي از غلط نخواهند بود. از همه دوستاني كه جاوا كاركرده اند و با م�?اهيم آشنا هستند، خواهشمندم كه اشتباهاتم را تذكر دهند و نوشته هايم را تصحيح نمايند. همچنين راه حل هاي ديگر را در مورد مساله مورد بحث ارائه نمايند. احتمالا آرام آرام پيش خواهم ر�?ت و گاهي هم راهي را خواهم ر�?ت كه مجبور به برگشت از آن و انتخاب راهي ديگر خواهم شد. سردر گمي هايم را ببخشيد و مرا از راهنمايي هاتان بي نصيب نگذاريد.
اميدوارم با كمك يكديگر مطالب اين وبلاگ م�?يد تر و بهتر شود و بتوانيم جاي خالي يك منبع جامع عملي �?ارسي را در مورد application هاي جاوا، تا حدودي پر نماييم.
اگر خدا بخواهد. در مطلب بعدي يك Web Application را با جاوا شروع خواهم كرد.

mahyar_ev | 01:43 PM | Comment(s)(1)

ايجاد محتواي دايناميك XML با ليستي از Item ها

November 28, 2007 12:52 PM

در ادامه مطلب قبلي باز هم به توليد XML با محتواي دايناميك مي پردازيم. اين بار محتواي �?ايل XML را توسط ليست آيتم هايي كه در يك Java bean تعري�? شده، ايجاد مي كنيم. براي اين كار دو كلاس به نام هاي Item و Inventory ايجاد مي نماييم.
محتواي �?ايل Item.java چنين است:

package beans;

public class Item implements java.io.Serializable {
    private String name;
    private float price;
    
    public Item(String name , float price) {
        this.name = name;
        this.price = price;
    }
    public String getName() {return name;}
    public float getPrice() {return price;}
}

محتواي �?ايل Inventory.java چنين است:

package beans;

import java.util.Iterator;
import java.util.Vector;

public class Inventory implements java.io.Serializable {
    private Vector items = new Vector();
    
    public Inventory() {
        items.addElement(new Item("LCD",(float)200000.0));
        items.addElement(new Item("Laptop",(float)1000000.0));
    }
    
    public Iterator getItems() {
        return items.iterator();
    }
}

توجه كنيد كه در اينجا محتويات ليست items از كلاس Inventory بصورت ثابت مقداردهي شده اند. اين ليست مي تواند از روي يك منبع داده قابل تغيير مقداردهي شود.
سرانجام مشخصات �?ايل inventory.jsp بدين صورت است:

<%@page contentType="text/xml"%>
<%@page pageEncoding="UTF-8"%>
<%@ page import="beans.Inventory,beans.Item" %>

<jsp:useBean id="inventory" class="beans.Inventory" scope="page" />
<% 
    java.util.Iterator it = inventory.getItems();
    Item item = null;
%>

<?xml version="1.0" encoding="UTF-8"?>
<inventory>
    <% while (it.hasNext()) { 
        item = (Item)it.next(); %>
    <item>
        <name><%= item.getName() %></name>
        <price><%= item.getPrice() %></price>
    </item>
    <% } %>  
</inventory>

با اجراي اين �?ايل jsp روي Browser خود يك ساختار XML را مشاهده خواهيد نمود كه محتويات آن، ليست همه آيتم هاي تعري�? شده در كلاس Inventory است.

منبع : �?صل 11 كتاب Advanced JavaServer Pages

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

ساخت XML با محتوای داینامیک توسط jsp

November 28, 2007 10:01 AM

ساختار استاندارد و شناخته شده تر يک �?ايل jsp مشابه يک �?ايل html است که در ميان تگ هاي آن مي توان تگ هاي jsp را نيز به کار برد. مثال:

<%@page contentType="text/html"%>
<%@page pageEncoding="UTF-8"%>

<html>
    <head>
        <title>JSP Page in HTML format</title>
    </head>
    <body>
<% out.println("This is a jsp in html format.");    %>
    </body>
</html>

اما يک �?ايل jsp مي تواند �?رمت XML نيز داشته باشد. به اين ترتيب مي توان خروجي XML دايناميک توليد نمود. مثال:

<%@page contentType="text/xml"%>
<%@page pageEncoding="UTF-8"%>

<?xml version="1.0" encoding="UTF-8"?>
<documnet>
    <date>
        <%= new java.util.Date() %>
    </date>
</documnet>

نکته 1: توجه کنيد که در هر دو حالت پسوند �?ايل بايد jsp باشد.
نکته 2: به ت�?اوت مقدار contentType در دو مثال دقت کنيد.
نکته 3: خروجي مثال اول در Browser ص�?حه اي است که تنها عبارت "JSP Page in HTML format" در آن نوشته شده. اما خروجي دوم به �?رمت XML است که مقدار عنصر date آن تاريخ جاري سيستم است.

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

نمايش XML در HTML

November 19, 2007 01:21 PM

چندي پيش در كامنت هاي مطلبي مربوط به XML دوست عزيزم سوالي مطرح نمود كه آن زمان من از روي ناداني جوابي دادم كه گرچه غلط نبود، اما جواب سوال او هم نبود. سوال اين بود كه "چطور مي توان يك �?ايل XML را در ص�?حه html نشان داد". باز حين وب گردي هايم به مثالي برخوردم كه گمان مي كنم جواب سوال اين دوست عزيزم باشد.
�?رض كنيد محتويات �?ايل Products.xml چنين باشد:

<?xml version="1.0"?>

<Products>
    <Item>
        <Name>Coffee Cup Warmer</Name>
        <Number>0001</Number>
        <Description>See Name</Description>
        <Price>15.00</Price>
    </Item>
    <Item>
        <Name>T-Shirt with Wacky NorEaster Logo Large</Name>
        <Number>0004</Number>
        <Description>See Name</Description>
        <Price>21.00</Price>
    </Item>
    <Item>
        <Name>Computer For Linux</Name>
        <Number>0009</Number>
        <Description>With Linux Installed</Description>
        <Price>250.00</Price>
    </Item>
    <Item>
        <Name>Flat LCD Display 14"</Name>
        <Number>0010</Number>
        <Description>Recommended for #0009</Description>
        <Price>387.00</Price>
    </Item>
</Products>

با دستورات html زير مي توان محتويات اين �?ايل XML را بصورت جدولي نمايش داد:

<HTML>

<HEAD>
    <TITLE>Show XML In Your HTML </TITLE>
</HEAD>
<BODY>
    <XML ID="MyProducts" SRC="Products.xml"></XML>

    <TABLE ID="ProdTable" DATASRC="#MyProducts" BORDER="1">
    <THEAD>
    <TH>
        Item Name/Description
    </TH>
    <TH>
        Item Number
    </TH>
    <TH>
        Price
    </TH>
    </THEAD>

    <TR>
    <TD>
        <B><Span DATAFLD="Name"></SPAN></B><BR>
        <SPAN DATAFLD="Description"></SPAN>
    </TD>
    <TD>
        <SPAN DATAFLD="Number"></SPAN>
    </TD>
    <TD>
        <SPAN DATAFLD="Price"></SPAN>
    </TD>
    </TR>
</TABLE>

</BODY>
</HTML>

اصل مثال را مي توانيد اينجا ببينيد. 
اميدوارم اين بار ديگر پاسخ سوال را درست داده باشم.

mahyar_ev | 01:21 PM | Comment(s)(2)

نامگذاري Java

November 19, 2007 11:21 AM

قبلا جايي خوانده بودم كه نام java از حر? اول نام سه ن?ر از ا?راد اصلي كه روي آن كار كرده اند، گر?ته شده. همينطور اينكه انتخاب ?نجان قهوه بعنوان نماد آن از اين جهت است كه اين نام گذاري در يك كا?ي شاپ انجام شده. اما در وب گردي هايم در سايت sun به روايت ديگري در اين باره برخوردم. با توجه به اينكه اين مطلب در سايت sun گ?ته شده، قطعا روايت دوم صحيح است. ترجمه روايت اين است:

نام Java در يكي از چندين جلسه brainstorming برگزار شده توسط تيم نرم ا?زاري جاوا انتخاب گرديد. هد? ما رسيدن به نامي بود كه نمايانگر ذات اين تكنولوژي و پويايي، سرعت، سرزندگي و ساير ويژگي هاي اين زبان باشد. Java از ميان پيشنهادهاي بسيار ارائه شده، انتخاب گرديد. Java يك سرنام (acronym) نيست. بلكه اشاره اي است به نوشيدني داغ و خوشبويي كه برنامه نويسان بسيار دوست دارند آن را بنوشند.

پ.ن. يكي از معاني Java در اصطلاح عاميانه، قهوه است.

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