Skip to content

7. المثال 05B – التنقل في نموذج إدخال البيانات

نحن ندرس نموذجًا يحتوي على عدة أزرار لإرسال البيانات المدخلة إلى إجراء ما.

Image

7.1. مشروع NetBeans

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

Image

مكونات المشروع هي كما يلي:

  • [DoSomething.jsp]: العرض الوحيد للتطبيق، والذي يعرض أزرار التنقل الثلاثة ورابطًا.
  • [DoSomething.java] و [DoSomethingElse.java]: الإجراءان الخاصان بالمشروع
  • [messages.properties]: ملف الرسائل المُترجم
  • [struts.xml]: ملف تكوين Struts 2

7.2. التكوين

يقوم ملف [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 الخاصة بها بشكل افتراضي. يمكن تجاوز هذا السلوك الافتراضي إذا كانت المعلمات التي تم تمريرها إلى الإجراء [DoSomething] تحدد طريقة مختلفة. بغض النظر عن الطريقة التي يتم تنفيذها، يجب أن تعيد مفتاح التنقل "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] هو كما يلي:

Image

وإليك شفرة البرنامج:


<%@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]. هذا لا يعني بالضرورة أن هذا الإجراء سيتم تشغيله. يعتمد ذلك على زر الإرسال المستخدم لـ POST.
  • السطر 12: لا يحدد زر الإرسال إجراءً ولا طريقةً. سيتم إنشاء مثيل للإجراء [DoSomething] المحدد بواسطة العلامة <form>. الطريقة التي سيتم تنفيذها هي تلك المحددة في ملف [struts.xml]، وهي طريقة execute.
  • السطر 13: يحدد زر الإرسال طريقة. سيتم إنشاء مثيل الإجراء [DoSomething] المحدد بواسطة العلامة <form>. الطريقة التي سيتم تنفيذها هي طريقة action1.
  • السطر 14: يحدد زر الإرسال إجراءً وطريقةً. سيتم إنشاء مثيل للإجراء [DoSomethingElse]. الطريقة التي سيتم تنفيذها هي action2.
  • السطران 16-17: رابط إلى الإجراء [DoSomething] والطريقة action3. سيتم إنشاء مثيل للإجراء [DoSomething] وتنفيذ طريقة action3 الخاصة به. على عكس أزرار الإرسال، يؤدي النقر فوق الرابط إلى تشغيل طلب GET بدلاً من طلب POST. لذلك، لا يتم إرسال أي معلمات.

فيما يلي كود HTML الذي تم إنشاؤه بواسطة هذا الكود، عند طلب عنوان URL [http://localhost:8084/exemple-05B/actions/DoSomething.action]:

<!DOCTYPE html>
<html>
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>Actions et Méthodes</title>
  </head>
  <body>
    <h1>Actions et Méthodes</h1>
    <form ... action="/exemple-05B/actions/DoSomething.action" method="post">
...
       <input type="submit" ... name="formulaire.execute" value="DoSomething.execute"/>
...
       <input type="submit" ... name="method:action1" value="DoSomething.action1"/>
...
        <input type="submit" ... name="action:DoSomethingElse!action2" value="DoSomethingElse.action2"/>
...
    </form>
    ...
    <a href="<a href="view-source:http://localhost:8084/exemple-05B/actions/DoSomething%21action3.action">/exemple-05B/actions/DoSomething!action3.action</a>">DoSomething.action3</a>
  </body>
</html>
  • السطر 9: علامة النموذج لنموذج HTML. تحدد سمة action عنوان URL الذي سيتم إرسال معلمات النموذج إليه. عنوان URL هذا هو عنوان الإجراء [DoSomething].
  • الأسطر 11 و 13 و 15: سيتم إرسال سمات name الخاصة بالأزرار إلى الإجراء المستهدف لزر الإرسال. وهذا ما يسمح لـ Struts بتحديد الإجراء الذي سيتم إنشاء مثيل له والطريقة التي سيتم تنفيذها.
  • السطر 13: تشير السمة name=method:action1 إلى أنه يجب تنفيذ الطريقة DoSomething.action1.
  • السطر 15: تشير السمة name=action:DoSomethingElse!action2 إلى أنه يجب تنفيذ الطريقة DoSomethingElse.action2.
  • السطر 11: لا تحدد السمة name="form.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 الخاصة به.