Skip to content

6. مثال ۰۵ – فرم ورودی

برای معرفی مفهوم فرم ورودی، از یک مثال ساده استفاده خواهیم کرد.

6.1. پروژه NetBeans

در [1]، پروژه:

  • نماها [Saisie.JSP]، [Confirmation.JSP]
  • فایل پیکربندی [struts.xml]
  • فایل پیام [messages.properties]
  • اقدام [Confirmer.java]

در [2]، صفحه ورودی

6.2. Configuration

فایل [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>
  <!-- بین‌المللی‌سازی -->
  <constant name="struts.custom.i18n.resources" value="messages" />
  <!-- پکیج پیش‌فرض -->
  <package name="default" namespace="/" extends="struts-default">
    <default-action-ref name="index" />
    <action name="index">
      <result type="redirectAction">
        <param name="actionName">Saisir</param>
        <param name="namespace">/actions</param>
      </result>
    </action>
  </package>
  <!-- بستهٔ اقدامات -->
  <package name="actions" namespace="/actions" extends="struts-default">
    <action name="Saisir">
      <result name="success">/vues/Saisie.JSP</result>
    </action>
    <action name="Confirmer" class="actions.Confirmer">
      <result name="success">/vues/Confirmation.JSP</result>
    </action>  
  </package>
</struts>
  • خط ۲۰: بسته اقدام برای URL و /actions/Action.
  • خطوط ۲۱–۲۳: اقدام [Saisir] را تعریف می‌کنند. هیچ کلاسی با آن مرتبط نیست. پاسخ همیشه نما [/vues/Saisie.JSP] است.
  • خطوط ۲۴–۲۶: اقدام [Confirmer] را تعریف کنید. کلاس [actions.Confirmer] با آن مرتبط است. پاسخ همیشه نما [/vues/Confirmation.JSP] است.

6.3. اقدام [Confirmer]

کد آن به شرح زیر است:


package actions;

import com.opensymphony.xwork2.ActionSupport;

public class Confirmer extends ActionSupport{
  
  //مدل
  private String nom;
  
  // گیرنده‌ها و تنظیم‌کننده‌ها

  public String getNom() {
    return nom;
  }

  public void setNom(String nom) {
    this.nom = nom;
  }
  
}

کلاس تنها یک فیلد دارد، فیلدی که در خط ۸ با متدهای get/set آن قرار دارد.

6.4. فایل پیام

محتویات [messages.properties] به شرح زیر است:


saisie.texte=Formulaire de saisie
saisie.titre1=Saisie
saisie.titre2=Saisie
saisie.libelle=Tapez votre nom
saisie.valider=Valider
confirm.titre1=Confirmation
confirm.titre2=Confirmation
confirm.texte=Bonjour
confirm.retour=Retour au formulaire de saisie

این کلیدهای پیام در هر دو نما [Saisie.JSP] و [Confirmation.JSP] استفاده می‌شوند.

6.5. نماها

6.5.1. نما [Saisie.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="saisie.titre1"/></title>
  </head>
  <body>
    <h1><s:text name="saisie.titre2"/></h1>
    <s:form action="Confirmer">
      <s:textfield key="saisie.libelle" name="nom"/>
      <s:submit key="saisie.valider" action="Confirmer"/>
    </s:form>
  </body>
</html>
  • خط ۷: پیام کلیدی saisie.titre1 (ورودی) [1] را نمایش می‌دهد.
  • خط ۱۰: پیام کلیدی saisie.titre2 (ورودی) [2] را نمایش می‌دهد.
  • خطوط ۱۱ و ۱۴: تگ <s:form> یک فرم HTML را معرفی می‌کند. تمام ورودی‌های درون این فرم به سرور وب ارسال خواهند شد. به آن‌ها postées گفته می‌شود زیرا عملیات HTTP درگیر در ارسال این داده‌ها به سرور POST نامیده می‌شود. داده‌ها به شکل یک رشته کاراکتری param1=valeur1&param2=valeur2& ارسال می‌شوند... ما قبلاً این رشته را در بخش ۳.۵ از مثال ۰۲ دیده‌ایم. در هر دو مورد، رشته پارامتر به یک روش توسط Struts 2 پردازش می‌شود. مقادیر valeuri پارامترهای parami به اکشن در حال اجرا تزریق می‌شوند، به فیلدهایی با همان نام‌های پارامترهای parami. داده‌های ارسال‌شده به کجا فرستاده می‌شوند؟ به‌طور پیش‌فرض، به اکشنی که فرم را نمایش داده است – در این مورد، اکشن Saisir [5]. شما همچنین می‌توانید از ویژگی action برای مشخص کردن یک اکشن متفاوت استفاده کنید – در این مورد، اکشن [Confirmer].
  • خط ۱۲: تگ <s:textfield ...> فیلد ورودی [3] را نمایش می‌دهد. ویژگی key کلید برچسب را مشخص می‌کند تا در سمت چپ فیلد ورودی نمایش داده شود. بنابراین برچسب از فایل [messages.properties] بازیابی می‌شود. ویژگی name نام پارامتر ارسال‌شدنی است. مقدار مرتبط با این پارامتر، متنی است که در فیلد ورودی وارد می‌شود.
  • خط ۱۳: تگ <s:submit ...> دکمه [4] را نمایش می‌دهد. ویژگی key آن کلید برچسبی را مشخص می‌کند که باید روی دکمه نمایش داده شود. بنابراین برچسب از فایل [messages.properties] بازیابی می‌شود. یک دکمه از نوع submit ارسال فرم به یک اکشن را تحریک می‌کند. قبلاً اشاره کردیم که این اقدام [Confirmer] است به دلیل ویژگی action تگ <s:form>. ویژگی action تگ <s:submit> به شما امکان می‌دهد در صورت نیاز اکشن متفاوتی را مشخص کنید. در اینجا، ما اکشن را روی [Confirmer] تنظیم کرده‌ایم. این دکمه دارای نام پارامتر پیش‌فرض است: action:nom_action; در اینجا، این action:Confirmer است. مقدار مرتبط با این پارامتر، برچسب دکمه است. در نهایت، رشته پارامتری که هنگام کلیک کاربر بر روی دکمه [Valider] به اقدام [Confirmer] ارسال می‌شود، به این صورت خواهد بود:

?nom=xx&action:Confirmer=Valider.

که در آن xx متنی است که کاربر در فیلد ورودی وارد کرده است.

6.5.2. نما [Confirmation.JSP]

این به صورت زیر است:

ما یک نام وارد می‌کنیم و صفحهٔ ورودی را ارسال می‌کنیم. سپس پاسخ [1] را دریافت می‌کنیم که با نما [Confirmation.JSP] مطابقت دارد. URL که در [2] نمایش داده شده است، با اقدام [Confirmer] مطابقت دارد. در مثال بالا، رشته زیر ارسال شد:

nom=bernard&action:Confirmer=Valider

پارامتر action:Confirmer به Struts 2 امکان می‌دهد تا درخواست را به اکشن صحیح، در این مورد اکشن [Confirmer]، مسیریابی کند. سپس مقدار پارامتر nom در فیلد nom از اکشن [Confirmer] تزریق می‌شود.

کد منبع برای اکشن [Confirmation.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="confirm.titre1"/></title>
  </head>
  <body>
    <h1><s:text name="confirm.titre2"/></h1>
    <s:text name="confirm.texte"/>&nbsp;
    <s:property value="nom"/> !
    <br/><br/>
    <a href="<s:url action="Saisir"/>"><s:text name="confirm.retour"/></a>
  </body>
</html>
  • خط ۷: برچسب کلید confirm.titre1 را که در فایل پیام [1] یافت می‌شود، نمایش می‌دهد
  • خط ۱۰: برچسب کلید confirm.titre2 را که در فایل پیام [3] یافت می‌شود، نمایش می‌دهد
  • خط ۱۲: ویژگی nom از اقدام [Confirmer] که اجرا شده است را نمایش می‌دهد.
  • خط ۱۴: یک لینک به اقدام [Saisir] ایجاد می‌کند. تگ <s:url>,، که قبلاً با آن مواجه شده است، از URL و [2] مرورگر تولید خواهد شد. مسیر، مسیر [2] http://localhost:8084/exemple-05/actions خواهد بود و عمل، عملِ ویژگی action خواهد بود که در این مورد Saisir است. بنابراین، URL برای لینک برابر خواهد بود با http://localhost:8084/exemple-05/actions/Saisir.action. متن لینک برچسب مرتبط با کلید confirm.retour [4] خواهد بود.

6.6. آزمایش‌ها

در اینجا دو پرس‌وجو وجود دارد:

در [1]، یک نام وارد کنید و روی «ارسال» کلیک کنید. در [2]، صفحهٔ تأیید.

در [3]، شما لینک بازگشت به فرم را دنبال می‌کنید. در [4]، نتیجه. همه چیز توضیح داده شده است، به جز انتقال از [3] به [4]. چرا نمی‌توانیم نامی را که در [4] وارد کرده‌ایم پیدا کنیم؟

لینک در [3]، لینکی به URL و [http://localhost:8084/exemple-05/actions/Saisir.action] است. بنابراین، اقدام [Saisir] اجرا می‌شود. بیایید پیکربندی آن را در [struts.xml] بررسی کنیم:


<package name="actions" namespace="/actions" extends="struts-default">
    <action name="Saisir">
      <result name="success">/vues/Saisie.JSP</result>
    </action>
    <action name="Confirmer" class="actions.Confirmer">
      <result name="success">/vues/Confirmation.JSP</result>
    </action>  
</package>

اقدام [Saisir] با هیچ اقدامی مرتبط نیست. بنابراین، نما [Saisie.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="saisie.titre1"/></title>
  </head>
  <body>
    <h1><s:text name="saisie.titre2"/></h1>
    <s:form>
      <s:textfield key="saisie.libelle" name="nom"/>
      <s:submit key="saisie.valider" action="Confirmer"/>
    </s:form>
  </body>
</html>

در خط ۱۲، فیلد ورودی نمایش داده می‌شود. محتوای آن با ویژگی nom (name) مقداردهی اولیه می‌شود. بیایید آنچه را که قبلاً در مورد نحوه عملکرد تگ <s:property> ذکر شد، به یاد بیاوریم:

برچسب <s:property name="property"> برای نوشتن مقدار یک ویژگی از ابجکتی به نام ActionContext استفاده می‌شود. این ابجکت شامل:

  1. ویژگی‌های کلاسی که با عملی که اجرا شده مرتبط است.
  2. ویژگی‌های درخواست جاری، که با <s:property name="#request['clé']"> نشان داده می‌شوند
  3. ویژگی‌های جلسه (session) کاربر، که با <s:property name="#session['clé']"> نشان داده می‌شوند.
  4. ویژگی‌های خودِ برنامه، که با <s:property name="#application['clé']"> نشان داده می‌شوند
  5. پارامترهای ارسال‌شده توسط مرورگر مشتری، نشان‌داده‌شده با <s:property name="#parameters['clé']">
  6. نشانه <s:property name="#attr['clé']"> مقدار یک شیء را که در صفحه، درخواست، جلسه و برنامه جستجو شده است، به ترتیب نمایش می‌دهد.

این مورد اول است. اکشن [Saisir] هیچ کلاس مرتبطی ندارد. بنابراین خاصیت nom وجود ندارد. سپس یک رشته خالی در فیلد ورودی نمایش داده می‌شود.

برای نمایش نام وارد شده در [1] در [4]، از جلسه (session) کاربر استفاده خواهیم کرد.