1. ร้านหนังสือแพ็คเกจ 2. นำเข้า javax.servlet.http.HttpSessionBindingListener; 3. นำเข้า javax.servlet.http.HttpSessionBindingEvent; 4. นำเข้า java.sql.*; 5. นำเข้าแบบฟอร์ม java.text.SimpleDate ที่; 6. นำเข้า java.util.Date; 7. 8. ผู้ใช้คลาสสาธารณะใช้ HttpSessionBindingListener 9. { 10.… 11. สตริงส่วนตัว loginDatetime; // เวลาเข้าสู่ระบบของผู้ใช้ 12.… 13. public void valueBound(เหตุการณ์ HttpSessionBindingEvent) 14. { 15. การเชื่อมต่อการเชื่อมต่อ = 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. ReadyStatement pStat = conn.prepareStatement(sqlStr); 22. loginDatetime = getCurrDatetimeStr(); //สตริงเวลาปัจจุบัน 23. pStat.setString(1, รหัสผู้ใช้); 24. pStat.setString(2, วันที่เข้าสู่ระบบ); 25. pStat.executeUpdate(); 26. 27. } จับ (SQLException จ) 28. { 29. โยน RuntimeException ใหม่ ( 30. "เกิดข้อผิดพลาดในการเขียนบันทึกการเข้าสู่ระบบของผู้ใช้"); 31. } ในที่สุด 32. { 33. ลอง 34. { 35. ถ้า (conn != null) 36. { 37. conn.ปิด(); 38. } 39. } จับ (เช่น SQLException) 40. { 41. เช่นprintStackTrace(); 42. } 43. } 44. } 45. 46. public void valueUnbound(เหตุการณ์ HttpSessionBindingEvent) 47. { 48. การเชื่อมต่อการเชื่อมต่อ = null; 49. String sqlStr = " อัพเดต T_LOGIN_LOG ตั้ง DT_LONOUT = ? " + 50. "โดยที่ USER_ID=? และ DT_LOGIN = ?"; 51. ลอง 52. { 53. conn = DBConnection.getConnection(); 54. ReadyStatement pStat = conn.prepareStatement(sqlStr); 55. pStat.setString(1, getCurrDatetimeStr()); 56. pStat.setString(2, รหัสผู้ใช้); 57. pStat.setString(3, วันที่เข้าสู่ระบบ); 58. pStat.executeUpdate(); 59. 60. } จับ (SQLException จ) 61. { 62. โยน RuntimeException ใหม่ ( 63. "เกิดข้อผิดพลาดในการเขียนบันทึกการออกจากผู้ใช้"); 64. } ในที่สุด 65. { 66. ลอง 67. { 68. ถ้า (conn != null) 69. { 70. conn.ปิด(); 71. } 72. } จับ (เช่น SQLException) 73. { 74. เช่นprintStackTrace(); 75. } 76. } 77. } 78. 79. //รับสตริงเวลาปัจจุบันและส่งกลับในรูปแบบ yyyyMMddHHmmss เช่น 20050505010101 80. สตริงคงที่ส่วนตัว getCurrDatetimeStr() 81. { 82. รูปแบบ SimpleDate ที่ sdf = รูปแบบ SimpleDate ใหม่ที่ ("yyyyMMddHHmmss"); 83. ส่งคืนแบบฟอร์ม sdf. ที่ (new Date()); 84. } 85. } |
เมธอด valueBound() จะแทรกบันทึกการเข้าสู่ระบบลงในตาราง T_LOGIN_LOG และอัปเดตเวลาออกของตารางบันทึกในเมธอด valueUnbound() นอกจากนี้ บรรทัดที่ 80 ถึง 84 ยังมีเมธอด getCurrDatetimeStr() เพื่อรับสตริงเวลาปัจจุบัน วิธีการนี้ใช้เพื่อรับการเข้าสู่ระบบและสตริงเวลาของจุดเวลาออก
ข้อมูลต่อไปนี้จะอธิบายวิธีที่โปรแกรมบันทึกเวลาเข้าสู่ระบบและออกจากระบบของผู้ใช้โดยอธิบายขั้นตอนที่ผู้ใช้ดำเนินการจนกว่าจะออกจากระบบ:
1. หลังจากที่ผู้ใช้ป้อนรหัสผ่านเพื่อเข้าสู่ระบบผ่าน login.jsp โปรแกรมจะสลับไปที่หน้าควบคุม switch.jsp
2. ใน switch.jsp เราผูกอ็อบเจ็กต์ userBean ของคลาส User.java กับเซสชันผ่านเมธอด session.setAttribute("ses_userBean", userBean)
3. ในขณะนี้ มีการเรียกเมธอดอินเทอร์เฟซ HttpSessionBindingListener valueBound() ของอ็อบเจ็กต์ userBean และบันทึกการเข้าสู่ระบบจะถูกแทรกลงในตาราง T_LOGIN_LOG
4. switch.jsp สลับไปที่หน้ายินดีต้อนรับ 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 ในกล่องโต้ตอบป๊อปอัป และกดปุ่ม OK เพื่อตั้งค่าหน้า Login.jsp เป็นหน้าเริ่มต้น ด้วยวิธีนี้ การปรับใช้ตัวหนาต่อไปนี้จะถูกเพิ่มลงในไฟล์คำอธิบายการใช้งาน web.xml:
รายการรหัส 19 หน้าเริ่มต้นของแอปพลิเคชันเว็บ
1.…
2. <เว็บแอป>
3. <ชื่อที่แสดง><เว็บโมดูล<//ชื่อที่แสดง>
4. <รายการไฟล์ต้อนรับ>
5. <ยินดีต้อนรับ-ไฟล์">login.jsp </ยินดีต้อนรับ-ไฟล์>
6. </welcome-file-list>
7.…
8. </เว็บแอป>
เมื่อผู้ใช้ไม่ได้ระบุชื่อไฟล์การเข้าถึงที่เฉพาะเจาะจงใน URL เว็บคอนเทนเนอร์จะตรวจสอบโดยอัตโนมัติว่ามีไฟล์ login.jsp อยู่ภายใต้ URI หรือไม่ และหากมี ให้เรียกไฟล์นี้โดยตรง
2. คลิกขวาที่โหนด webModule ในแผนผังรีซอร์สในบานหน้าต่างโปรเจ็กต์ Properties...->Build->ในพาเนลการตั้งค่า Build ตั้งค่า Build Web archive เป็นตัวเลือกเมื่อสร้างโปรเจ็กต์หรือโมดูล ดังแสดงในรูปต่อไปนี้:
รูปที่ 27 ตั้งค่าไฟล์เก็บถาวร WAR ที่จะสร้างเมื่อสร้างโครงการหรือเว็บโมดูลใหม่
3. คลิกขวาที่ Chapter13.jpx ในบานหน้าต่างโปรเจ็กต์ และเลือกสร้างใหม่ในเมนูป๊อปอัปเพื่อคอมไพล์ทั้งโปรเจ็กต์
4. หลังจากการคอมไพล์เสร็จสิ้น ไฟล์ webModule.war จะถูกสร้างขึ้นในไดเร็กทอรีรากของโปรเจ็กต์
5. คัดลอกไฟล์ webModule.war ไปยังไดเร็กทอรี <JBuilder2005 การติดตั้ง>/thirdparty/jakarta-tomcat-5.0.27/webapps
การดำเนินการปรับใช้เว็บแอปพลิเคชันเสร็จสมบูรณ์ ต่อไป เราจะเริ่มเซิร์ฟเวอร์แอปพลิเคชันเว็บ Tomcat 5.0 และเข้าถึงแอปพลิเคชัน webModule.war ที่เพิ่งปรับใช้
1. ดับเบิลคลิก startup.bat ภายใต้ <ไดเรกทอรีการติดตั้ง JBuilder2005>/thirdparty/jakarta-tomcat-5.0.27/bin เพื่อเริ่มเซิร์ฟเวอร์แอปพลิเคชันเว็บ Tomcat 5.0 (โปรดตรวจสอบให้แน่ใจว่าไม่มีแอปพลิเคชันเว็บใดทำงานใน JBuilder ในขณะนี้เพื่อหลีกเลี่ยงข้อขัดแย้ง) .
2. เปิด IE พิมพ์ http://localhost:8080/webModule และคุณจะเข้าถึงเว็บแอปพลิเคชันที่เพิ่งปรับใช้ได้อย่างถูกต้อง ดังแสดงในรูปต่อไปนี้:
รูปที่ 28 ผลการเข้าถึงของ login.jsp หลังจากการปรับใช้
เซิร์ฟเวอร์ Tomcat ทำงานบนพอร์ต 8080 ตามค่าเริ่มต้น ดังนั้นคุณต้องเพิ่มหมายเลขพอร์ตหลังชื่อเครื่อง คุณสามารถเปลี่ยนหมายเลขพอร์ตนี้ได้โดยการเปลี่ยนไฟล์การกำหนดค่า server.xml ของ Tomca ที่อยู่ในไดเร็กทอรี conf
เนื่องจากไฟล์ WAR ของเว็บแอปพลิเคชันของเราชื่อ webModule.war หลังจากที่เว็บเซิร์ฟเวอร์เริ่มทำงาน ไฟล์ WAR จะถูกแตกไฟล์ไปยังไดเร็กทอรี webModule โดยอัตโนมัติ ดังนั้นจึงต้องเข้าถึงผ่าน http://localhost:8080/webModule นอกจากนี้ เนื่องจากเพจการเข้าถึงดีฟอลต์คือ login.jsp เมื่อไม่ได้ระบุเพจใดเพจใดโดยเฉพาะ เพจล็อกอิน.jsp จึงถูกเรียก