1. مقدمه
نسخه PDF سند در |ICI| موجود است.
مثالهای موجود در سند در |ICI| در دسترس هستند.
در این بخش، هدف ما معرفی مفاهیم کلیدی Struts 2 با استفاده از مثالها است. Struts 2 یک فریمورک وب است که فراهم میکند:
- تعدادی کتابخانه به شکل فایلهای JAR
- یک چارچوب توسعه: Struts 2 بر نحوه توسعه یک برنامه وب تأثیر میگذارد.
پیشنیازهای درک مثالها به شرح زیر است:
- دانش پایهای زبان جاوا
- دانش پایه در توسعه وب، بهویژه HTML.
تمام منابع مورد نیاز برای برآورده کردن این پیشنیازها را میتوان در وبسایت [http://developpez.com] یافت. من خودم چندتایی از آنها را نوشتهام که در وبسایت [http://tahe.developpez.com] یافت میشوند.
مثالهای این سند در URL و [مقدمهای بر Struts 2 از طریق مثالها (۲۰۰۲)] موجود هستند.
برای کسب اطلاعات بیشتر درباره Struts 2، میتوانید از مراجع زیر استفاده کنید:
- [ref1]: مستندات Struts 2، موجود در وبسایت Struts
- [ref2]: کتاب *Struts 2 in Action* اثر دونالد براون، چد مایکل دیویس و اسکات استانلیک، منتشر شده توسط منینگ. این کتاب بهویژه آموزنده است.
ما گهگاه به [ref2] ارجاع میدهیم تا به خواننده اطلاع دهیم که میتواند با استفاده از این کتاب، موضوع را به طور عمیقتر بررسی کند.
این سند به گونهای نوشته شده است که میتوان آن را بدون در اختیار داشتن رایانه مطالعه کرد. بنابراین، ما تصاویر صفحه فراوانی را در آن گنجاندهایم.
1.1. نقش Struts 2 در یک برنامه وب
ابتدا بیایید بررسی کنیم که Struts 2 در توسعه یک برنامه وب چه جایگاهی دارد. اغلب اوقات، چنین برنامهای بر روی یک معماری چندلایه مانند موارد زیر ساخته میشود:
![]() |
- لایه [web] لایهای است که با کاربر وباپلیکیشن تعامل میکند. کاربر از طریق صفحات وب نمایشدادهشده در یک مرورگر با وباپلیکیشن تعامل دارد. Struts 2 در این لایه قرار دارد، و تنها در این لایه.
- لایه [metier] منطق کسبوکار برنامه را پیادهسازی میکند، مانند محاسبه حقوق یا فاکتور. این لایه دادهها را از کاربر از طریق لایه [web] و از سامانه مدیریت پایگاه داده (DBMS) از طریق لایه [dao] استفاده میکند.
- لایه [dao] (ابجکتهای دسترسی به داده)، لایه [jpa] (Java Persistence API) و درایور JDBC دسترسی به دادهها در DBMS را مدیریت میکنند. لایه [jpa] بهعنوان یک ORM (نقشهبردار شیء-رابطهای) عمل میکند. این لایه شکاف بین اشیاء مدیریتشده توسط لایه [dao] و سطر و ستونهای داده در یک پایگاه داده رابطهای را پر میکند.
- یکپارچهسازی این لایهها را میتوان با استفاده از یک کانtejner Spring یا یک کانtejner EJB3 (Enterprise Java Bean) انجام داد.
اکثر مثالهای ارائهشده در زیر تنها از یک لایه، یعنی لایه [web]، استفاده خواهند کرد:
![]() |
با این حال، این سند با ساخت یک برنامه وب چندلایه به پایان میرسد:
![]() |
مجموعه لایههای [metier]، [dao] و [jpa/hibernate] به صورت یک آرشیو JAR در اختیار ما قرار خواهد گرفت، بنابراین، بار دیگر، تنها نیاز به ساخت لایه [web] داریم.
1.2. مدل توسعه Struts 2 MVC
Struts 2 الگوی معماری موسوم به MVC (مدل–نما–کنترلکننده) را به شرح زیر پیادهسازی میکند:
![]() |
پردازش یک درخواست مشتری به شرح زیر انجام میشود:
درخواستهای URL در قالب http://machine:port/contexte/rep1/rep2/.../Action. هستند. مسیر [/rep1/rep2/.../Action] باید با یک اکشن تعریفشده در فایل پیکربندی Struts 2 مطابقت داشته باشد؛ در غیر این صورت، رد میشود. یک اکشن در یک فایل XML به شکل زیر تعریف میشود:
در مثال قبلی، فرض کنید که اکشن URL یا [ http://machine:port/contexte/actions/Action1] درخواست شده است. سپس مراحل زیر انجام میشود:
-
درخواست – کلاینت مرورگر درخواستی را به کنترلکننده [FilterDispatcher] ارسال میکند. این کنترلکننده تمام درخواستهای کلاینت را مدیریت میکند. این نقطه ورود به برنامه است. این «C» در MVC است.
-
پردازش
- کنترلکننده C به فایل پیکربندی خود مراجعه میکند و متوجه میشود که اکشن actions/Action1 وجود دارد. کلاس namespace (خط ۱)، که با نام اکشن (ویژگی name در خط ۲) متصل شده است، اکشن actions/Action1 را تعریف میکند.
- کنترلکننده C، کلاس [2a] از نوع [actions.Action1] (ویژگی class در خط ۲) را نمونهسازی میکند. نام و پکیج این کلاس میتواند هر چیزی باشد.
- اگر URL درخواستی همراه با پارامترهایی از نوع [param1=val1¶m2=val2&...] باشد، کنترلکننده C این پارامترها را به کلاس [actions.Action1] به شرح زیر اختصاص میدهد:
بنابراین کلاس [actions.Action1] باید برای هر یک از پارامترهای مورد انتظار parami، این متدهای setParami را داشته باشد.
- (ادامه)
- کنترلر C درخواست میکند که متد امضای [String execute()] از کلاس [actions.Action1] اجرا شود. این متد سپس میتواند از پارامترهای parami که کلاس بازیابی کرده است، استفاده کند. هنگام پردازش درخواست کاربر، ممکن است به لایههای [metier] و [2b] نیاز باشد. پس از پردازش درخواست مشتری، ممکن است پاسخهای مختلفی تولید شود. یک مثال معمول عبارت است از:
- یک صفحه خطا اگر درخواست نتوانست به درستی پردازش شود
- در غیر این صورت، یک صفحه تأیید
- کنترلر C درخواست میکند که متد امضای [String execute()] از کلاس [actions.Action1] اجرا شود. این متد سپس میتواند از پارامترهای parami که کلاس بازیابی کرده است، استفاده کند. هنگام پردازش درخواست کاربر، ممکن است به لایههای [metier] و [2b] نیاز باشد. پس از پردازش درخواست مشتری، ممکن است پاسخهای مختلفی تولید شود. یک مثال معمول عبارت است از:
متد execute نتیجهای از نوع رشتهٔ کاراکتری را که کلید ناوبری نامیده میشود، به کنترلر C بازمیگرداند. در مثال بالا، [actions.Action1].execute میتواند دو کلید ناوبری تولید کند: «page1» (خط ۳) و «page2» (خط ۴). متد [actions.Action1].execute همچنین قالب M [2c] را بهروزرسانی خواهد کرد که توسط صفحه JSP برای ارسال مجدد به کاربر استفاده میشود. این قالب ممکن است شامل عناصری از:
- (ادامه)
- کلاس [actions.Action1] که ایجاد شده است
- جلسهٔ کاربر
- دادههای دامنهٔ برنامه
- …
- پاسخ – کنترلکننده C به صفحه JSP، که با کلید ناوبری مطابقت دارد، دستور میدهد [3] را نمایش دهد. این نما است، V در MVC. صفحه JSP از قالب M برای inicialize کردن بخشهای پویا در پاسخی که باید به کلاینت ارسال کند، استفاده میکند.
اکنون، بیایید ارتباط بین معماری وب MVC و معماری لایهای را روشن کنیم. در واقع، این دو مفهوم متفاوت هستند که گاهی با یکدیگر اشتباه گرفته میشوند. بیایید یک برنامه وب تکلایه Struts 2 را در نظر بگیریم:
![]() |
اگر لایه [web] را با استفاده از Struts 2 پیادهسازی کنیم، در واقع یک معماری وب MVC خواهیم داشت، اما یک معماری چندلایه نخواهیم داشت. در اینجا، لایه [web] همه چیز را مدیریت خواهد کرد: ارائه، منطق کسبوکار و دسترسی به دادهها. با Struts 2، این کلاسهایی از نوع [Action] هستند که این کار را انجام میدهند.
اکنون، بیایید یک معماری وب چندلایه را در نظر بگیریم:
![]() |
لایه [web] را میتوان بدون فریمورک و بدون پیروی از مدل MVC پیادهسازی کرد. بنابراین ما در واقع یک معماری چندلایه داریم، اما لایه وب مدل MVC را پیادهسازی نمیکند.
در MVC، بیان کردیم که مدل M همان نمای V است، c.a.d: مجموعهای از دادههایی که توسط نمای V نمایش داده میشوند. گاهی (اغلب)، تعریف متفاوتی از مدل M در MVC ارائه میشود:
![]() |
بسیاری از نویسندگان معتقدند که آنچه در سمت راست لایه [web] قرار دارد، مدل M از MVC را تشکیل میدهد. برای جلوگیری از ابهام، میتوان به موارد زیر اشاره کرد:
- مدل دامنه وقتی به کل بخش سمت راست لایه [présentation] اشاره میشود
- از مدل نما زمانی که به دادههای نمایشدادهشده توسط یک نما V اشاره میشود
از این پس، اصطلاح «مدل M» منحصراً به مدل یک نما V اطلاق میشود.
1.3. ابزارهای مورد استفاده
از این پس، از (دسامبر ۲۰۱۱) استفاده میکنیم
- NetBeans 7.01، در دسترس در URL [http://www.netbeans.org]
- پلاگین Struts 2 برای NetBeans 7.01، موجود در URL [http://plugins.netbeans.org/plugin/39218]
- نسخه ۲.۲.۳ Struts 2 در URL و [http://struts.apache.org/] در دسترس است.
لطفاً توجه داشته باشید که تنها کتابخانههای Struts 2 موجود در URL [http://struts.apache.org/] برای توسعه مثالهای زیر ضروری هستند. NetBeans را میتوان با یک IDE دیگر (مانند Eclipse، JDeveloper، IntelliJ و غیره) جایگزین کرد و پلاگین Struts 2 تنها برای آسانتر کردن کار توسعهدهنده وجود دارد. این پلاگین نیز ضروری نیست.
1.3.1. IDE NetBeans
در سایت دانلود NetBeans، نسخهٔ جاوا EE را انتخاب میکنیم:

1.3.2. پلاگین Struts 2
بسته به نسخه NetBeans، این افزونه همیشه در دسترس نبوده است. در دسامبر ۲۰۱۱، میتوان آن را در URL [http://plugins.netbeans.org] پیدا کرد. این URL به شما امکان میدهد تا افزونههای مختلف موجود برای NetBeans را مشاهده کنید. شما میتوانید جستجو خود را فیلتر کنید. در [1] میتوانید به دنبال افزونههایی بگردید که کلمه «struts» را در نام خود دارند.
![]() |
- پیوند [2] را دنبال کنید
![]() |
پلاگین را دانلود کرده و آن را از حالت فشرده خارج کنید ([2]). برای ادغام آن در NetBeans، مراحل زیر را دنبال کنید:
- NetBeans را راهاندازی کنید
![]() |
- در [1]، منوی Tools/Plugins را انتخاب کنید
- در زبانه [2]، روی دکمه [3] کلیک کنید
- در [4]، فایلهای .nbm مربوط به پلاگینهای دانلود شده را انتخاب کنید. در اینجا، ما کتابخانههای نسخه 2.2.3 Struts را به جای آنهایی که برای Struts 2.0.14 هستند، انتخاب میکنیم.
- در برگه [2]، افزونههای انتخابشده را با استفاده از دکمه [5] نصب کنید.
نصب پلاگینها اغلب نیاز به راهاندازی مجدد NetBeans دارد.
1.3.3. کتابخانههای Struts 2
اگر افزونه Struts 2 را برای NetBeans دانلود کرده باشید، کتابخانههای اصلی Struts را در اختیار خواهید داشت، اما نه همه آنها را. در ادامه، به کتابخانههای خاصی که در وبسایت Struts 2 به آدرس [http://struts.apache.org/] موجود هستند، نیاز خواهیم داشت.
![]() |
لینک [1] و سپس لینک [2] را دنبال کنید تا فایل زیپ نسخه 2.2.3.1 را دانلود کنید. پس از زیپشدایی توزیع، کتابخانههای مورد نیاز Struts را میتوان در پوشههای [lib] و [3] درون توزیع یافت. دهها کتابخانه وجود دارد که این سؤال را مطرح میکند که کدام یک ضروری هستند. اینجاست که پلاگین Struts به کار میآید.










