Skip to content

9. برنامه وب MVC [personne] – نسخه ۴

این نسخه از کتابخانهٔ تگ JSTL که قبلاً معرفی شد، استفاده می‌کند.

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

برای ایجاد پروژه Eclipse [mvc-personne-04] برای برنامه وب [/personne4]، پروژه [mvc-personne-03] را با دنبال کردن رویه‌ای که در بخش 6.2، صفحه 78 توضیح داده شده است، کپی خواهیم کرد.

9.2. پیکربندی برنامه وب [personne4]

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


<?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-04</display-name>
    ...

این فایل به جز خط ۶ که در آن نام نمایشی وب‌اپلیکیشن به [mvc-personne-04] تغییر یافته، با نسخه قبلی یکسان است.

صفحه اصلی [index.jsp] به صورت زیر تغییر می‌کند:


<%@ 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="/main"/>
  • خط ۵: صفحه [index.jsp] کلاینت را به URL [/main] هدایت می‌کند، که به کنترلر [ServletPersonne] از اپلیکیشن [/personne4] منتهی می‌شود. تگ <c:redirect> به کتابخانهٔ JSTL / Core تعلق دارد. این تگ ویژگی متمایزی دارد که عبارت زیر را به URL مشخص‌شده در ویژگی [url] آن اضافه می‌کند:
  • پیش‌وند [/contexte]، که در آن [contexte] زمینهٔ برنامه است، در این مورد [personne4].
  • پسوند [?jsessionid=id_session] را در صورتی که مرورگری که درخواست را ارسال می‌کند، کوکی جلسه را ارسال نکرده باشد، اضافه می‌کند. شناسه‌ی [jsessionid] به شناسه‌ی توکن جلسه اشاره دارد که توسط وب‌سرور به کلاینت‌های آن ارسال می‌شود. این شناسه به وب‌سرور بستگی دارد. در اینجا، این مربوط به سرور Tomcat است. [id_session] خود توکن جلسه است.

