6. تطبيق الويب MVC [personne] – الإصدار 2
سنقترح الآن متغيرات للتطبيق [/personne1] السابق الذي سنسميه [/personne2, /personne3, ...]. لا تغير هذه المتغيرات البنية الأولية للتطبيق التي تظل كما يلي:

بالنسبة لهذه المتغيرات، سنختصر شرحنا. لن نعرض سوى التعديلات التي تم إجراؤها مقارنة بالإصدار السابق.
6.1. مقدمة
نقترح الآن إضافة إدارة الجلسة إلى تطبيقنا. دعونا نذكر النقاط التالية:
- الحوار HTTP بين العميل والخادم هو سلسلة من تسلسلات الطلب والاستجابة غير متصلة ببعضها البعض
- تُستخدم الجلسة كذاكرة بين تسلسلات الطلب والاستجابة المختلفة لنفس المستخدم. إذا كان هناك N مستخدمين، فسيكون هناك N جلسات.
تُظهر سلسلة الشاشات التالية ما يُراد تحقيقه الآن في تشغيل التطبيق:
التبادل رقم 1
![]() | ![]() |
الجديد هو رابط العودة إلى النموذج الذي تمت إضافته في العرض [erreurs].
التبادل رقم 2
![]() | ![]() |
في التبادل رقم 1، أعطى المستخدم للقيمة (الاسم، العمر) القيمتين (xx، yy). إذا كان الخادم قد علم بهذه القيم أثناء التبادل، فإنه "ينساها" في نهاية التبادل. ومع ذلك، يمكن ملاحظة أنه خلال التبادل رقم 2، يكون قادرًا على إعادة عرض قيمهما في رده. إن مفهوم الجلسة هو الذي سيسمح هنا لخادم الويب بتخزين البيانات خلال التبادلات المتتالية بين العميل والخادم. هناك حلول أخرى ممكنة لحل هذه المشكلة.
خلال التبادل رقم 1، سيحفظ الخادم في الجلسة الزوج (الاسم، العمر) الذي أرسله العميل إليه ليتمكن من عرضه خلال التبادل رقم 2.
فيما يلي مثال آخر على تطبيق الجلسة بين تبادلين:
التبادل رقم 1
![]() | ![]() |
الجديد هو رابط العودة إلى النموذج الذي تمت إضافته في صفحة الرد.
المراسلة رقم 2
![]() | ![]() |
6.2. مشروع Eclipse
لإنشاء مشروع Eclipse [mvc-personne-02] لتطبيق الويب [/personne2]، سنقوم بنسخ مشروع Eclipse [mvc-personne-01] لاستعادة ما هو موجود. للقيام بذلك، نتبع الخطوات التالية:
[clic droit sur projet mvc-personne-01 -> Copy]:

ثم [clic droit dans Package Explorer -> Paste]:
![]() | ![]() - نحدد في [1] اسم المشروع الجديد وفي [2] اسم مجلد موجود ولكنه فارغ |
يتم عندئذ إنشاء المشروع [mvc-personne-02]:

