3. المثال 02 – حقن المعلمات في الإجراء
3.1. مشروع NetBeans
![]() |
- في [1,2]، ملفات التكوين
- في [3]، والإجراء
- في [4]، والعرض
- في [5]، مكتبات المشروع
3.2. ملفات التكوين
الملف [web.xml] هو التالي:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
version="3.0">
<display-name>Struts tuto-001</display-name>
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<session-config>
<session-timeout>
30
</session-timeout>
</session-config>
</web-app>
لقد سبق أن علقنا على هذا الملف. ولن نكرر ذلك. يكفي أن نتذكر أنه يضمن تمرير جميع عناوين URL (السطر 15) عبر مرشح Struts (السطر 10).
ملف [struts.xml] هو التالي:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<package name="default" namespace="/" extends="struts-default">
<default-action-ref name="index" />
<action name="index">
<result type="redirectAction">
<param name="actionName">Action1</param>
<param name="namespace">/actions</param>
</result>
</action>
</package>
<package name="actions" namespace="/actions" extends="struts-default">
<action name="Action1" class="actions.Action1">
<result name="success">/vues/Action1.jsp</result>
</action>
</package>
</struts>
- الأسطر 7-15: تحدد الحزمة [default]، وهي الحزمة التي تُستخدم عندما يتعذر العثور على إجراء في حزمة أخرى.
- السطر 8: يحدد إجراءً افتراضيًّا لهذه الحزمة باسم index.
- الأسطر 9-14: تُستخدم لتكوين الإجراء المسمى index. ونلاحظ أنه غير مرتبط بأي فئة (عدم وجود السمة class في السطر 9).
- السطر 10: النتيجة تتعلق بالمفتاح success (عدم وجود السمة name). وهو من النوع redirectAction (السمة type). يسمح هذا النوع بإعادة توجيه إجراء إلى إجراء آخر. هنا، عندما يطلب العميل الإجراء /index، سيتم إعادة توجيهه إلى الإجراء /actions/Action1 (السطران 11-12).
- الأسطر 16-20: تحدد حزمة الإجراءات (name) المرتبطة بإجراءات URL /actions/Action (class).
- الأسطر 17-19: تُهيئ الإجراء /actions/Action1 (name). عند طلب هذا الإجراء، سيقوم Struts بإنشاء مثيل للفئة actions.Action1 (class)، ثم سيتم تنفيذ الأسلوب execute الخاص بهذه الفئة. ويجب أن تُرجع هذه الطريقة المفتاح success، لأنه المفتاح الوحيد المُعرَّف في السطر 18.
- السطر 18: بالنسبة للمفتاح success، ستكون الصفحة JSP [vues/Action1.jsp] هي الصفحة التي سيتم عرضها.
في النهاية، نستنتج أن مشروع Struts لا يستطيع تنفيذ سوى الإجراء الخاص بـ URL [actions/Action1].
3.3. L'action
يتم تمثيل الإجراء Action1 بالفئة التالية:
package actions;
import com.opensymphony.xwork2.ActionSupport;
public class Action1 extends ActionSupport{
// نموذج الإجراء
private String param1="valeur1";
private String param2="valeur2";
@Override
public String execute(){
return SUCCESS;
}
// أدوات الاسترجاع والتعيين
public String getParam1() {
return param1;
}
public void setParam1(String param1) {
this.param1 = param1;
}
public String getParam2() {
return param2;
}
public void setParam2(String param2) {
this.param2 = param2;
}
}
- السطران 8-9: حقلان يمكن الوصول إليهما عبر get / set (السطور 18-32)
- الأسطر 12-14: تُرجع الطريقة execute المفتاح success كما هو متوقع. ولا تقوم بأي شيء آخر.
3.4. طريقة العرض JSP
الطريقة Action1.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>Action1</title>
</head>
<body>
<h1>Action1</h1>
param1=<s:property value="param1"/><br/>
param2=<s:property value="param2"/><br/>
</body>
</html>
يتم عرض هذه الصفحة بعد تنفيذ الطريقة [Action1].execute. وهي تعرض قيم الحقول param1 (السطر 11) و param2 (السطر 19) من الفئة [Action1].
3.5. الاختبارات
لنقم بتنفيذ المشروع [exemple-02]:
![]() |
- في [1]، وهو عنوان URL المطلوب. تجدر الإشارة إلى أن عنوان URL الأولي المطلوب كان [/exemple-02] بدون إجراء. ثم تم استخدام الملفين [web.xml] و [struts.xml]. وقد لوحظ أن الملف [web.xml] كان يعهد بمعالجة أي طلب إلى Struts 2. ثم تم استغلال الملف [struts.xml]:
<struts>
<package name="default" namespace="/" extends="struts-default">
<default-action-ref name="index" />
<action name="index">
<result type="redirectAction">
<param name="actionName">Action1</param>
<param name="namespace">/actions</param>
</result>
</action>
</package>
<package name="actions" namespace="/actions" extends="struts-default">
<action name="Action1" class="actions.Action1">
<result name="success">/vues/Action1.jsp</result>
</action>
</package>
</struts>
تمت معالجة عنوان URL [/exemple-02] الذي لا يحتوي على إجراء بواسطة الحزمة default في الأسطر 2-10. ونظرًا لعدم وجود إجراء في عنوان URL، أصبح الإجراء هو index بسبب السطر 3 (الإجراء الافتراضي). أدت الأسطر 4-8 إلى قيام Struts بإرجاع عنوان URL لإعادة التوجيه [/exemple-02/actions/Action1] إلى العميل، كما هو موضح في [1].
ثم تم تنفيذ الإجراء [Action1] كما تم تكوينه في الأسطر 12-14. وتم تنفيذ طريقته execute. وقد رأينا أنها أعادت الرمز success. وأدى السطر 13 من [struts.xml] إلى إعادة الصفحة [/vues/Action1.jsp] إلى المتصفح:
...
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Action1</title>
</head>
<body>
<h1>Action1</h1>
param1=<s:property value="param1"/><br/>
param2=<s:property value="param2"/><br/>
</body>
</html>
عرضت السطران 9 و10 قيم الحقول param1 وparam2 من [Action1]. وهذا ما يوضحه [2].
لنطلب عنوان URL آخر:
![]() |
في [1]، يتم طلب الإجراء [Action1] باستخدام المعلمات param1 و param2. لنعد إلى مخطط تنفيذ إجراء Struts:
![]() |
يقوم المُراقب [FilterDispatcher] بتنفيذ الأسلوب execute الخاص بالإجراء. ويمر مسار التنفيذ عبر المعترضات. يعالج أحد هذه المعترضات سلسلة المعلمات param1=qqchose¶m2=autrechose. ثم يستخدم الأسلوبين setParam1 و setParam2 التابعين للإجراء Action1:
package actions;
import com.opensymphony.xwork2.ActionSupport;
public class Action1 extends ActionSupport{
// نموذج الإجراء
private String param1="valeur1";
private String param2="valeur2";
@Override
public String execute(){
return SUCCESS;
}
// دالات الاسترجاع والتعيين
public String getParam1() {
return param1;
}
public void setParam1(String param1) {
this.param1 = param1;
}
public String getParam2() {
return param2;
}
public void setParam2(String param2) {
this.param2 = param2;
}
}
يقوم المعترض params بتنفيذ الطرق التالية:
لذلك يجب أن تكون موجودة. يجب ملاحظة ما يلي: لاسترداد معلمات parami من طلب Http، يجب أن تحتوي الإجراء Struts الذي تم استدعاؤه على حقول تحمل نفس أسماء المعلمات وأساليب get / set المرتبطة بها.
عند تنفيذ الأسلوب execute التابع لـ [Action1]، تم تهيئة الحقول param1 و param2 بواسطة المعترض params:
تُرجع الطريقة execute المفتاح success، وتُعرض الصفحة [Action1.jsp]مع القيم الجديدة لـ param1 و param2 و [2].



