Skip to content

13. مثال ۱۰ – تبدیل و اعتبارسنجی اعداد حقیقی

برنامه جدید ورودی اعداد حقیقی را نشان می‌دهد:

  • برای [1]، فرم ورودی
  • به [2]، پاسخ بازگردانده‌شده

این برنامه به روشی مشابه قابلیت ورودی عدد صحیح کار می‌کند، بنابراین تنها به نکاتی که متفاوت هستند اشاره خواهیم کرد.

13.1. پروژه NetBeans

پروژه NetBeans به شرح زیر است:

  • در [1]، نماهای برنامه
    • [Accueil.JSP]: صفحهٔ اصلی
    • [FormDouble.JSP]: فرم ورود داده
    • [ConfirmationDouble.JSP]: صفحه تأیید
  • به [2]، فایل پیام [messages.properties] و فایل اصلی پیکربندی Struts
    • در [3]:
    • [FormDouble.java]: اکشنی که فرم را نمایش داده و پردازش می‌کند
    • [FormDouble-validation.xml]: قواعد اعتبارسنجی برای اکشن [FormDouble]. این فایل این اعتبارسنجی‌ها را با استفاده از متدی که به تازگی توضیح داده شد، به مدل واگذار می‌کند.
    • [FormDoubleModel]: مدل برای اقدام [FormDouble]
    • [FormDoubleModel-validation.xml]: قواعد اعتبارسنجی برای مدل
    • [FormDoubleModel.properties]: فایل پیام مدل
    • [example.xml]: فایل پیکربندی ثانویه Struts

13.2. پیکربندی پروژه