وهو مطابق في الوقت الحالي للمشروع [mvc-personne-01]. سيتعين علينا إجراء بعض التعديلات يدويًا قبل أن نتمكن من استخدامه. لننتقل إلى العرض [Servers] ونحاول إضافة هذا التطبيق الجديد إلى التطبيقات التي يديرها Tomcat:
![]() | ![]() |
نلاحظ أنه في [1]، لا يرى Tomcat المشروع الجديد [mvc-personne-02]. لكي يراه، يجب تعديل ملف تكوين المشروع [mvc-personne-02]. لنستخدم الخيار [File / Open File] لفتح الملف [<mvc-personne-02>/.settings/.component]:
<?xml version="1.0" encoding="UTF-8"?>
<project-modules id="moduleCoreId">
<wb-module deploy-name="mvc-personne-01">
<wb-resource deploy-path="/" source-path="/WebContent"/>
<wb-resource deploy-path="/WEB-INF/classes" source-path="/src"/>
<property name="java-output-path" value="/build/classes/"/>
<property name="context-root" value="personne1"/>
</wb-module>
</project-modules>
تشير السطر 3 إلى اسم الوحدة النمطية للويب التي سيتم نشرها داخل Tomcat. هذا الاسم هو، هنا، نفس اسم المشروع [mvc-personne-01]. نقوم بتغييره إلى [mvc-personne-02]:
<wb-module deploy-name="mvc-personne-02">
بالإضافة إلى ذلك، يمكننا الاستفادة من هذه الفرصة لتعديل اسم سياق التطبيق [mvc-personne-02] في السطر 7، والذي يتعارض مع اسم مشروع [mvc-personne-01]:
<property name="context-root" value="personne2"/>
كان من الممكن إجراء هذا التعديل الثاني مباشرةً داخل Eclipse. لكنني لم أجد طريقة لإجراء التعديل الأول دون المرور عبر ملف التكوين.
بعد ذلك، نقوم بحفظ الملف الجديد [.content] ثم نغلق Eclipse ونعيد تشغيله حتى يتم أخذ التغيير في الاعتبار.
بمجرد إعادة تشغيل Eclipse، نحاول إجراء العملية التي فشلت سابقًا:
![]() | ![]() |
هذه المرة، يتم عرض المشروع [mvc-personne-02] بشكل صحيح. نضيفه إلى المشاريع التي تم تكوينها ليتم تنفيذها بواسطة Tomcat:

