Skip to content

11. برنامهٔ وب MVC [personne] – نسخهٔ ۶

11.1. Introduction

در این نسخه، تغییر زیر را اعمال کرده‌ایم:

نسخه قبلی برای ذخیره‌سازی داده‌ها بین تبادل‌های کلاینت/سرور از جلسه (session) استفاده نمی‌کرد. این نسخه از کوکی‌ها استفاده می‌کرد، به‌طوری‌که داده‌های قابل ذخیره‌سازی توسط سرور به کلاینت ارسال می‌شد تا کلاینت بتواند در تبادل بعدی آن را بازگرداند. در این نسخه جدید، ما از تکنیک مشابهی استفاده می‌کنیم: فیلدهای مخفی در فرم‌ها. تفاوت‌هایی بین این دو تکنیک وجود دارد:

کوکی‌ها
فیلدهای مخفی
- سرور موارد قابل ذخیره‌سازی را در جریان HTTP قرار می‌دهد که پیش از سند HTML قرار دارد.
- سرور موارد قابل ذخیره‌سازی را در سند HTML قرار می‌دهد.
- این تکنیک مستلزم آن است که مرورگر کوکی‌ها را بپذیرد تا بتواند هنگام ارسال درخواست‌های GET یا POST، آنها را به سرور بازگرداند.
- این تکنیک مستلزم آن است که تمام درخواست‌های کلاینت به سرور به شکل POST باشد تا فیلدهای پنهان به سرور ارسال شوند.
- کاربر می‌تواند با مشاهده کوکی‌های دریافتی توسط مرورگر خود به داده‌های ذخیره‌شده دسترسی پیدا کند. اکثر مرورگرها این گزینه را ارائه می‌دهند.
- کاربر می‌تواند با مشاهده کد منبع سند دریافت‌شده HTML به داده‌های ذخیره‌شده دسترسی پیدا کند.

از تکنیک فیلدهای مخفی می‌توان در اینجا استفاده کرد زیرا تمام درخواست‌های کلاینت از نوع POST هستند.

11.2. پروژه اکلیپس

برای ایجاد پروژه Eclipse [mvc-personne-06] برای برنامه وب [/personne6]، پروژه [mvc-personne-05] را با دنبال کردن رویه‌ای که در بخش 6.2 توضیح داده شده است، کپی کنید.

11.3. پیکربندی برنامه وب [personne6]

فایل web.xml برای اپلیکیشن /personne6 به شرح زیر است:


<?xml version="1.0" encoding="UTF-8"?>
<web-app id="WebApp_ID" version="2.4"
    xmlns="http://java.sun.com/xml/ns/j2ee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
    <display-name>mvc-personne-06</display-name>
...

این فایل به جز چند جزئیات جزئی با نسخه قبلی یکسان است:

  • خط ۶: نام نمایشی برنامه وب به [mvc-personne-06] تغییر یافته است

صفحهٔ اصلی [index.jsp] با صفحهٔ اصلی برنامهٔ [/personne5] یکسان است:


<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<%@ taglib uri="/WEB-INF/c.tld" prefix="c" %>

<c:redirect url="/do/formulaire"/>

11.4. کد نما

فقط ویوهای [réponse, erreurs] تغییر کرده‌اند. اکنون در فرم‌های مربوطه فیلدهای پنهانی دارند، در حالی که در نسخه قبلی این فرم‌ها هیچ پارامتری ارسال نمی‌کردند.

[réponse.jsp]:


...
<html>
...
  <body>
...
    <form name="frmPersonne" action="retourFormulaire" method="post">
      <input type="hidden" name="nom" value="${nom}">
      <input type="hidden" name="age" value="${age}">      
    </form>
    <a href="javascript:document.frmPersonne.submit();">
      ${lienRetourFormulaire}
    </a>
  </body>
</html>


  • خطوط ۶–۹: فرم ارسال‌شده به سرور هنگام کلیک روی لینک در خطوط ۱۰–۱۲
  • خط ۶: هدف POST، [/do/retourFormulaire] خواهد بود
  • خطوط ۷–۸: فیلدهای پنهان [nom] و [age] ارسال خواهند شد. مقادیر آن‌ها، ${name} و ${age}، توسط کنترولری که [réponse.jsp] را نمایش می‌دهد، تعیین خواهند شد. این‌ها مقادیری هستند که در فرم وارد می‌شوند.

