7. مثال 05B – التنقل في نموذج الإدخال
ندرس نموذجًا يحتوي على عدة أزرار لإرسال (submit) البيانات التي تم إدخالها إلى إجراء ما.

7.1. مشروع NetBeans
مشروع NetBeans هو كما يلي:

عناصر المشروع هي كما يلي:
- [DoSomething.jsp]: العرض الوحيد للتطبيق الذي يعرض أزرار التنقل الثلاثة بالإضافة إلى رابط.
- [DoSomething.java] و [DoSomethingElse.java]: الإجراءان الخاصان بالمشروع
- [messages.properties]: ملف الرسائل المُترجمة
- [struts.xml]: ملف تكوين Struts 2
7.2. Configuration
يقوم الملف [struts.xml] التالي بتكوين التطبيق:
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<constant name="struts.custom.i18n.resources" value="messages" />
<package name="actions" namespace="/actions" extends="struts-default">
<action name="DoSomething" class="actions.DoSomething">
<result name="success">/vues/DoSomething.jsp</result>
</action>
<action name="DoSomethingElse" class="actions.DoSomethingElse">
<result name="success">/vues/DoSomething.jsp</result>
</action>
</package>
</struts>
- ستؤدي الإجراء [/actions/DoSomething] إلى إنشاء مثيل للفئة [actions.DoSomething] وسيتم تنفيذ أسلوبها execute بشكل افتراضي. يمكن إلغاء هذا الإعداد الافتراضي إذا حددت المعلمات التي تم تمريرها إلى الإجراء [Something] طريقة أخرى. وبغض النظر عن الطريقة التي يتم تنفيذها، يجب أن تُرجع مفتاح التنقل success لأن هذا المفتاح هو الوحيد الذي تم تعريفه. وعندئذٍ سيتم عرض العرض [DoSomething.jsp].
- تكوين الإجراء [/actions/DoSomethingElse] مطابق.
7.3. ملف الرسائل
ملف الرسائل [messages.properties] هو كما يلي:
formulaire.titre1=Actions et M\u00e9thodes
formulaire.titre2=Actions et M\u00e9thodes
formulaire.execute=DoSomething.execute
formulaire.action1=DoSomething.action1
formulaire.action2=DoSomethingElse.action2
formulaire.action3=DoSomething.action3
7.4. الطريقة [DoSomething.jsp]
العرض [DoSomething.jsp] هو كما يلي:

