1. حزمة مكتبة. 2. import javax.servlet.http.HttpSessionBindingListener; 3. import javax.servlet.http.HttpSessionBindingEvent; 4. استيراد java.sql.*; 5. قم باستيراد نموذج java.text.SimpleDate على؛ 6. استيراد java.util.Date؛ 7. 8. يقوم مستخدم الفئة العامة بتنفيذ HttpSessionBindingListener 9. { 10.… 11. سلسلة خاصة تسجيل الدخولDatetime // وقت تسجيل دخول المستخدم 12.… 13. قيمة باطلة عامة (حدث HttpSessionBindingEvent) 14. { 15. اتصال conn = null; 16. String sqlStr = "أدخل في T_LOGIN_LOG(ID، USER_ID، DT_LOGIN)" + 17. "القيم (SEQ_LOGIN_LOG_ID.NEXTVAL،؟،؟)"؛ 18. حاول 19. { 20.conn = DBConnection.getConnection(); 21. PreparationStatement pStat = conn.prepareStatement(sqlStr); 22.loginDatetime = getCurrDatetimeStr(); // السلسلة الزمنية الحالية 23.pStat.setString(1, userId); 24.pStat.setString(2,loginDatetime); 25.pStat.executeUpdate(); 26. 27. } الصيد (SQLException ه) 28. { 29. طرح RuntimeException الجديد ( 30. "خطأ في كتابة سجل دخول المستخدم"); 31. } أخيرا 32. { 33. حاول 34. { 35. إذا (كون ! = فارغة) 36. { 37.conn.Close(); 38. } 39. } الصيد (SQLException على سبيل المثال) 40. { 41.ex.printStackTrace(); 42. } 43. } 44. } 45. 46. قيمة الفراغ العام غير منضم (حدث HttpSessionBindingEvent) 47. { 48. اتصال conn = null; 49. String sqlStr = "تحديث مجموعة T_LOGIN_LOG DT_LONOUT = ؟" + 50. "أين USER_ID=؟ وDT_LOGIN =؟"; 51. حاول 52. { 53.conn = DBConnection.getConnection(); 54. PreparationStatement pStat = conn.prepareStatement(sqlStr); 55.pStat.setString(1, getCurrDatetimeStr()); 56.pStat.setString(2, userId); 57.pStat.setString(3,loginDatetime); 58.pStat.executeUpdate(); 59. 60. } الصيد (SQLException ه) 61. { 62. رمي RuntimeException الجديد ( 63. "خطأ في كتابة سجل خروج المستخدم"); 64. } أخيرا 65. { 66. حاول 67. { 68. إذا (كون ! = فارغة) 69. { 70.conn. Close(); 71. } 72. } الصيد (SQLException على سبيل المثال) 73. { 74.ex.printStackTrace(); 75. } 76. } 77. } 78. 79. // احصل على السلسلة الزمنية الحالية وأعدها بتنسيق yyyyMMddHHmmss، مثل 20050505010101 80. سلسلة ثابتة خاصة getCurrDatetimeStr() 81. { 82. نموذج SimpleDate عند sdf = نموذج SimpleDate الجديد at("yyyyMMddHHmmss"); 83. قم بإرجاع نموذج sdf إلى (new Date()); 84. } 85. } |
تقوم طريقة valueBound () بإدراج سجل تسجيل دخول في جدول T_LOGIN_LOG، وتقوم بتحديث وقت الخروج من جدول السجل في طريقة valueUnbound () بالإضافة إلى ذلك، توفر الأسطر من 80 إلى 84 طريقة getCurrDatetimeStr() للحصول على السلسلة الزمنية الحالية. يتم استخدام هذه الطريقة للحصول على تسجيل الدخول والسلسلة الزمنية لنقطة وقت الخروج.
فيما يلي وصف لكيفية قيام البرنامج بتسجيل وقت تسجيل الدخول والخروج للمستخدم من خلال وصف الخطوات التي يمر بها المستخدم حتى يقوم بتسجيل الخروج:
1. بعد أن يقوم المستخدم بإدخال كلمة المرور لتسجيل الدخول من خلال تسجيل الدخول.jsp، يقوم البرنامج بالتبديل إلى صفحة التحكم الخاصة بـ Switch.jsp.
2. في Switch.jsp، نقوم بربط كائن userBean من فئة User.java بالجلسة من خلال طريقة session.setAttribute("ses_userBean"، userBean).
3. في هذا الوقت، يتم استدعاء طريقة واجهة HttpSessionBindingListener valueBound() لكائن userBean ويتم إدراج سجل تسجيل الدخول في جدول T_LOGIN_LOG.
4. يقوم Switch.jsp بالتبديل إلى صفحة Welcome.jsp.
5. عندما ينقر المستخدم على الرابط الموجود في صفحة Welcome.jsp للخروج من النظام، تتم إعادة توجيهه إلى صفحة Quit.jsp.
6. يستدعي Quit.jsp طريقة session.invalidate()، ويتم مسح كائن userBean من الجلسة.
7. في هذا الوقت، يتم استدعاء طريقة valueUnbound () لأسلوب واجهة HttpSessionBindingListener لكائن userBean، ويتم تحديث وقت الخروج من السجل، وإغلاق نافذة المتصفح.
واجهة HttpSessionBindingListener هي واجهة الأحداث لحاوية الويب، ويتم استدعاؤها تلقائيًا عند حدوث حدث ما، وهي:
· واجهة ServletContextListener: واجهة معالجة الأحداث لبدء تشغيل حاوية الويب وتدميرها. تم تحديد طريقتين في الواجهة.
· واجهة ServletContextAttributeListener: واجهة معالجة الأحداث عندما تتغير سمات سياق الويب.
واجهة HttpSessionListener: واجهة معالجة الأحداث لإنشاء الجلسة وأحداث التدمير.
واجهة HttpSessionAttributeListener: واجهة معالجة الحدث لتغييرات كائن السمة في جلسة الجلسة. تشبه هذه الواجهة واجهة HttpSessionBindingListener التي استخدمناها سابقًا.
بالإضافة إلى ذلك، يتم توفير واجهتين أخريين لمعالجة الأحداث في J2EE1.4، وهما:
· واجهة ServletRequestListener: واجهة إنشاء كائن الطلب ومعالجة حدث التدمير.
·واجهة ServletRequestAttributeListener: واجهة معالجة الأحداث عند تغيير كائن السمة في الطلب.
نشر البرنامج
بعد اكتمال تطوير برنامج الويب، نبدأ العمل على نشر البرنامج ونأمل في نشر تطبيق الويب هذا على خادم تطبيقات الويب Tomcat5.0.
أولاً، نقوم بتعيين الصفحة الرئيسية الافتراضية لتطبيق الويب، ثم نقوم بتجميع برنامج الويب بالكامل في ملف أرشيف WAR.
1. قم بتعيين صفحة الوصول الافتراضية، وانقر نقرًا مزدوجًا فوق عقدة webModule في جزء المشروع، ويعرض JBuilder الصفحة التالية في جزء المحتوى:
الشكل 26 قم بتعيين الصفحة الافتراضية التي يصل إليها برنامج الويب
انقر فوق الزر "إضافة..." الموجود على الجانب الأيمن من قائمة ملفات الترحيب، وأدخل login.jsp في مربع الحوار المنبثق، ثم اضغط على الزر "موافق" لتعيين صفحة تسجيل الدخول.jsp كصفحة افتراضية ستتم إضافة النشر الغامق التالي إلى ملف وصف نشر web.xml:
قائمة التعليمات البرمجية 19 الصفحة الافتراضية لتطبيق الويب
1.…
2.<تطبيق الويب>
3. <اسم العرض> وحدة الويب>/اسم العرض>
4. <قائمة ملفات الترحيب>
5. <ملف الترحيب>login.jsp</ملف الترحيب>
6.</قائمة ملفات الترحيب>
7.…
8.</تطبيق الويب>
عندما لا يحدد المستخدم اسم ملف وصول محدد في عنوان URL، تتحقق حاوية الويب تلقائيًا مما إذا كان هناك ملف login.jsp ضمن URI، وإذا كان الأمر كذلك، فإنها تستدعي هذا الملف مباشرة.
2. انقر بزر الماوس الأيمن فوق عقدة webModule في شجرة الموارد في جزء المشروع، خصائص...->إنشاء->في لوحة إعدادات البناء، قم بتعيين أرشيف بناء الويب على خيار عند إنشاء مشروع أو وحدة نمطية، كما هو موضح في الشكل التالي:
الشكل 27 يضبط ملف أرشيف WAR الذي سيتم إنشاؤه عند إعادة بناء المشروع أو وحدة الويب
3. انقر بزر الماوس الأيمن فوق Chapter13.jpx في جزء المشروع وحدد Rebuild في القائمة المنبثقة لتجميع المشروع بأكمله.
4. بعد اكتمال التجميع، سيتم إنشاء ملف webModule.war في الدليل الجذر للمشروع.
5. انسخ ملف webModule.war إلى دليل <JBuilder2005 Installation Directory>/thirdparty/jakarta-tomcat-5.0.27/webapps.
يكتمل هذا نشر تطبيق الويب. بعد ذلك نبدأ خادم تطبيق الويب Tomcat 5.0 وندخل إلى تطبيق webModule.war الذي تم نشره للتو.
1. انقر نقرًا مزدوجًا فوق Startup.bat ضمن <JBuilder2005 Installation Directory>/thirdparty/jakarta-tomcat-5.0.27/bin لبدء تشغيل خادم تطبيقات الويب Tomcat 5.0 (يُرجى التأكد من عدم تشغيل أي تطبيق ويب في JBuilder في الوقت الحالي لتجنب التعارضات) .
2. افتح IE، واكتب http://localhost:8080/webModule، وستتمكن من الوصول بشكل صحيح إلى تطبيق الويب الذي تم نشره للتو، كما هو موضح في الشكل التالي:
الشكل 28: تأثير الوصول إلى ملف login.jsp بعد النشر
يعمل خادم Tomcat على المنفذ 8080 بشكل افتراضي، لذا تحتاج إلى إضافة رقم المنفذ بعد اسم الجهاز. يمكنك تغيير رقم المنفذ هذا عن طريق تغيير ملف تكوين Tomca server.xml الموجود في دليل conf.
نظرًا لأن ملف WAR الخاص بتطبيق الويب الخاص بنا يسمى webModule.war، بعد بدء تشغيل خادم الويب، سيتم فك ضغط ملف WAR تلقائيًا إلى دليل webModule، لذلك يجب الوصول إليه من خلال http://localhost:8080/webModule . بالإضافة إلى ذلك، نظرًا لأن صفحة الوصول الافتراضية هي login.jsp، فعندما لا يتم تحديد صفحة معينة، يتم استدعاء صفحة login.jsp.