پروژه عمدتاً توسط فایل زیر پیکربندی می‌شود: [example.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="example" namespace="/example" extends="struts-default">
    <action name="Accueil">
      <result name="success">/example/Accueil.JSP</result>
    </action>
    <action name="FormDouble" class="example.FormDouble">
      <result name="input">/example/FormDouble.JSP</result>
      <result name="cancel" type="redirect">/example/Accueil.JSP</result>
      <result name="success">/example/ConfirmationFormDouble.JSP</result>
    </action>
  </package>
</struts>

این مشابه موردی است که برای وارد کردن اعداد صحیح بحث شد.

13.3. فایل‌های پیام

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


Accueil.titre=Accueil
Accueil.message=Struts 2 - Conversions et validations
Accueil.FormDouble=Saisie de nombres r\u00e9els
Form.titre=Conversions et validations
FormDouble.message=Struts 2 - Conversion et validation de nombres r\u00e9els
FormDouble.conseil=Tapez les nombres r\u00e9els avec une virgule comme 10,7
Form.submitText=Valider
Form.cancelText=Annuler
Form.clearModel=Raz mod\u00e8le
Confirmation.titre=Confirmation
Confirmation.message=Confirmation des valeurs saisies
Confirmation.champ=champ
Confirmation.valeur=valeur
Confirmation.lien=Formulaire de test
xwork.default.invalid.fieldvalue=Valeur invalide pour le champ "{0}".

فایل [FormDoubleModel.properties] به شرح زیر است:


double.format={0,number}
double1.prompt=1-Nombre r\u00E9el
double1.error=Tapez un nombre r\u00E9el
double2.prompt=2-Nombre r\u00E9el
double2.error=Tapez un nombre r\u00E9el
double3.prompt=3-Nombre r\u00E9el >=2.64
double3.error=Tapez un nombre r\u00E9el >=2.64
double4.prompt=4-Nombre r\u00E9el <8.32
double4.error=Tapez un nombre r\u00E9el <8.32
double5.prompt=5-Nombre r\u00E9el dans l''intervalle [2.64,8.32[
double5.error=Tapez un nombre r\u00E9el dans l''intervalle [2.64,8.32[
double6.prompt=6-Nombre r\u00E9el dans l''intervalle [2.64,8.32]
double6.error=Tapez un nombre r\u00E9el dans l''intervalle [2.64,8.32]

خط ۱ نقش مهمی ایفا می‌کند. بعداً به این موضوع باز خواهیم گشت.

13.4. فرم ورود داده

نما [FormDouble.JSP] به شرح زیر است:


<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<html>
  <head>
    <title><s:text name="Form.titre"/></title>
    <s:head/>
  </head>

  <body background="<s:url value="/ressources/standard.jpg"/>">
    <h2><s:text name="FormDouble.message"/></h2>
    <h4><s:text name="FormDouble.conseil"/></h4>
    <s:form name="formulaire" action="FormDouble">
      <s:textfield name="double1" key="double1.prompt"/>
      <s:textfield name="double2" key="double2.prompt" value="%{#parameters['double2']!=null ? #parameters['double2'] : double2==null ? '' :getText('double.format',{double2})}"/>
      <s:textfield name="double3" key="double3.prompt" value="%{#parameters['double3']!=null ? #parameters['double3'] : double3==null ? '' :getText('double.format',{double3})}"/>
      <s:textfield name="double4" key="double4.prompt" value="%{#parameters['double4']!=null ? #parameters['double4'] : double4==null ? '' :getText('double.format',{double4})}"/>
      <s:textfield name="double5" key="double5.prompt" value="%{#parameters['double5']!=null ? #parameters['double5'] : double5==null ? '' :getText('double.format',{double5})}"/>
      <s:textfield name="double6" key="double6.prompt"/>
      <s:submit key="Form.submitText" method="execute"/>
    </s:form>
    <br/>
    <s:url id="URL" action="FormDouble" method="cancel"/>
    <s:a href="%{URL}"><s:text name="Form.cancelText"/></s:a>
    <br/>
    <s:url id="URL" action="FormDouble" method="clearModel"/>
    <s:a href="%{URL}"><s:text name="Form.clearModel"/></s:a>
  </body>
</html>

خطوط ۱۳ تا ۱۸ شش فیلد ورودی برای اعداد حقیقی هستند. فیلدهای double2 تا double5 دارای ویژگی complex با مقدار value هستند. معمولاً شش فیلد ورودی باید به صورت زیر باشند:


      <s:textfield name="double1" key="double1.prompt"/>
      <s:textfield name="double2" key="double2.prompt"/>
      <s:textfield name="double3" key="double3.prompt"/>
      <s:textfield name="double4" key="double4.prompt"/>
      <s:textfield name="double5" key="double5.prompt"/>
<s:textfield name="double6" key="double6.prompt"/>

برای حل برخی مشکلات که در حین آزمایش با آنها مواجه شدیم، لازم بود که اوضاع پیچیده‌تر شود. فعلاً، خواننده می‌تواند این پیچیدگی را نادیده بگیرد. ما بعداً آن را توضیح خواهیم داد.

13.5. نمای تأیید

نمای تأیید [ConfirmationFormDouble.JSP] به شرح زیر است:

 

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


<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<html>
  <head>
    <title><s:text name="Confirmation.titre"/></title>
    <s:head/>
  </head>

  <body background="<s:url value="/ressources/standard.jpg"/>">
    <h2><s:text name="Confirmation.message"/></h2>
    <table border="1">
      <tr>
        <th><s:text name="Confirmation.champ"/></th>
        <th><s:text name="Confirmation.valeur"/></th>
      </tr>
      <tr>
        <td><s:text name="double1.prompt"/></td>
        <td><s:text name="double1"/></td>
      </tr>
      <tr>
        <td><s:text name="double2.prompt"/></td>
        <td>
          <s:text name="double.format">
            <s:param value="double2"/>
          </s:text>
        </td>
      </tr>
      <tr>
        <td><s:text name="double3.prompt"/></td>
        <td>
          <s:text name="double.format">
            <s:param value="double3"/>
          </s:text>
        </td>
      </tr>
      <tr>
        <td><s:text name="double4.prompt"/></td>
        <td>
          <s:text name="double.format">
            <s:param value="double4"/>
          </s:text>
        </td>
      </tr>
      <tr>
        <td><s:text name="double5.prompt"/></td>
        <td>
          <s:text name="double.format">
            <s:param value="double5"/>
          </s:text>
        </td>
      </tr>
      <tr>
        <td><s:text name="double6.prompt"/></td>
        <td><s:text name="double6"/></td>
      </tr>
    </table>
    <br/>
    <s:url id="URL" action="FormDouble!input"/>
    <s:a href="%{URL}"><s:text name="Confirmation.lien"/></s:a>
  </body>
</html>

ویوی [ConfirmationFormDouble.JSP] به سادگی قالب [FormDoubleModel] را نمایش می‌دهد. خطوط ۴۷–۴۹ نشان می‌دهند که یک عدد اعشاری چگونه نمایش داده می‌شود. ما می‌خواهیم این نمایش، localisation برنامه را در نظر بگیرد. طبق این، یک عدد اعشاری به یک شکل در فرانسه (10,7) و به شکل دیگری در بریتانیای کبیر (10.7) نمایش داده نخواهد شد. برای دستیابی به این هدف، از تگ <s:text> استفاده می‌کنیم که قبلاً برای بین‌المللی‌سازی برنامه از آن بهره برده بودیم. بنابراین این تگ برای بومی‌سازی نیز به کار می‌رود.

در اینجا، کلید پیام مورد استفاده double.format است. این کلید را می‌توان در فایل [FormDoubleModel.properties] یافت:


double.format={0,number}

مقدار مرتبط با این کلید در اینجا یک پیام نیست، بلکه یک قالب نمایش است:

  • ۰ پارامتری است که مقدار نمایش داده شده را نشان می‌دهد. در این مورد، این مقدار فیلد double5 در قالب خواهد بود.
  • عدد نمایانگر قالب نمایش اعداد است. این قالب برای هر کشور تطبیق داده می‌شود. بدون این قالب، عدد 10.7 همیشه به صورت 10.7 نمایش داده می‌شود، صرف‌نظر از کشور.

برچسب


         <s:text name="double.format">
            <s:param value="double5"/>
</s:text>

پیام {0, number} را نمایش می‌دهد، جایی که پارامتر double5 (خط ۲) در قالب، جایگزین پارامتر 0 می‌شود. بنابراین، قالب double5 در قالب عددی بومی‌شده نمایش داده خواهد شد.

13.6. قالب [FormDoubleModel]

میدان‌های double1 تا double6 از فرم [FormDouble.JSP] در قالب زیر [FormDoubleModel] درج می‌شوند:


package example;

public class FormDoubleModel {

  // سازنده بدون پارامتر
  public FormDoubleModel() {
  }
  // fields
  private String double1;
  private Double double2;
  private Double double3;
  private Double double4;
  private Double double5;
  private String double6;

  // ابتکاری‌سازی مدل
  public void clearModel() {
    double1 = null;
    double2 = null;
    double3 = null;
    double4 = null;
    double5 = null;
    double6 = null;
  }

  // گیرنده‌ها و تنظیم‌کننده‌ها
   ...
}
  • میدان‌های double1 و double6 از نوع String هستند
  • بقیه فیلدها از نوع Double هستند

13.7. اعتبارسنجی مدل

اعتبارسنجی مدل توسط دو فایل کنترل می‌شود: [FormDouble-validation.xml] و [FormDoubleModel-validation.xml].

فایل [FormDouble-validation.xml] اعتبارسنجی را به [FormDoubleModel-validation.xml] واگذار می‌کند:


<!--
<!DOCTYPE validators PUBLIC "-//OpenSymphony Group//XWork Validator 1.0.2//
EN" "http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd">
-->
<!DOCTYPE validators PUBLIC "-//OpenSymphony Group//XWork Validator 1.0.2//
EN" "http://localhost:8084/example-10/example/xwork-validator-1.0.2.dtd">

<validators>
  <field name="model" >
    <field-validator type="visitor">
      <param name="appendPrefix">false</param>
      <message/>
    </field-validator>
  </field>
</validators>

ما قبلاً با این فایل مواجه شده‌ایم.

فایل [FormDoubleModel-validation.xml] شامل قواعد اعتبارسنجی زیر است:


<!--
<!DOCTYPE validators PUBLIC "-//OpenSymphony Group//XWork Validator 1.0.2//
EN" "http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd">
-->

<!DOCTYPE validators PUBLIC "-//OpenSymphony Group//XWork Validator 1.0.2//
EN" "http://localhost:8084/example-10/example/xwork-validator-1.0.2.dtd">


<validators>

  <field name="double1" >
    <field-validator type="requiredstring" short-circuit="true">
      <message key="double1.error"/>
    </field-validator>
    <field-validator type="regex" short-circuit="true">
      <param name="expression">^[+|-]*\s*\d+(,\d+)*$</param>
      <param name="trim">true</param>
      <message key="double1.error"/>
    </field-validator>
  </field>

  <field name="double2" >
    <field-validator type="required" short-circuit="true">
      <message key="double2.error"/>
    </field-validator>
    <field-validator type="conversion" short-circuit="true">
      <message key="double2.error"/>
    </field-validator>
  </field>

  <field name="double3" >
    <field-validator type="required" short-circuit="true">
      <message key="double3.error"/>
    </field-validator>
    <field-validator type="conversion" short-circuit="true">
      <message key="double3.error"/>
    </field-validator>
    <field-validator type="double" short-circuit="true">
      <param name="minInclusive">2.64</param>
      <message key="double3.error"/>
    </field-validator>
  </field>

  <field name="double4" >
    <field-validator type="required" short-circuit="true">
      <message key="double4.error"/>
    </field-validator>
    <field-validator type="conversion" short-circuit="true">
      <message key="double4.error"/>
    </field-validator>
    <field-validator type="double" short-circuit="true">
      <param name="maxExclusive">8.32</param>
      <message key="double4.error"/>
    </field-validator>
  </field>

  <field name="double5" >
    <field-validator type="required" short-circuit="true">
      <message key="double5.error"/>
    </field-validator>
    <field-validator type="conversion" short-circuit="true">
      <message key="double5.error"/>
    </field-validator>
    <field-validator type="double" short-circuit="true">
      <param name="minInclusive">2.64</param>
      <param name="maxExclusive">8.32</param>
      <message key="double5.error"/>
    </field-validator>
  </field>

  <field name="double6" >
    <field-validator type="requiredstring" short-circuit="true">
      <message key="double6.error"/>
    </field-validator>
    <field-validator type="regex" short-circuit="true">
      <param name="expression">^[+|-]*\s*\d+(,\d+)*$</param>
      <param name="trim">true</param>
      <message key="double6.error"/>
    </field-validator>
  </field>
</validators>
  • قاعده در خطوط ۱۲–۲۱ بررسی می‌کند که فیلد ورودی double1 با یک الگوی عبارت منظم که نمایانگر یک عدد حقیقی است مطابقت دارد.
  • قانون در خطوط ۲۳–۳۰ بررسی می‌کند که فیلد ورودی double2 قابل تبدیل به یک عدد حقیقی با دقت مضاعف باشد.
  • قاعده در خطوط ۳۲–۴۳ بررسی می‌کند که فیلد ورودی double3 می‌تواند به یک عدد حقیقی با دقت مضاعف بزرگ‌تر یا مساوی ۲٫۶۴ تبدیل شود. توجه داشته باشید که باید از نشانه‌گذاری آنگلو-ساکسون برای اعداد حقیقی استفاده شود.
  • قاعده در خطوط ۴۵–۵۶ بررسی می‌کند که آیا فیلد ورودی double4 قابل تبدیل به یک عدد حقیقی دوگانه کمتر از ۸.۳۲ است.
  • قاعده در خطوط ۵۸–۷۰ بررسی می‌کند که آیا فیلد ورودی double5 را می‌توان به یک عدد حقیقی دوگانه در بازه [۲٫۶۴، ۸٫۳۲] تبدیل کرد.
  • قاعده در خطوط ۷۲–۸۰ بررسی می‌کند که فیلد double6 با الگوی یک عبارت منظم که نمایانگر یک عدد حقیقی است مطابقت دارد.

پس از اینکه فایل [FormDoubleModel-validation.xml] توسط interceptor اعتبارسنجی پردازش شد، این interceptor متد validate از اکشن [FormDouble] را در صورت وجود، فراخوانی می‌کند. ما این مورد را همراه با کل اکشن توضیح خواهیم داد.

13.8. اقدام [FormDouble]

اقدام [FormDouble] به شرح زیر است:


package example;

import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;
import java.util.Map;
import org.apache.struts2.interceptor.SessionAware;
import org.apache.struts2.interceptor.validation.SkipValidation;

public class FormDouble extends ActionSupport implements ModelDriven, SessionAware {

  // سازنده بدون هیچ پارامتری
  public FormDouble() {
  }

  // مدل اقدام
  public Object getModel() {
    if (session.get("model") == null) {
      session.put("model", new FormDoubleModel());
    }
    return session.get("model");
  }

  @SkipValidation
  public String clearModel() {
    // ریست مدل
    ((FormDoubleModel) getModel()).clearModel();
    // نتیجه
    return INPUT;
  }

  public String cancel() {
    //پاکسازی مدل
    ((FormDoubleModel) getModel()).clearModel();
    // نتیجه
    return "cancel";
  }
  // SessionAware
  Map<String, Object> session;

  public void setSession(Map<String, Object> session) {
    this.session = session;
  }

  //اعتبارسنجی
  @Override
  public void validate() {
    //آیا ورودی تکراری معتبر است؟
    if (getFieldErrors().get("double6") == null) {
      // ویرگول را با نقطه در رشته «double6» جایگزین کنید
      String strDouble6 = (((FormDoubleModel) getModel()).getDouble6()).replace(',', '.');
      // رشته → عدد مضربی
      double double6 = Double.parseDouble(strDouble6);
      // اعتبارسنجی
      if (double6 < 2.64 || double6 > 8.32) {
        addFieldError("double6", getText("double6.error"));
      }
    }
  }
}

اقدام [FormDouble] بر اساس همان مدل با اقدام [FormInt] است. ما فقط در مورد متد validate نظر می‌دهیم. توجه داشته باشید که متد validate پس از پردازش فایل اعتبارسنجی [FormDoubleModel-validation.xml] و قبل از اجرای متد execute اجرا می‌شود.

  • خط ۴۸: اگر قبلاً خطاهایی در فیلد double6 وجود داشته باشد، هیچ اقدام بیشتری انجام نمی‌شود.
  • خط ۵۰: یک رشته به شکل 45,67 دریافت شد. این مقدار در فیلد double6 مدل ذخیره شد. ویرگول با نقطه جایگزین می‌شود تا 45.67 تولید شود.
  • خط ۵۲: رشته 45.67 به یک عدد حقیقی با دقت مضاعف تبدیل می‌شود. این باید کار کند، زیرا رشته double6 با فرمت یک عدد حقیقی مطابقت دارد.
  • خط ۵۴: بررسی می‌کنیم که عدد حقیقی با دقت مضاعف حاصل، در بازه [2.64, 8.32] قرار دارد.
  • خط ۵۵: اگر اینطور نباشد، پیام خطای double6.error به فیلد double6 متصل می‌شود. این پیام در فایل [FormDoubleModel.properties] یافت خواهد شد. هنگام نمایش مجدد فرم نادرست، این پیام نمایش داده خواهد شد.

13.9. جزئیات نهایی

اکنون، بازگردیم به پیچیدگی فیلدهای ورودی در فرم [FormDouble.JSP]. ما بر روی فیلد double2 تمرکز خواهیم کرد. این استدلال برای فیلدهای double3 تا double5 که قالب آن‌ها از نوع Double است، نیز صدق می‌کند. برای فیلدهای double1 و double6 که قالب آن‌ها از نوع String است، هیچ مشکلی وجود ندارد.

میدان ورودی double2 به شرح زیر است:

<s:textfield name="double2" key="double2.prompt" value="%{#parameters['double2']!=null ? #parameters['double2'] : double2==null ? '' :getText('double.format',{double2})}"/>

بیایید با ساده‌ترین تگ شروع کنیم:

<s:textfield name="double2" key="double2.prompt"/>

و ببینیم چه اتفاقی می‌افتد:

  • در [1]، شماره صحیح double2 اعتبارسنجی می‌شود. در اسکرین‌شات چندان واضح نیست، اما شماره با یک ویرگول وارد شده بود.
  • در [2]، صفحه تأیید. ورودی double2 از بررسی‌های اعتبارسنجی عبور کرده است. عدد با ویرگول نمایش داده می‌شود.
  • در [3]، به فرم بازمی‌گردیم
  • در [4]، فرم. آنچه اسکرین‌شات به وضوح نشان نمی‌دهد این است که عدد double2، که در ابتدا 4.32 بود، به 4.32 با نقطه اعشاری تبدیل شده است.
  • در [5]، فرم را بدون تغییر چیزی مجدداً ارسال می‌کنیم
  • به [6]، خطایی در فیلد double2 گزارش می‌شود.

مسئله به شرح زیر است:

  • در ابتدا، در [1]، رشته ورودی «4,32» با موفقیت به عدد ممیز شناور 4.32 تبدیل شد. این بدان معناست که تبدیل رشته به دابل (String → Double) با موفقیت انجام شده و از این جهت، Struts locale را در نظر می‌گیرد – در این مورد، فرانسه.
  • فرم جدید [4] مقدار عدد حقیقی 4.32 را در فیلد double2 نمایش می‌دهد. از آنجایی که نمایش محلی‌سازی نشده است، به طور پیش‌فرض از فرمت آنگلو-ساکسون، c.a.d، با نقطه به عنوان جداکننده اعشاری استفاده می‌کند. بنابراین، در جهت تبدیل از Double به String، Struts دیگر locale را در نظر نمی‌گیرد؛ در غیر این صورت، عدد 4.32 را با ویرگول نمایش می‌داد.

این دست‌کم ناسازگار است. اما مهم نیست؛ ما نمایش عدد 4.32 را بومی‌سازی خواهیم کرد. تگ ورودی به شکل زیر درمی‌آید:


<s:textfield name="double2" key="double2.prompt" value="%{getText('double.format',{double2})}"/>

ویژگی value مقداری را که باید در فیلد double2 نمایش داده شود، مشخص می‌کند. این مقدار، مقدار یک عبارت OGNL است. بیایید تعریف کلید double.format را در فایل [FormDoubleModel.properties] به یاد آوریم:


double.format={0,number}

متد getText('key') پیام مرتبط با یک کلید را بازیابی می‌کند. این پیام در فایلی که به لوکال جاری مربوط می‌شود، جستجو می‌شود. بنابراین، اگر زبان محلی (locale) «es» (اسپانیا) بود، کلید double.format در فایل [FormDoubleModel_es.properties] جستجو می‌شد.

متد getText('key', {param0, param1, ...}) برای بازیابی پیامی با پارامترهای مشخص شده استفاده می‌شود. پیام

{0, number}

یک پیام پارامتریک با پارامتر 0 است. این یک پارامتر موقعیتی است. متد getText('double.format', {double2}) مقدار double2 را به پارامتر 0 اختصاص خواهد داد. در نهایت، مقدار double2 به صورت فرمت عددی بومی‌شده درخواست می‌شود. در فرانسه، عدد ۴.۵۶ به صورت رشته «4,56» بومی‌سازی خواهد شد.

پس از این تبدیل، آزمون‌ها دوباره اجرا می‌شوند.

به محض نمایش اولیه فرم، خطایی در [1] رخ می‌دهد. بیایید به تگ بازگردیم:


<s:textfield name="double2" key="double2.prompt" value="%{getText('double.format',{double2})}"/>

در نمایش اولیه، مقدار قالب double2 برابر null است که یک مقدار غیرعددی است. ما تگ را به صورت زیر به‌روزرسانی می‌کنیم:


<s:textfield name="double2" key="double2.prompt" value="%{double2==null ? '' : getText('double.format',{double2})}"/>

این بار بررسی می‌کنیم که آیا double2==null است یا خیر. اگر چنین باشد، یک رشته خالی نمایش می‌دهیم.

پس از اعمال این تغییر، آزمایش‌ها را از سر می‌گیریم:

اسکرین‌های مربوط به [1] تا [4] نشان می‌دهند که مشکلی که در تلاش برای حل آن بودیم، برطرف شده است:

  • در [1]، عدد ۴.۶۷ را وارد می‌کنیم
  • در [2]، این عدد پذیرفته شد
  • در [3]، این عدد دوباره با ممیز اعشاری به صورت 4.67 نمایش داده می‌شود که توسط [4] تأیید می‌شود.

متأسفانه مشکلات به اینجا ختم نمی‌شوند. بیایید نگاهی به دنباله زیر بیندازیم:

  • در [5]، یک کاراکتر اضافه شده تا double2 را باطل کند
  • در [6]، بررسی‌های اعتبارسنجی وظیفه خود را انجام داده و خطا علامت‌گذاری شده است. با این حال، رشته‌ای که در [6] نمایش داده می‌شود، رشته نادرست نیست، بلکه مقدار فعلی قالب، double2 است. مقداری که وارد شده بود از بین رفته است.

هنگام تغییر از [5] به [6]، درخواست کامل نمی‌شود. این درخواست توسط interceptor اعتبارسنجی متوقف می‌شود. در [6]، مقدار قالب double2 نمایش داده شد؛ این قالب به دلیل این وقفه مقدار جدیدی دریافت نکرد. در نتیجه، مقدار قبلی آن نمایش داده می‌شود، در حالی که باید رشته وارد شده نمایش داده می‌شد. پارامترهای یک پرس‌وجو را می‌توان با استفاده از نشانه #parameters['param'] مشاهده کرد. فیلد ورودی double2 به شرح زیر به‌روزرسانی می‌شود:


      <s:textfield name="double2" key="double2.prompt" value="%{#parameters['double2']!=null ? #parameters['double2'] : double2==null ? '' : getText('double.format',{double2})}"/>

مقدار نمایش‌داده‌شده برای فیلد double2 به شرح زیر محاسبه می‌شود: اگر پارامتر «double2» وجود داشته باشد، آن نمایش داده می‌شود؛ در غیر این صورت، قالب double2 نمایش داده می‌شود. از خواننده دعوت می‌شود تا آزمایش کند که آیا این نسخه جدید تگ، مشکلات پیش‌آمده را برطرف می‌کند یا خیر.

13.10. Conclusion

تعجب‌آور است که وارد کردن اعداد حقیقی با بررسی‌های اعتبارسنجی این‌قدر پیچیده است… شاید من چیزی را در مستندات از قلم انداخته‌ام؟