ورمزه هو كما يلي:
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title><s:text name="formulaire.titre1"/></title>
</head>
<body>
<h1><s:text name="formulaire.titre2"/></h1>
<s:form action="DoSomething">
<s:submit key="formulaire.execute"/>
<s:submit key="formulaire.action1" method="action1"/>
<s:submit key="formulaire.action2" action="DoSomethingElse" method="action2"/>
</s:form>
<s:url id="url" action="DoSomething" method="action3"/>
<s:a href="%{url}"><s:text name="formulaire.action3"/></s:a>
</body>
</html>
- السطر 11: سيتم إرسال النموذج إلى الإجراء [DoSomething]. وهذا لا يعني بالضرورة أن هذا الإجراء هو الذي سيتم تشغيله. فهذا يعتمد على الزر submit المستخدم في POST.
- السطر 12: لا يحدد الزر submit أي إجراء أو طريقة. وسيتم إنشاء مثيل للإجراء [DoSomething] المحدد بواسطة العلامة <form>. وستكون الطريقة التي سيتم تنفيذها هي تلك المحددة في الملف [struts.xml]، وهي الطريقة execute.
- السطر 13: يحدد الزر submit طريقة. وسيتم إنشاء مثيل الإجراء [DoSomething] المحدد بواسطة العلامة <form>. وستكون الطريقة التي سيتم تنفيذها هي الطريقة action1.
- السطر 14: يحدد الزر submit إجراءً وطريقةً. سيتم إنشاء مثيل للإجراء [DoSomethingElse]. والطريقة التي سيتم تنفيذها هي الطريقة action2.
- السطران 16-17: رابط إلى الإجراء [DoSomething] والطريقة action3. سيتم إنشاء مثيل للإجراء [DoSomething] وتنفيذ طريقته action3. على عكس الأزرار submit، فإن النقر على الرابط لا يؤدي إلى POST بل إلى GET. وبالتالي، لا يتم إرسال أي معلمات.
كود HTML الذي تم إنشاؤه بواسطة هذا الكود، عند طلب عنوان URL [http://localhost:8084/exemple-05B/actions/DoSomething.action]، هو كما يلي:
- السطر 9: علامة form الخاصة بنموذج HTML. تشير السمة action إلى عنوان URL الذي سيتم إرسال معلمات النموذج إليه. هذا العنوان هو عنوان الإجراء [DoSomething].
- الأسطر 11 و13 و15: سيتم إرسال سمات الأزرار name إلى الإجراء المستهدف للزر submit. وهذا ما يسمح لـ Struts بتحديد الإجراء الذي يجب إنشاء مثيل له والطريقة التي يجب تنفيذها.
- السطر 13: يشير السمة name=method:action1 إلى أنه يجب تنفيذ الطريقة DoSomething.action1.
- السطر 15: يشير السمة name= action:DoSomethingElse!action2 إلى أنه يجب تنفيذ الطريقة DoSomethingElse.action2.
- السطر 11: السمة name= formulaire.execute لا تحدد أي إجراء أو طريقة. وبالتالي، سيتم تنفيذ الطريقة DoSomething.execute.
- السطر 19: يطلب الرابط صراحةً تنفيذ الطريقة DoSomething.action3
7.5. الإجراءات
الإجراء [DoSomething] هو كما يلي:
package actions;
import com.opensymphony.xwork2.ActionSupport;
public class DoSomething extends ActionSupport {
public DoSomething() {
System.out.println("DoSomething");
}
@Override
public String execute() {
System.out.println("DoSomething.execute");
return SUCCESS;
}
public String action1() {
System.out.println("DoSomething.action1");
return SUCCESS;
}
public String action3() {
System.out.println("DoSomething.action3");
return SUCCESS;
}
}
- تقوم الطرق execute و action1 و action3 بالكتابة على وحدة التحكم الخاصة بخادم الويب وتُرجع مفتاح التنقل success.
- السطر 8: يقوم المُنشئ أيضًا بالكتابة على وحدة التحكم الخاصة بخادم الويب
تسمح التسجيلات المختلفة على وحدة التحكم بمعرفة الطرق التي يتم تنفيذها عند إجراء طلب.
الإجراء [DoSomethingElse] مشابه:
package actions;
import com.opensymphony.xwork2.ActionSupport;
public class DoSomethingElse extends ActionSupport {
public DoSomethingElse() {
System.out.println("DoSomethingElse");
}
@Override
public String execute() {
System.out.println("DoSomethingElse.execute");
return SUCCESS;
}
public String action2() {
System.out.println("DoSomethingElse.action2");
return SUCCESS;
}
}
7.6. الاختبارات
تُظهر الاختبارات النتائج التالية (على وحدة التحكم في خادم الويب):
- عند النقر على الزر [DoSomething.execute]، يتم إنشاء مثيل للإجراء [DoSomething] وتنفيذ أسلوبه execute.
- عند النقر على الزر [DoSomething.action1]، يتم إنشاء مثيل الإجراء [DoSomething] وتنفيذ أسلوبه action1.
- عند النقر على الزر [DoSomethingElse.action2]، يتم إنشاء مثيل الإجراء [DoSomethingElse] وتنفيذ أسلوبه action2.
- عند النقر على الرابط [DoSomething.action3]، يتم إنشاء مثيل الإجراء [DoSomething] وتنفيذ أسلوبه action3.