JBuilder2005 การควบคุมการสลับ JSP จริง (3)
ผู้เขียน:Eve Cole
เวลาอัปเดต:2009-07-02 17:10:13
เนื่องจาก switch.jsp ถูกระบุเป็นไฟล์ JSP ตอบสนองผ่านแอ็ตทริบิวต์การดำเนินการในแบบฟอร์ม login.jsp เมื่อผู้ใช้เลือกผู้ใช้ที่เข้าสู่ระบบใน login.jsp และป้อนรหัสผ่านเพื่อส่งแบบฟอร์ม ลูกค้าจะส่งคำขอ HTTP ไปที่ เซิร์ฟเวอร์และเซิร์ฟเวอร์ นั่นคือ เรียก switch.jsp เพื่อตอบสนองต่อคำขอนี้
ข้อมูลของส่วนประกอบชื่อผู้ใช้และรหัสผ่านในรูปแบบจะถูกส่งผ่านไปยัง switch.jsp ของเซิร์ฟเวอร์ผ่านการร้องขอ HTTP เซิร์ฟเวอร์จะห่อหุ้มข้อมูลนี้ไว้ในออบเจ็กต์คำขอและส่งผ่านไปยัง switch.jsp เพื่อให้สามารถดึงข้อมูล switch.jsp ได้ ผ่าน request.getParameter(String paraName) รับสองค่านี้
สตริง userId = request.getParameter("userId"); รหัสผ่านสตริง = request.getParameter("รหัสผ่าน"); |
ลองนึกภาพว่ารูปแบบของ Login.jsp มีส่วนประกอบข้อมูลมากกว่า 10 รายการ ค่าของมันจะต้องได้รับผ่านจำนวนเมธอด request.getParameter() ใน switch.jsp ที่สอดคล้องกัน นอกจากนี้ หากข้อมูลไม่ใช่ประเภทสตริงของฟิลด์ แต่เป็นจำนวนเต็มหรือจำนวนจุดลอยตัว เนื่องจากค่าที่ส่งคืนโดยเมธอด request.getParameter() นั้นเป็นสตริงทั้งหมด จึงต้องดำเนินการแปลงประเภทนี้ไม่เพียงเท่านั้น น่าเบื่อ แต่ก็เกิดข้อผิดพลาดได้ง่ายเช่นกัน
JSP อนุญาตให้คุณรับข้อมูลฟอร์มเว็บผ่าน Bean ในลักษณะการแมป Bean แมปข้อมูลฟอร์มตามกฎนี้: ชื่อแอตทริบิวต์ Bean = ชื่อส่วนประกอบข้อมูลแบบฟอร์ม กล่าวคือ ฟิลด์ข้อมูลแบบฟอร์มทั้งหมดที่มีชื่อแอตทริบิวต์ Bean เดียวกันจะถูกกรอกโดยอัตโนมัติ Bean และทำการแปลงชนิดข้อมูลให้เสร็จสิ้น ตัวอย่างเช่น มีองค์ประกอบข้อมูลสองรายการในรูปแบบ Login.jsp องค์ประกอบหนึ่งชื่อ userId และอีกองค์ประกอบหนึ่งคือรหัสผ่าน กำหนด User.java Bean ด้วยชื่อเดียวกันของแอตทริบิวต์ userId และรหัสผ่าน Bean นี้จะรับองค์ประกอบข้อมูลทั้งสองโดยอัตโนมัติ ในรูปแบบค่าองค์ประกอบข้อมูล
เขียน User.java
ขั้นแรกเรามาเขียน User.java Bean และสร้าง User.java ในโปรเจ็กต์กันก่อน โดยมีโค้ดดังนี้:
รายการรหัส 7 User.java
1. ร้านหนังสือแพ็คเกจ 2. 3. ผู้ใช้คลาสสาธารณะ 4. { 5. สตริงส่วนตัว userId;//userId 6. รหัสผ่านสตริงส่วนตัว;//รหัสผ่าน 7. ชื่อผู้ใช้สตริงส่วนตัว;//ชื่อผู้ใช้ 8. สตริงสาธารณะ getPassword() { 9. ส่งคืนรหัสผ่าน; 10. } 11. สตริงสาธารณะ getUserId() { 12. ส่งคืนรหัสผู้ใช้; 13. } 14. สตริงสาธารณะ getUserName() { 15. ส่งคืนชื่อผู้ใช้; 16. } 17. setPassword เป็นโมฆะสาธารณะ (รหัสผ่านสตริง) { 18. this.password = รหัสผ่าน; 19. } 20. setUserId เป็นโมฆะสาธารณะ (รหัสผู้ใช้สตริง) { 21. this.userId = รหัสผู้ใช้; ยี่สิบสอง } 23. setUserName เป็นโมฆะสาธารณะ (ชื่อผู้ใช้สตริง) { 24. this.userName = ชื่อผู้ใช้; 25. } 26. } |
นอกจากชื่อแอตทริบิวต์สองชื่อ userId และรหัสผ่านแล้ว ยังมีแอตทริบิวต์ชื่อผู้ใช้ userName อีกด้วย ค่าของแอตทริบิวต์นี้จะไม่ได้รับจากแบบฟอร์ม Login.jsp เมื่อมีการตรวจสอบชื่อผู้ใช้และรหัสผ่านอย่างถูกต้อง ชื่อผู้ใช้จะได้รับจากข้อมูล ตาราง T_USER และเก็บไว้ในคุณสมบัตินี้เพื่อให้สามารถอ้างอิงที่อื่นบันทึกและคอมไพล์คลาสนี้
คำใบ้:
คุณสามารถสร้างโค้ด User.java ได้อย่างรวดเร็วผ่านเครื่องมือ Bean Express ของ JBuilder ภายใต้สถานการณ์ปกติ คุณควรสร้างคุณสมบัติ Bean ผ่าน Bean Express ซึ่งไม่เพียงสร้างวิธีการเข้าถึงคุณสมบัติ get/set โดยอัตโนมัติ แต่ยังรับประกันหลักเกณฑ์การตั้งชื่อ Bean ด้วย |
เขียนโปรแกรมเพจ
หลังจากสร้าง Bean ของ User.java แล้ว เราจะดำเนินการสร้าง switch.jsp และอ้างอิง Bean นี้ใน switch.jsp
เริ่มต้นวิซาร์ดสร้าง JSP ผ่าน File->New..->Web->ดับเบิลคลิกที่ไอคอน JSP
1. ระบุชื่อ switch.jsp
รูปที่ 10 ระบุชื่อของ switch.jsp |
กด Next ต่อไปเพื่อไปที่ขั้นตอนที่ 3 ของวิซาร์ด
2. ข้อมูลอ้างอิง User.java Bean
รูปที่ 11 ระบุ Bean ที่อ้างอิงใน JSP |
คลิกปุ่ม Add Bean... เพื่อเปิดกล่องโต้ตอบ Select a Class เลือกคลาสร้านหนังสือผู้ใช้ในกล่องโต้ตอบ ดังแสดงในรูปต่อไปนี้:
รูปที่ 12 เลือกคลาสเป็น Bean |
หลังจากกดตกลง ให้กลับไปที่กล่องโต้ตอบในขั้นตอนที่ 3 ของตัวช่วยสร้าง ในขณะนี้ มีแถวของระเบียนเพิ่มเติมในรายการ Bean ของกล่องโต้ตอบ คุณสามารถระบุชื่อสำหรับ Bean ในคอลัมน์ ID และระบุได้ ขอบเขตของ Bean ในขอบเขต ดังแสดงในรูปด้านล่าง แสดง:
รูปที่ 13 อ้างอิงถึงถั่ว |
เราตั้งชื่อ User's Bean userBean และกำหนดขอบเขตเป็นโดเมนเพจ โดเมนเพจคือขอบเขตของเพจและพร้อมใช้งานภายในขอบเขตของเพจปัจจุบัน เมื่อ JSP ส่งคืนการตอบกลับหรือคำขอถูกโอนไปยังเพจ JSP อื่น ขอบเขตที่เหลืออีกสามรายการจะอธิบายไว้ดังนี้:
·ขอบเขตคำขอ: เมื่อมีการสร้างคำขอ จะมีผลใช้ได้ภายในขอบเขตจนกว่าการตอบกลับจะถูกส่งกลับ ตัวอย่างเช่น Bean ประกาศเป็นขอบเขตคำขอใน a.jsp เมื่อ a.jsp ถ่ายโอนคำขอไปยังหน้า b.jsp ผ่าน <jsp:forward> ยังมีวางจำหน่ายกลางปีครับ
·ขอบเขตเซสชัน: สามารถใช้ได้ภายในวงจรของเซสชันผู้ใช้ วงจรเซสชันมาจากเมื่อผู้ใช้เข้าสู่ระบบจนกว่าผู้ใช้จะออกจากระบบ
·ขอบเขตแอปพลิเคชัน: ขอบเขตนี้ยาวที่สุด ซึ่งบ่งชี้ว่าเว็บคอนเทนเนอร์นั้นใช้ได้จนกว่าจะเริ่มต้นจนกว่าจะปิด
กด Next เพื่อไปยังขั้นตอนถัดไป
3. ตั้งค่ารายการการกำหนดค่าที่ทำงานอยู่
ในขั้นตอนสุดท้ายของวิซาร์ด คุณสามารถสร้างรายการการกำหนดค่ารันไทม์สำหรับ JSP ที่สร้างขึ้นได้ แม้ว่าตัวช่วยสร้างจะตั้งค่ารายการการกำหนดค่ารันไทม์เป็นตัวเลือกเริ่มต้น แต่ฉันคิดว่านี่ไม่ใช่ค่าเริ่มต้นที่สมเหตุสมผล ขอแนะนำให้ยกเลิก สร้างรายการการตั้งค่าคอนฟิกูเรชันรันไทม์ อย่าสร้างรายการคอนฟิกูเรชันการรัน JSP ดังแสดงในรูปต่อไปนี้:
กดปุ่ม Finish เพื่อสร้างไฟล์ switch.jsp ด้วยโค้ดต่อไปนี้:
รายการรหัส 8 switch.jsp ที่สร้างโดยวิซาร์ด
1. <%@ หน้า contentType="text/html; charset=GBK" %>< 2. <html> 3. <หัว>< 4. <หัวข้อ>< 5.สวิตช์ 6. </หัวข้อ>< 7. </หัว>< 8. <jsp:useBean id="userBean" scope="page" class="bookstore.User" /> 9. <jsp:setProperty name="userBean" property="*" /> 10. <body bgcolor="#ffffff"> 11. <h1>< 12. JBuilder สร้าง JSP 13. </h1>< 14. </ตัว>< 15. </html> |
บรรทัดที่ 8 คือแท็ก JSP ที่อ้างอิงถึง Bean บรรทัดที่ 9 เติมค่าแอตทริบิวต์ของ Bean ด้วยข้อมูลแบบฟอร์ม นั่นคือ เติมพารามิเตอร์คำขอลงในแอตทริบิวต์ของ Bean ด้วยการจับคู่ชื่อ และทำการแปลงประเภทให้เสร็จสมบูรณ์ในเวลาเดียวกัน (เฉพาะ ประเภทข้อมูลพื้นฐานหรือการแปลงจะเสร็จสมบูรณ์ได้ก็ต่อเมื่อตัวสร้างรองรับ) หลังจากดำเนินการบรรทัดที่ 9 แอตทริบิวต์ userId และรหัสผ่านใน userBean จะถูกตั้งค่าเป็นชื่อผู้ใช้และรหัสผ่านที่ส่งในหน้า login.jsp
เนื่องจาก switch.jsp ใช้สำหรับการควบคุมเท่านั้น และไม่จำเป็นต้องแสดงเนื้อหาไปยังไคลเอนต์ เราจึงลบโค้ด HTML ใน switch.jsp และปรับ switch.jsp เป็น:
รายการรหัส 9 switch.jsp หลังจากลบโค้ด HTML แบบคงที่
1. <%@ หน้า contentType="text/html; charset=GBK" %>< 2. <jsp:useBean id="userBean" scope="page" class="bookstore.User" /> 3. <jsp:setProperty name="userBean" property="*" /> |
จัดเตรียม Scriptlet ใน switch.jsp เพื่อส่งรหัสผู้ใช้และรหัสผ่านไปยังฐานข้อมูล และเปรียบเทียบกับผู้ใช้ในตาราง T_USER เพื่อดูว่าพวกเขาเป็นผู้ใช้ที่ถูกต้องหรือไม่ และเปลี่ยนเส้นทางไปยังหน้าต่างๆ ตามผลการตรวจสอบ รหัสสุดท้ายของ switch.jsp มีลักษณะดังนี้:
รายการรหัส 10 สุดท้าย switch.jsp
1. <%@page contentType="text/html; charset=GBK"%> 2. <%@page import="ร้านหนังสือ.*"%> 3. <%@page import="java.sql.*"%> 4. <jsp:useBean id="userBean" scope="session" class="bookstore.User"/> 5. <jsp:setProperty name="userBean" property="*"/> 6.<% 7. การเชื่อมต่อการเชื่อมต่อ = null; 8. ลอง { 9. conn = DBConnection.getConnection(); 10. ReadyStatement pStat = conn.prepareStatement( 11. "เลือก USER_NAME จาก T_USER โดยที่ USER_ID=? และรหัสผ่าน = ?"); 12. pStat.setString(1, userBean.getUserId()); 13. pStat.setString(2, userBean.getPassword()); 14. ResultSet rs = pStat.executeQuery(); 15. if (rs.next()) { //รหัสผ่านถูกต้อง 16. userBean.setUserName(rs.getString(1));//ตั้งชื่อผู้ใช้ 17. session.setAttribute("ses_userBean", userBean);//ใส่ userBean ลงในวัตถุ Session 18. %><jsp:forward page="welcome.jsp "></jsp:forward> 19. <%} else { //รหัสผ่านผิด%>< 20. <jsp:forward page="fail.jsp""></jsp:forward"> 21.<% 22. }} ในที่สุด { 23. if(conn != null) conn.close(); ยี่สิบสี่ } 25. %> |
·แนะนำคลาสที่จำเป็นในโค้ด Scriptlet ในบรรทัดที่ 2 ถึง 3
·บรรทัดที่ 7 ถึง 14 ของโค้ดจะส่งคำสั่ง SQL สำหรับการสืบค้นไปยังฐานข้อมูลและส่งกลับผลลัพธ์
·บรรทัด 15 กำหนดทางอ้อมว่ารหัสผ่านผู้ใช้ถูกต้องหรือไม่ โดยการตรวจสอบจำนวนบันทึกในชุดผลลัพธ์
· บรรทัดที่ 16 ถึง 18 เป็นรหัสตอบกลับสำหรับรหัสผ่านผู้ใช้ที่ถูกต้อง ขั้นแรก กรอกค่าแอตทริบิวต์ชื่อผู้ใช้ของ userBean ด้วยแอตทริบิวต์ USER_NAME ของชุดผลลัพธ์ จากนั้นใส่อ็อบเจ็กต์ userBean ลงในเซสชัน และสุดท้ายจึงเปิดไปที่หน้ายินดีต้อนรับ jsp
·เมื่อผู้ใช้ป้อนรหัสผ่านไม่ถูกต้อง จะไม่มีการบันทึกในชุดผลลัพธ์ ในขณะนี้ rs.next() คืนค่าเท็จ และโปรแกรมจะย้ายไปที่บรรทัด 20 โค้ดในบรรทัด 20 เปลี่ยนเส้นทางหน้าไปยังตำแหน่งที่ไม่ถูกต้อง หน้าการประมวลผลการป้อนรหัสผ่าน failed.jsp
·รหัสในบรรทัดที่ 22 ถึง 24 ใช้เพื่อปิดการเชื่อมต่อฐานข้อมูล
บางทีคุณอาจค้นพบว่าถึงแม้บรรทัดที่ 9~21 จะส่ง SQLException แต่เราไม่มีข้อยกเว้นที่สอดคล้องกัน ในโปรแกรม Java มาตรฐาน จะทำให้เกิดข้อผิดพลาดในการคอมไพล์ แต่ใน JSP สามารถคอมไพล์ตามลำดับนี้ได้ เป็นเพราะเพจ JSP เองจับข้อยกเว้นทั้งหมดที่เกิดขึ้นในเพจ
สมมติว่ามีข้อผิดพลาดในคำสั่งการสืบค้น SQL บนบรรทัดที่ 11 เช่นชื่อตารางผู้ใช้ถูกเขียนผิดพลาดเป็นผู้ใช้ (ถูกต้อง T_USER) เมื่อเรียกใช้ switch.jsp SQLException จะถูกส่งไปที่บรรทัด 14 และสลับ jsp จะแสดงหน้าข้อมูลการติดตามของการติดตามสแต็กข้อยกเว้นดังที่แสดงด้านล่าง:
รูปที่ 14 หน้าการจัดการข้อผิดพลาดร้ายแรง |
หน้าการจัดการข้อผิดพลาดที่แสดงในภาพด้านบนสามารถอธิบายได้ว่าหน้าเขียว ดุร้าย และไม่เป็นมิตรมาก หน้าการรายงานข้อผิดพลาดประเภทนี้อาจเหมาะสำหรับนักพัฒนาเนื่องจากมีข้อมูลการติดตามข้อผิดพลาดจำนวนมาก แต่เป็นไปไม่ได้ที่จะยุติ ผู้ใช้ที่จะยอมรับหน้าข้อผิดพลาดประเภทนี้ JSP อนุญาตให้คุณระบุเพจ JSP โดยเฉพาะสำหรับการจัดการข้อผิดพลาดผ่าน <%@ เพจ errorPage%> เพื่อให้สามารถแสดงข้อผิดพลาดในรูปแบบที่เป็นมิตรและใช้งานง่าย ในส่วนถัดไป เราจะสร้างเพจ JSP สำหรับการจัดการข้อผิดพลาด หลังจากสร้างแล้ว เราจะระบุเพจการจัดการข้อผิดพลาด JSP สำหรับ switch.jsp