1.RequestDispatcher.forward()
ทำงานบนฝั่งเซิร์ฟเวอร์ เมื่อใช้ forward() เอ็นจิ้น Servlet จะส่งคำขอ HTTP จาก Servlet หรือ JSP ปัจจุบันไปยัง Servlet, JSP หรือไฟล์ HTML ทั่วไป นั่นคือ แบบฟอร์มของคุณถูกส่งไปยัง a.jsp, forward() ใช้ใน a.jsp เพื่อเปลี่ยนเส้นทางไปยัง b.jsp ในขณะนี้ ข้อมูลทั้งหมดที่ส่งโดยแบบฟอร์มสามารถรับได้ใน b.jsp และพารามิเตอร์จะถูกส่งผ่านโดยอัตโนมัติ
อย่างไรก็ตาม การส่งต่อ() ไม่สามารถเปลี่ยนเส้นทางไปยังไฟล์ jsp ด้วยเฟรมได้ โดยสามารถเปลี่ยนเส้นทางไปยังไฟล์ html ด้วยเฟรมได้ ในเวลาเดียวกัน ไม่สามารถส่งผ่านด้วยพารามิเตอร์ต่อท้ายได้ เช่น servlet?name=frank หากวิธีนี้ใช้ไม่ได้ผล คุณสามารถส่งผ่านการตอบสนองในโปรแกรม .setAttribute("name",name) เพื่อส่งผ่านไปยังหน้าถัด
ไป
ได้
โดยทั่วไปเนื้อหาโค้ดจะใช้ในเซิร์ฟเล็ต ไม่ใช่ jsp
doPost โมฆะสาธารณะ (คำขอ HttpServletRequest, การตอบสนอง HttpServletResponse)
พ่น ServletException, IOException ...{
response.setContentType("ข้อความ/html; charset=gb2312");
ServletContext sc = getServletContext();
RequestDispatcher rd = null;
rd = sc.getRequestDispatcher("/index.jsp"); // กำกับหน้า
rd.forward (คำขอ, ตอบกลับ);
-
2.response.sendRedirect()
ใช้งานได้บนเบราว์เซอร์ของผู้ใช้ sendRedirect() สามารถส่งผ่านพารามิเตอร์ เช่น servlet?name=frank ไปยังหน้าถัดไปได้ ขณะเดียวกันก็สามารถเปลี่ยนเส้นทางไปยังโฮสต์อื่นได้ sendRedirect() สามารถเปลี่ยนเส้นทางเฟรมได้
หลังจากการเปลี่ยนเส้นทาง URL ของหน้าที่เปลี่ยนเส้นทางจะปรากฏบนแถบที่อยู่ของเบราว์เซอร์
ตัวอย่าง: เปลี่ยนเส้นทางในเซิร์ฟเล็ต
โค้ดเนื้อหา โมฆะ
สาธารณะ doPost(คำขอ HttpServletRequest, การตอบสนอง HttpServletResponse)
พ่น ServletException, IOException ...{
response.setContentType("text/html; charset=gb2312");
response.sendRedirect("/index.jsp")
;
เนื่องจากการตอบกลับเป็นอ็อบเจ็กต์โดยนัยในหน้า jsp จึงสามารถใช้ response.sendRedirect() เพื่อดำเนินการย้ายตำแหน่งในหน้า jsp ได้โดยตรง
หมายเหตุ:
(1) เมื่อใช้ response.sendRedirect จะไม่มีเอาต์พุต HTML อยู่ข้างหน้า
สิ่งนี้ไม่แน่นอน ไม่มีเอาต์พุต HTML หมายความว่าไม่สามารถส่ง HTML ไปยังเบราว์เซอร์ได้ ที่จริงแล้ว เซิร์ฟเวอร์ในปัจจุบันมีกลไกแคช ซึ่งโดยทั่วไปคือ 8K (ฉันหมายถึงเซิร์ฟเวอร์ JSP) ซึ่งหมายความว่า เว้นแต่คุณจะปิดแคช หรือใช้ out.flush() เพื่อบังคับให้รีเฟรช จากนั้นก่อนที่จะใช้ sendRedirect จะมีปริมาณเล็กน้อย ของเอาต์พุต HTML ก็ได้รับอนุญาตเช่นกัน
(2) หลังจาก .response.sendRedirect ควรตามด้วย return
เรารู้อยู่แล้วว่า response.sendRedirect ถูกเปลี่ยนเส้นทางผ่านเบราว์เซอร์ ดังนั้นจะไม่มีการดำเนินการจริงจนกว่าการประมวลผลเพจจะเสร็จสิ้น ตอนนี้คุณได้ทำพวงมาลัยแล้ว อะไรคือความสำคัญของผลลัพธ์สุดท้าย? และอาจเป็นไปได้ว่าการบังคับเลี้ยวล้มเหลวเนื่องจากเอาต์พุตที่ตามมา
เปรียบเทียบ:
(1).Request Dispatcher.forward() คือการเปลี่ยนเส้นทางของการควบคุมในคอนเทนเนอร์ และที่อยู่ที่ถูกเปลี่ยนเส้นทางจะไม่ปรากฏในแถบที่อยู่ของเบราว์เซอร์ไคลเอ็นต์
(2).response.sendRedirect() เป็นการข้ามที่สมบูรณ์ เบราว์เซอร์จะได้รับที่อยู่การกระโดดและส่งลิงก์คำขออีกครั้ง ด้วยวิธีนี้ ที่อยู่ลิงก์หลังจากการข้ามจะปรากฏในแถบที่อยู่ของเบราว์เซอร์
แบบแรกมีประสิทธิภาพมากกว่า เมื่อแบบแรกสามารถตอบสนองความต้องการได้ ให้ลองใช้เมธอด RequestDispatcher.forward()
หมายเหตุ: ในบางกรณี ตัวอย่างเช่น หากคุณต้องการข้ามไปยังทรัพยากรบนเซิร์ฟเวอร์อื่น คุณต้องใช้ วิธีการ HttpServletResponse.sendRequest()
3.
ส่วนที่อยู่ด้านล่างถูกนำมาใช้โดย RequestDispatcher ดังนั้นจึงมีรอยประทับของเมธอด RequestDispatcher.forward() หากมีเอาต์พุตจำนวนมากก่อน
หมายเหตุ: ไม่สามารถเปลี่ยนที่อยู่เบราว์เซอร์ได้ การรีเฟรชจะส่งผลให้มีการส่งซ้ำ
4. แก้ไขแอตทริบิวต์ตำแหน่งของส่วนหัว HTTP เพื่อเปลี่ยนเส้นทาง
เปลี่ยนเส้นทางเพจโดยการแก้ไขแถบที่อยู่โดยตรง
รหัสไฟล์ jsp เป็นดังนี้:
เนื้อหารหัส: 5. JSP ใช้การเปลี่ยนเส้นทางอัตโนมัติไปยังหน้าอื่นหลังจากอยู่ที่หน้าใดหน้าหนึ่งเป็นเวลาไม่กี่วินาที
ในไฟล์ html รหัสต่อไปนี้:
ความหมาย: หลังจากผ่านไป 5 นาที หน้าที่คุณกำลังดูจะเปลี่ยนเป็นหน้า target.html โดยอัตโนมัติ 300 ในโค้ดคือเวลาหน่วงการรีเฟรชในหน่วยวินาที target.html คือหน้าเป้าหมายที่คุณต้องการเปลี่ยนเส้นทางไป หากเป็นหน้านี้ ระบบจะรีเฟรชหน้านี้โดยอัตโนมัติ
ดังที่เห็นจากด้านบน คุณสามารถใช้ setHeader เพื่อเปลี่ยนเส้นทางไปยังหน้าอื่นโดยอัตโนมัติหลังจากอยู่บนหน้านั้นไม่กี่วินาที
รหัสกุญแจ:
เนื้อหาโค้ด
-
response.setStatus(HttpServletResponse.SC_MOVED_PERMANENTLY);
สตริง newLocn = "/newpath/jsa.jsp";
response.setHeader("ตำแหน่ง",newLocn);
-
เนื้อหาสตริง=stayTime+";URL="+URL;
response.setHeader("รีเฟรช",เนื้อหา);