6.3. تكوين تطبيق الويب [personne2]
الملف web.xml لتطبيق /personne2 هو التالي:
<?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-02</display-name>
<!-- ServletPersonne -->
<servlet>
<servlet-name>personne</servlet-name>
<servlet-class>
istia.st.servlets.personne.ServletPersonne
</servlet-class>
<init-param>
<param-name>urlReponse</param-name>
<param-value>
/WEB-INF/vues/reponse.jsp
</param-value>
</init-param>
<init-param>
<param-name>urlErreurs</param-name>
<param-value>
/WEB-INF/vues/erreurs.jsp
</param-value>
</init-param>
<init-param>
<param-name>urlFormulaire</param-name>
<param-value>
/WEB-INF/vues/formulaire.jsp
</param-value>
</init-param>
<init-param>
<param-name>urlControleur</param-name>
<param-value>
main
</param-value>
</init-param>
<init-param>
<param-name>lienRetourFormulaire</param-name>
<param-value>
Retour au formulaire
</param-value>
</init-param>
</servlet>
<!-- تعيين ServletPersonne-->
<servlet-mapping>
<servlet-name>personne</servlet-name>
<url-pattern>/main</url-pattern>
</servlet-mapping>
<!-- ملفات الاستقبال -->
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>
هذا الملف مطابق لملف الإصدار السابق، باستثناء أنه يعلن عن معلمتي تهيئة جديدتين:
- السطر 6: تغير اسم عرض تطبيق الويب إلى [mvc-personne-02]
- الأسطر 31-36: تحدد معلمة التكوين المسماة [urlControleur] وهي عنوان URL [main] الذي يؤدي إلى السيرفلت [ServletPersonne]
- الأسطر 37-42: تحدد معلمة تكوين باسم [lienRetourFormulaire] وهي نص رابط العودة إلى النموذج، من الصفحات JSP و [erreurs.jsp] و [reponse.jsp].
تتغير الصفحة الرئيسية [index.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">
<%
response.sendRedirect("/personne2/main");
%>
- السطر 5: تقوم الصفحة [index.jsp] بإعادة توجيه العميل إلى عنوان URL لوحدة التحكم [ServletPersonne] الخاصة بالتطبيق [/personne2].
6.4. كود العروض
6.4.1. عرض [formulaire]
هذه العرضة مطابقة لتلك الموجودة في الإصدار السابق:

يتم إنشاؤها بواسطة الصفحة التالية 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">
<%
// يتم استرداد بيانات النموذج
String nom=(String)session.getAttribute("nom");
String age=(String)session.getAttribute("age");
String urlAction=(String)request.getAttribute("urlAction");
%>
<html>
<head>
<title>Personne - formulaire</title>
</head>
<body>
<center>
<h2>Personne - formulaire</h2>
<hr>
<form action="<%=urlAction%>" 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="Envoyer"></td>
<td><input type="reset" value="Rétablir"></td>
<td><input type="button" value="Effacer"></td>
</tr>
</table>
<input type="hidden" name="action" value="validationFormulaire">
</form>
</center>
</body>
</html>
المستجدات:
- السطر 19، يحتوي النموذج الآن على سمة [action] التي تمثل عنوان URL الذي يجب على المتصفح إرسال قيم النموذج إليه عندما ينقر المستخدم على الزر [Envoyer] من النوع submit. ستكون قيمة المتغير [urlAction] هي action="main". يتم عرض العرض [formulaire] بعد قيام المستخدم بالإجراءات التالية:
- الطلب الأولي: GET /personne2/main
- النقر على الرابط [Retour au formulaire]: GET /personne2/main?action=retourFormulaire
نظرًا لأن السمة [action] لا تحدد عنوان URL مطلقًا (يبدأ بـ /) بل عنوان URL نسبي (لا يبدأ بـ /)، سيستخدم المتصفح الجزء الأول من عنوان URL للصفحة المعروضة حاليًا [/personne2] ويضيف إليه عنوان URL النسبي. وبالتالي، سيكون عنوان URL الخاص بـ POST هو [/personne2/main]، وهو عنوان URL الخاص بوحدة التحكم. وسيصاحب هذا الطلب POST المعلمات [txtNom, txtAge, action] الموجودة في الأسطر 23 و27 و38.
- السطر 8: يتم استرداد قيمة عنصر [urlAction] من النموذج. يتم البحث عنها في سمات الطلب الحالي. وسيتم استخدامها في السطر 19.
- السطران 6-7: يتم استرداد قيم العناصر [nom, age] من النموذج. يتم البحث عنها في سمات الجلسة وليس في سمات الاستعلام كما في الإصدار السابق. وذلك لتلبية احتياجات الاستعلام [GET /personne2/main?action=retourFormulaire] للرابط الخاص بعرضي [réponse] و [erreurs]. قبل عرض هذين العرضين، يضع المتحكم البيانات التي تم إدخالها في النموذج في الجلسة، مما يسمح له بالعثور عليها عندما يستخدم المستخدم الرابط [Retour au formulaire] الخاص بعروض [réponse] و [erreurs].
6.4.2. الطريقة [reponse]
تعرض هذه العرضة القيم التي تم إدخالها في النموذج عندما تكون صالحة:
![]() | ![]() |
بالنسبة للإصدار السابق، فإن الجديد يأتي من الرابط [Retour au formulaire]. يتم إنشاء العرض بواسطة الصفحة التالية 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">
<%
// استرداد بيانات النموذج
String nom=(String)request.getAttribute("nom");
String age=(String)request.getAttribute("age");
String lienRetourFormulaire=(String)request.getAttribute("lienRetourFormulaire");
%>
<html>
<head>
<title>Personne</title>
</head>
<body>
<h2>Personne - réponse</h2>
<hr>
<table>
<tr>
<td>Nom</td>
<td><%= nom %>
</tr>
<tr>
<td>Age</td>
<td><%= age %>
</tr>
</table>
<br>
<a href="?action=retourFormulaire"><%= lienRetourFormulaire %></a>
</body>
</html>
- السطر 31: رابط العودة إلى النموذج. يتكون هذا الرابط من مكونين:
- الهدف [href="?action=retourFormulaire"]. يتم عرض العرض [réponse] بعد POST من النموذج [formulaire.jsp] على عنوان URL [/personne2/main]. وبالتالي، فإن عنوان URL الأخير هو الذي يتم عرضه في المتصفح عند عرض العرض [réponse]. سيؤدي النقر على الرابط [Retour au formulaire] إلى إرسال طلب Get من المتصفح إلى عنوان URL المحدد بواسطة السمة [href] للرابط، وهو هنا "?action=retourFormulaire". في حالة عدم وجود عنوان URL في [href]، سيستخدم المتصفح عنوان URL الخاص بالعرض المعروض حاليًا، c.a.d. [/personne2/main]. في النهاية، سيؤدي النقر على الرابط [Retour au formulaire] إلى إرسال طلب Get من المتصفح إلى عنوان URL [/personne2/main?action=retourFormulaire]، c.a.d عنوان URL لوحدة التحكم في التطبيق مصحوبًا بالمعلمة [action] لإرشاده إلى ما يجب عليه فعله.
- نص الرابط. سيكون هذا جزءًا من النموذج الذي يتم إرساله إلى الصفحة بواسطة وحدة التحكم ويتم استرداده في السطر 10.
6.4.3. الطريقة [erreurs]
تشير هذه العرضة إلى أخطاء الإدخال في النموذج:
![]() | ![]() |
بالنسبة للإصدار السابق، فإن الجديد يأتي من الرابط [Retour au formulaire]. يتم إنشاء العرض بواسطة الصفحة التالية 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">
<%@ page import="java.util.ArrayList" %>
<%
// استرداد بيانات النموذج
ArrayList erreurs=(ArrayList)request.getAttribute("erreurs");
String lienRetourFormulaire=(String)request.getAttribute("lienRetourFormulaire");
%>
<html>
<head>
<title>Personne</title>
</head>
<body>
<h2>Les erreurs suivantes se sont produites</h2>
<ul>
<%
for(int i=0;i<erreurs.size();i++){
out.println("<li>" + (String) erreurs.get(i) + "</li>\n");
}//for
%>
</ul>
<br>
<a href="?action=retourFormulaire"><%= lienRetourFormulaire %></a>
</body>
</html>
- السطر 26: رابط العودة إلى النموذج. هذا الرابط مطابق للرابط الموجود في العرض [réponse]. يُرجى من القارئ إعادة قراءة التفسيرات المقدمة لهذا العرض إذا لزم الأمر.
6.5. اختبارات العروض
لإجراء اختبارات العروض السابقة، نقوم بنسخ صفحاتها JSP في المجلد /WebContent/JSP من مشروع Eclipse:

ثم في المجلد JSP، يتم تعديل الصفحات على النحو التالي:
[formulaire.jsp]:
...
<%
// -- اختبار: إنشاء قالب الصفحة
session.setAttribute("nom","tintin");
session.setAttribute("age","30");
request.setAttribute("urlAction","main");
%>
<%
// يتم استرداد بيانات النموذج
String nom=(String)session.getAttribute("nom");
String age=(String)session.getAttribute("age");
String urlAction=(String)request.getAttribute("urlAction");
%>
تمت إضافة السطور 4-5 لإنشاء النموذج الذي تحتاجه الصفحة في السطور 11-13.
[reponse.jsp]:
<%
// -- اختبار: يتم إنشاء قالب الصفحة
request.setAttribute("nom","milou");
request.setAttribute("age","10");
request.setAttribute("lienRetourFormulaire","Retour au formulaire");
%>
<%
// يتم استرداد بيانات النموذج
String nom=(String)request.getAttribute("nom");
String age=(String)request.getAttribute("age");
String lienRetourFormulaire=(String)request.getAttribute("lienRetourFormulaire");
%>
تمت إضافة الأسطر 4-6 لإنشاء النموذج الذي تحتاجه الصفحة في الأسطر 11-13.
[erreurs.jsp]:
<%
// -- اختبار: إنشاء قالب الصفحة
ArrayList<String> erreurs1=new ArrayList<String>();
erreurs1.add("erreur1");
erreurs1.add("erreur2");
request.setAttribute("erreurs",erreurs1);
request.setAttribute("lienRetourFormulaire","Retour au formulaire");
%>
<%
// يتم استرداد بيانات النموذج
ArrayList erreurs=(ArrayList)request.getAttribute("erreurs");
String lienRetourFormulaire=(String)request.getAttribute("lienRetourFormulaire");
%>
تمت إضافة الأسطر 4-8 لإنشاء النموذج الذي تحتاجه الصفحة في الأسطر 13-14.
دعونا نطلق Tomcat إذا لم يكن قد تم ذلك بالفعل، ثم نطلب عناوين URL التالية:
![]() | ![]() |
![]() |
نحصل بالفعل على العروض المتوقعة.
6.6. وحدة التحكم [ServletPersonne]
ستقوم وحدة التحكم [ServletPersonne] الخاصة بتطبيق الويب [/personne2] بمعالجة الإجراءات التالية:
رقم | الطلب | الأصل | المعالجة |
1 | [GET /personne2/main] | رابط URL الذي أدخله المستخدم | - إرسال عرض [formulaire] فارغ |
2 | [POST /personne2/main] مع المعلمات [txtNom, txtAge، الإجراء] المنشورة | النقر على الزر [Envoyer] في العرض [formulaire] | - التحقق من قيم المعلمات [txtNom, txtAge] - إذا كانت غير صحيحة، أرسل العرض [erreurs(erreurs)] - إذا كانت صحيحة، أرسل العرض [reponse(nom,age)] |
3 | [GET /personne2/main? action=retourFormulaire] | انقر على الرابط [العودة إلى النموذج] من طرق العرض الرد] و [erreurs]. | - إرسال عرض [formulaire] مملوء مسبقًا بأحدث القيم التي تم إدخالها |
لذلك لدينا إجراء جديد يجب معالجته: [GET /personne2/main?action=retourFormulaire].
6.6.1. هيكل وحدة التحكم
هيكل وحدة التحكم [ServletPersonne] مطابق تقريبًا لهيكل الإصدار السابق:
المستجدات:
- السطر 4: يتطلب استخدام جلسة عمل استيراد الحزمة [HttpSession]
- الأسطر 28-30: تعالج الطريقة الجديدة [doRetourFormulaire] الإجراء الجديد: [GET /personne2/main?action=retourFormulaire].
6.6.2. تهيئة وحدة التحكم [init]
الطريقة [init] مطابقة لتلك الموجودة في الإصدار السابق. وهي تتحقق من وجود العناصر المعلنة في الجدول [paramètres] في الملف [web.xml]:
- السطر 5: تمت إضافة المعلمات [urlControleur] (عنوان URL لوحدة التحكم) و [lienRetourFormulaire] (نص رابط العرض [réponse] و [erreurs]).
6.6.3. الطريقة [doGet]
يجب أن تعالج الطريقة [doGet] الإجراء [GET /personne2/main?action=retourFormulaire] الذي لم يكن موجودًا من قبل:
- الأسطر 6-14: يتم التحقق من أن قائمة أخطاء التهيئة فارغة. إذا لم يكن الأمر كذلك، يتم عرض طريقة العرض [erreurs(erreursInitialisation)] التي ستشير إلى الخطأ أو الأخطاء.
لفهم هذا الرمز، يجب تذكر نموذج العرض [erreurs]:
<%
// استرداد بيانات النموذج
ArrayList erreurs=(ArrayList)request.getAttribute("erreurs");
String lienRetourFormulaire=(String)request.getAttribute("lienRetourFormulaire");
%>
تنتظر طريقة العرض [erreurs] عنصر مفتاح "erreurs" في الاستعلام. يقوم وحدة التحكم بإنشاء هذا العنصر في السطر 8. كما تنتظر عنصر مفتاح "lienRetourFormulaire". تقوم وحدة التحكم بإنشاء هذا العنصر في السطر 9. هنا سيكون نص الرابط فارغًا. وبالتالي، لن يكون هناك رابط في العرض [erreurs] المرسل. في الواقع، إذا حدثت أخطاء في تهيئة التطبيق، فيجب إعادة تهيئته. ولا داعي لعرض متابعة التطبيق على المستخدم عبر رابط.
- السطور 34-37: معالجة الإجراء الجديد [GET /personne2/main?action=retourFormulaire]
6.6.4. الطريقة [doInit]
تعالج هذه الطريقة الطلب رقم 1 [GET /personne2/main]. في هذا الطلب، يجب أن ترسل طريقة العرض [formulaire(nom,age)] فارغة. رمزها هو التالي:
- السطر 4: يتم استرداد الجلسة الحالية إن وجدت، وإلا يتم إنشاؤها (المعلمة true من getSession).
- السطران 9-10: يتم عرض العرض [formulaire]. لنتذكر النموذج المتوقع لهذا العرض:
<%
// استرداد بيانات النموذج
String nom=(String)session.getAttribute("nom");
String age=(String)session.getAttribute("age");
String urlAction=(String)request.getAttribute("urlAction");
%>
- السطران 6-7: يتم تهيئة عناصر [nom,age] من نموذج العرض [formulaire] بسلاسل فارغة ووضعها في الجلسة لأن هذا هو المكان الذي ينتظرها فيه العرض.
- السطر 8: يتم تهيئة عنصر [urlAction] من النموذج بقيمة المعلمة [urlControleur] من الملف [web.xml] ووضعه في الاستعلام.
6.6.5. الطريقة [doValidationFormulaire]
تعالج هذه الطريقة الطلب رقم 2 [POST /personne2/main] الذي تحتوي المعلمات المرسلة فيه على [action, txtNom, txtAge]. وفيما يلي كودها:
- السطران 5-6: يتم استرداد قيم المعلمات "txtNom" و"txtAge" من طلب العميل.
- السطور 8-10: يتم تخزين هذه القيم في الجلسة حتى يمكن العثور عليها عندما ينقر المستخدم على الرابط [Retour au formulaire] في العرضين [réponse] و [erreurs].
- الأسطر 12-19: يتم التحقق من صحة قيم المعلمتين
- الأسطر 21-28: إذا كان أحد المعلمات خاطئًا، يتم عرض العرض [erreurs(erreurs,lienRetourFormulaire)]. تذكر نموذج هذا العرض:
<%
// يتم استرداد بيانات النموذج
ArrayList erreurs=(ArrayList)request.getAttribute("erreurs");
String lienRetourFormulaire=(String)request.getAttribute("lienRetourFormulaire");
%>
- الأسطر 30-34: إذا كانت قيمتي المعلمتين "txtNom" و"txtAge" المسترجعتين صالحتين، يتم عرض العرض [reponse(nom,age,lienRetourFormulaire)]. يجب تذكر نموذج العرض [reponse]:
<%
// يتم استرداد البيانات من النموذج
String nom=(String)request.getAttribute("nom");
String age=(String)request.getAttribute("age");
String lienRetourFormulaire=(String)request.getAttribute("lienRetourFormulaire");
%>
6.6.6. الطريقة [doRetourFormulaire]
تعالج هذه الطريقة الطلب رقم 3 [GET /personne2/main?action=retourFormulaire]. ورمزها هو التالي:
في نهاية هذه الطريقة، يجب عرض طريقة العرض [formulaire] مملوءة مسبقًا بآخر الإدخالات التي قام بها المستخدم. لنتذكر نموذج طريقة العرض [formulaire]:
<%
// استرداد بيانات النموذج
String nom=(String)session.getAttribute("nom");
String age=(String)session.getAttribute("age");
String urlAction=(String)request.getAttribute("urlAction");
%>
لذا يجب أن تقوم الطريقة [doRetourFormulaire] بإنشاء النموذج السابق.
- السطر 4: يتم استرداد الجلسة التي حفظ فيها المتحكم القيم (الاسم، العمر) التي تم إدخالها.
- السطر 7: يتم استرداد الاسم من الجلسة
- السطران 8-9: إذا لم يكن موجودًا، يتم إدراجه بقيمة فارغة. لا ينبغي أن يحدث هذا في التشغيل العادي للتطبيق، حيث إن الإجراء [retourFormulaire] يحدث دائمًا بعد الإجراء [validationFormulaire]، أي بعد إدخال البيانات المدخلة في الجلسة. ولكن قد تنتهي صلاحية الجلسة لأنها محدودة المدة، وغالبًا ما تكون بضع عشرات من الدقائق. في هذه الحالة، أعاد السطر 4 إنشاء جلسة جديدة لن نجد فيها الاسم. عندئذ نضع اسمًا فارغًا في الجلسة الجديدة.
- السطور 11-13: نفعل الشيء نفسه بالنسبة للعمر
- إذا تجاهلنا مشكلة انتهاء صلاحية الجلسة، فإن الأسطر 3-13 تكون عديمة الفائدة. العناصر [nom,age] من النموذج موجودة بالفعل في الجلسة. لذلك لا داعي لإعادة إدخالها.
- السطر 15: نحدد قيمة عنصر [urlAction] في النموذج
6.7. الاختبارات
تشغيل أو إعادة تشغيل Tomcat. طلب عنوان URL [http://localhost:8080/personne2] ثم استئناف الاختبارات الموضحة في المثال الوارد في الفقرة 6.1.
