[erreurs.jsp]:


...
<html>
...
  <body>
...
    <form name="frmPersonne" action="retourFormulaire" method="post">
      <input type="hidden" name="nom" value="${nom}">
      <input type="hidden" name="age" value="${age}">      
    </form>
    <a href="javascript:document.frmPersonne.submit();">
      ${lienRetourFormulaire}
    </a>
  </body>
</html>

تغییرات و توضیحات مشابه ویوی [réponse.jsp] است. شایان ذکر است که قالب نمای [erreurs] گسترش یافته و دو عنصر جدید، [nom, age]، به آن اضافه شده است که به دو عنصر از پیش موجود، [erreurs, lienRetourFormulaire]، افزوده می‌شوند.

از خوانندگان دعوت می‌شود تا این نماهای جدید را با استفاده از رویکرد تشریح‌شده در نسخه‌های قبلی آزمایش کنند.

11.5. کنترل‌کننده [ServletPersonne]

کنترل‌کننده [ServletPersonne] برای برنامه وب [/personne6] بسیار شبیه به نسخه قبلی است. این تغییرات ناشی از تغییر قالب نما [erreurs] است. دو عنصر اضافی باید اضافه شوند: [nom, age]. تنها متدهایی که این نما را نمایش می‌دهند تحت تأثیر قرار می‌گیرند. این متدها [doGet] و [doValidationFormulaire] هستند.

11.5.1. متد [doGet]

کد برای [doGet] به شرح زیر است:

     //GET
    @SuppressWarnings("unchecked")
    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws IOException, ServletException {

         // ما بررسی می‌کنیم که inicialization سرولت چگونه انجام شد
        if (erreursInitialisation.size() != 0) {
             //کنترل به صفحهٔ خطا منتقل می‌شود
            request.setAttribute("erreurs", erreursInitialisation);
            getServletContext().getRequestDispatcher(urlErreurs).forward(
                    request, response);
             // پایان
            return;
        }
...
    }

در واقع، این کد دقیقاً مانند قبل باقی می‌ماند. در نسخه قبلی، عناصر [nom, age] در قالب نمای [erreurs] گنجانده نشده بودند. اگر همچنان آن‌ها را شامل نکنیم، متغیرهای ${name} و ${age} از [erreurs.jsp] با یک رشتهٔ خالی جایگزین خواهند شد. این مشکلی ندارد، زیرا در این مورد خاص، لینک [Retour au formulaire] به کاربر نمایش داده نمی‌شود. در واقع، ما عنصر [lienRetourFormulaire] را نیز در قالب قرار نمی‌دهیم. متغیر ${lienRetourFormulaire} از [erreurs.jsp] با یک رشته خالی جایگزین خواهد شد. بنابراین هیچ پیوندی وجود نخواهد داشت و ارسال فیلدهای پنهان [nom, age] از فرم [erreurs.jsp] امکان‌پذیر نخواهد بود. بنابراین مقدار این فیلدها می‌تواند رشتهٔ خالی باشد.

11.5.2. متد [doValidationFormulaire]

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

     //اعتبارسنجی فرم
    void doValidationFormulaire(HttpServletRequest request,
            HttpServletResponse response) throws ServletException, IOException{
         // بازیابی پارامترها
        String nom = request.getParameter("txtNom");
        String age = request.getParameter("txtAge");
         //آماده‌سازی قالب نما [réponse, erreurs]
        request.setAttribute("nom",nom);
        request.setAttribute("age",age);        
        request.setAttribute("lienRetourFormulaire", (String)params.get("lienRetourFormulaire"));
         //اعتبارسنجی پارامتر
...

خطوط ۸–۱۰: عناصر [nom, age, lienRetourFormulaire] در قالب درج می‌شوند. ما می‌دانیم که این متد نمای [réponse] یا [erreurs] را نمایش می‌دهد. بنابراین نمای دوم در قالب خود شامل عناصر [nom,age] خواهد بود.

11.6. Tests

پس از ادغام پروژه Eclipse [personne-mvc-06Tomcat را راه‌اندازی یا مجدداً راه‌اندازی کنید، سپس URL [http://localhost:8080/personne6] را درخواست کنید.