بنابراین، URL واقعی هدایت (redirect) در خط ۵، [index.jsp]، همان URL [/personne4/main?jsessionid=XX] است که در آن XX توکن جلسه (session token) است. این موضوع در صفحه زیر نشان داده شده است که پس از درخواست اولیه URL [http://localhost:8080/personne4] به دست آمده است:

Image

ارتباط بین تگ <c:redirect> و توکن جلسه نسبتاً ظریف است. بررسی دقیق این موضوع در اینجا هنوز زود است، اما بعداً فرصت خواهیم داشت تا به آن بازگردیم.

9.3. کد نما

9.3.1. ویوی [formulaire]

این نما تغییر نکرده است:

Image

این توسط صفحه زیر تولید می‌شود: JSP [formulaire.jsp]:


<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
  pageEncoding="ISO-8859-1"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<%@ taglib uri="/WEB-INF/c.tld" prefix="c" %>

<html>
  <head>
    <title>Personne - formulaire</title>
    <script language="javascript">
...
      </script>
  </head>
  <body>
    <center>
      <h2>Personne - formulaire</h2>
      <hr>
      <form name="frmPersonne" method="post">
        <table>
          <tr>
            <td>Nom</td>
            <td><input name="txtNom" value="${nom}" type="text" size="20"></td>
          </tr>
          <tr>
            <td>Age</td>
            <td><input name="txtAge" value="${age}" type="text" size="3"></td>
          </tr>
          <tr>
        </table>
        <table>
          <tr>
            <td><input type="submit" value="Submit"></td>
            <td><input type="button" value="[Envoyer]" onclick="envoyer()"></td>
            <td><input type="reset" value="Rétablir"></td>
            <td><input type="button" value="[Effacer]" onclick="effacer()"></td>
          </tr>
        </table>
        <input type="hidden" name="action" value="validationFormulaire">
      </form>
    </center>
  </body>
</html>

ویژگی‌های جدید:

  • خط ۴: اعلام کتابخانه تگ اصلی JSTL
  • خطوط ۲۱ و ۲۵: بازیابی ویژگی‌های [nom, age] از قالب صفحه. به یاد داشته باشید که این ویژگی‌ها به ترتیب از درخواست [request]، جلسه [session] و برنامه [application] صفحه JSP بازیابی خواهند شد. در مورد ما، کنترلر آن‌ها را در جلسه قرار خواهد داد.
  • به دلیل فرآیند قبلی، دیگر هیچ کد جاوا در بالای صفحه JSP برای بازیابی قالب صفحه وجود ندارد.

9.3.2. ویوی [reponse]

این نما تغییر نکرده است:

صفحه جدید JSP [reponse.jsp] به شرح زیر است:


<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<%@ taglib uri="/WEB-INF/c.tld" prefix="c" %>

<html>
    <head>
      <title>Personne</title>
  </head>
  <body>
      <h2>Personne - réponse</h2>
    <hr>
    <table>
        <tr>
          <td>Nom</td>
        <td>${nom}</td>
      </tr>
        <tr>
          <td>Age</td>
        <td>${age}</td>
      </tr>
    </table>      
    <br>
    <form name="frmPersonne" method="post">
      <input type="hidden" name="action" value="retourFormulaire">
    </form>
    <a href="javascript:document.frmPersonne.submit();">
      ${lienRetourFormulaire}
    </a>
  </body>
</html>

ویژگی‌های جدید:

  • خط ۴: اعلام کتابخانه تگ اصلی JSTL
  • خطوط 16، 20، 28: بازیابی ویژگی‌های [nom, age, lienRetourFormulaire] در قالب صفحه. دیگر هیچ کد جاوا در بالای صفحه (JSP) برای بازیابی این ویژگی‌ها وجود ندارد.

9.3.3. نما [erreurs]

این نما تغییر نکرده است:

صفحه جدید JSP [erreurs.jsp] به شرح زیر است:


<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<%@ taglib uri="/WEB-INF/c.tld" prefix="c" %>

<html>
    <head>
      <title>Personne</title>
  </head>
  <body>
      <h2>Les erreurs suivantes se sont produites</h2>
    <ul>
            <c:forEach var="erreur" items="${erreurs}">
                <li>${erreur}</li>
            </c:forEach>
    </ul>
    <br>
    <form name="frmPersonne" method="post">
      <input type="hidden" name="action" value="retourFormulaire">
    </form>
    <a href="javascript:document.frmPersonne.submit();">
      ${lienRetourFormulaire}
    </a>
  </body>
</html>

ویژگی‌های جدید:

  • خط ۴: اعلام کتابخانه تگ اصلی JSTL
  • خطوط ۱۳–۱۵: نمایش لیست خطاها با استفاده از JSTL
  • دیگر هیچ کد جاوا در بالای صفحه (JSP) برای بازیابی قالب صفحه وجود ندارد.

9.4. آزمایش نماها

برای آزمایش نماهای قبلی، صفحات آنها JSP را در پوشه /WebContent/JSP پروژه Eclipse کپی می‌کنیم:

Image

سپس، در پوشه JSP، صفحات به شرح زیر اصلاح می‌شوند:

[formulaire.jsp]:


...
<%
  //-- تست: ایجاد قالب صفحه
  session.setAttribute("nom","tintin");
  session.setAttribute("age","30");
%>

<html>
  <head>

خطوط ۴–۵ برای ایجاد قالب مورد نیاز صفحه اضافه شده‌اند.

[reponse.jsp]:


...
<%
  //-- تست: ایجاد قالب صفحه
  request.setAttribute("nom","milou");
  request.setAttribute("age","10");
  request.setAttribute("lienRetourFormulaire","Retour au formulaire");
%>


<html>
  <head>

...

خطوط ۴–۶ برای ایجاد قالب مورد نیاز صفحه اضافه شده‌اند.

[erreurs.jsp]:



<%
  //-- تست: ایجاد قالب صفحه
  ArrayList<String> erreurs1=new ArrayList<String>();
  erreurs1.add("erreur1");
  erreurs1.add("erreur2");
  request.setAttribute("erreurs",erreurs1);
  request.setAttribute("lienRetourFormulaire","Retour au formulaire");
%>

<html>
  <head>

خطوط ۴–۸ برای ایجاد قالب مورد نیاز صفحه اضافه شده‌اند.

اگر تا کنون Tomcat را راه‌اندازی نکرده‌اید، آن را راه‌اندازی کنید، سپس آدرس‌های URL زیر را درخواست کنید:

 

ما واقعاً نماهای مورد انتظار را دریافت می‌کنیم.

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

کنترلر [ServletPersonne] برای برنامه وب [/personne3] اقدامات زیر را مدیریت خواهد کرد:

خیر.
درخواست
مبدأ
در حال پردازش
۱
[GET /personne4/main]
URL وارد شده توسط کاربر
- ارسال نمای خالی [formulaire]
2
[POST /personne4/main]
با پارامترها [txtNom,
txtAge,
action=validationForm]
ارسال شد
کلیک کردن دکمه
[Envoyer] در نما
[formulaire]
- مقادیر پارامترها را در [txtNom, txtAge] بررسی کنید
- اگر نادرست باشند، نما [erreurs(erreurs)] را ارسال کنید
- اگر صحیح هستند، نما [reponse(nom,age)] را ارسال کنید
3
[POST /personne4/main]
با پارامترها
[action=retourFormulaire]
ارسال شد
روی [بازگشت به کلیک کنید
فرم] در نماها
[réponse] و [erreurs].
- ارسال نمای از پیش پرشده [formulaire] با آخرین مقادیر واردشده

قالب کنترلر [ServletPersonne] با نسخه قبلی یکسان است. ما تغییرات اعمال‌شده در متدهای [doInit, doValidationFormulaire, doRetourFormulaire] را بررسی خواهیم کرد، زیرا متدهای [init, doGet, doPost] بدون تغییر باقی مانده‌اند.

9.5.1. روش [doInit]

این متد درخواست شماره ۱، [GET /personne4/main] را پردازش می‌کند. کد آن به شرح زیر است:

1
2
3
4
5
6
     //نمایش یک فرم خالی
    void doInit(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{
        getServletContext().getRequestDispatcher((String)params.get("urlFormulaire")).forward(
                request, response);
        return;
}

ویژگی‌های جدید:

  • خط ۳: نمای [formulaire] نمایش داده می‌شود. این نما در قالب خود منتظر ویژگی‌های «name» و «age» است. این ویژگی‌ها را پیدا نخواهد کرد، زیرا کنترلر آن‌ها را در قالب تنظیم نمی‌کند. در این مورد، کتابخانه JSTL نشانگرهای null را برای این ویژگی‌ها بازیابی خواهد کرد. این امر باعث ایجاد هیچ خطایی نمی‌شود و مقادیر خالی برای عناصر ${nom} و ${age} در نمای [formulaire] نمایش داده خواهند شد. این برای ما قابل قبول است. به این ترتیب، از نیاز به инициализация مدل برای نما [formulaire] اجتناب می‌کنیم.

9.5.2. متد [doValidationFormulaire]

این متد درخواست شمارهٔ 2، [POST /personne4/main]، را با [action, txtNom, txtAge] در عناصر ارسال‌شده پردازش می‌کند. کد آن به شرح زیر است:

     //اعتبارسنجی فرم
    void doValidationFormulaire(HttpServletRequest request,
            HttpServletResponse response) throws ServletException, IOException{
                 //بازیابی پارامترها
        String nom = request.getParameter("txtNom");
        String age = request.getParameter("txtAge");
         // که در جلسه ذخیره شده‌اند
        HttpSession session = request.getSession(true);        
        session.setAttribute("nom", nom);
        session.setAttribute("age", age);
         // تأیید پارامتر
...
         //پارامترها صحیح هستند – صفحه پاسخ ارسال می‌شود
        request.setAttribute("lienRetourFormulaire", (String)params.get("lienRetourFormulaire"));
        getServletContext().getRequestDispatcher((String)params.get("urlReponse")).forward(request,
                response);
        return;
    }

ویژگی‌های جدید:

  • خط ۱۵: متد [doValidationFormulaire] نمای [réponse] را بازمی‌گرداند. این نما در قالب خود شامل عناصر [nom, age, lienRetourFormulaire] است. [lienRetourFormulaire] در خط 14 از طریق پرس‌وجو در قالب درج می‌شود. عناصر [nom,age] به نوبه خود، از طریق جلسه در خطوط ۸ تا ۱۰ در مدل قرار می‌گیرند. در نسخه قبلی، عناصر [nom, age] نیز هنگام ارسال نما [réponse] در درخواست قرار می‌گرفتند، زیرا آن نما انتظار داشت که در آنجا باشند. در اینجا، با کتابخانه JSTL، می‌دانیم که زمینه‌های مختلف (درخواست، جلسه، برنامه) برای یافتن عناصر مدل جستجو خواهند شد. بنابراین، آن‌ها در جلسه یافت خواهند شد، زیرا کنترل‌کننده آن‌ها را در آنجا قرار داده است (خطوط ۸–۱۰).

9.5.3. متد [doRetourFormulaire]

این متد درخواست شماره ۳، [POST /personne4/main]، را با [action=retourFormulaire] در عناصر ارسال‌شده مدیریت می‌کند. کد آن به شرح زیر است:

1
2
3
4
5
6
7
     //نمایش فرم از پیش پرشده
    void doRetourFormulaire(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{
         // فرم نمایش داده می‌شود
        getServletContext().getRequestDispatcher((String)params.get("urlFormulaire")).forward(
                request, response);
        return;
    }

ویژگی‌های جدید:

  • خط ۴: نمای [formulaire] نمایش داده می‌شود. این نما در قالب خود منتظر ویژگی‌های «name» و «age» است. این متد آنها را در جلسه (session) پیدا خواهد کرد زیرا متد [doValidationFormulaire] آنها را در آنجا قرار داده است، و این متد لزوماً قبل از متد [doRetourFormulaire] اجرا می‌شود. بنابراین نیازی نیست که مدل را برای [formulaire] قبل از نمایش آن در خط ۴ مقداردهی اولیه (initialise) کرد. در نتیجه، متدهای [doInit] و [doRetourFormulaire] یکسان هستند و اقدام [retourFormulaire] را می‌توان حذف کرده و با اقدام [init] جایگزین کرد. در این صورت متد [doRetourFormulaire] حذف خواهد شد.

9.6. Tests

در این نسخه جدید، تنها ویوها تغییر کرده‌اند. کنترلر [ServletPersonne] بدون تغییر باقی مانده است. استفاده از JSTL به ما این امکان را داده است که مدل ساخته‌شده توسط کنترلر را به راحتی در صفحات JSP به کار ببریم.

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