เราทุกคนรู้ดีว่าการรวมใน jsp มีสองรูปแบบ กล่าวคือ
<%@ รวมไฟล์ =” ”%>
<jsp:รวมหน้า=” ”flush=”true”/></P>
แบบแรกเป็นองค์ประกอบการสอน และแบบหลังเป็นองค์ประกอบด้านพฤติกรรม พวกเขาจะนำไปใช้ที่ไหนกันแน่? วิธีการใช้งานและความแตกต่างคืออะไร? นี่น่าจะเป็นคำถามที่หลายๆ คนจะนึกถึงเมื่อเห็นสิ่งนี้ ลองมาดูด้านล่าง. </ป>
โดยปกติเมื่อบางส่วนของหน้าทั้งหมดในแอปพลิเคชัน (เช่น ชื่อเรื่อง ส่วนท้าย และแถบนำทาง) เหมือนกัน เราสามารถพิจารณาใช้การรวมได้ โดยเฉพาะเมื่อใดควรใช้ <%@ include file=""%> และเมื่อใดควรใช้ <jsp:include page="" flush="true"/> แบบฟอร์มนี้ สิ่งแรกที่ต้องเข้าใจคือความแตกต่างระหว่างพวกเขา เมื่อคุณเข้าใจถึงความแตกต่างในการใช้งานเท่านั้น คุณจึงจะเข้าใจได้ว่าควรใช้เมื่อใดและควรเลือกอย่างไร
<%@ include file=" ”%> องค์ประกอบคำสั่ง jsp include อ่านเนื้อหาของเพจที่ระบุ และรวมเนื้อหาเหล่านี้เข้ากับหน้าเดิม (กระบวนการนี้ดำเนินการในระหว่างขั้นตอนการแปล: นั่นคือขั้นตอนที่ jsp ถูกแปลงเป็นเซิร์ฟเล็ต</P>
นี่คือคำอธิบายของขั้นตอนการแปล: เรารู้ว่าหน้า jsp ไม่สามารถส่งไปยังเบราว์เซอร์ได้เหมือนเดิม และองค์ประกอบ jsp ทั้งหมดจะต้องได้รับการประมวลผลโดยเซิร์ฟเวอร์ก่อน ซึ่งทำได้โดยการแปลงเพจ jsp เป็นเซิร์ฟเล็ต จากนั้นจึงดำเนินการเซิร์ฟเล็ต เซิร์ฟเวอร์ต้องการคอนเทนเนอร์ jsp เพื่อประมวลผลหน้า jsp โดยปกติแล้ว คอนเทนเนอร์ jsp จะถูกนำไปใช้ในรูปแบบของเซิร์ฟเล็ต เซิร์ฟเล็ตนี้ได้รับการกำหนดค่าให้จัดการคำขอทั้งหมดสำหรับเพจ jsp </ป>
คอนเทนเนอร์ Jsp มีหน้าที่ในการแปลงเพจ jsp ให้เป็นเซิร์ฟเล็ต (เรียกว่าคลาสการใช้งานเพจ jsp? คลาสการใช้งานเพจ JSP) และคอมไพล์เซิร์ฟเล็ตนี้ สองขั้นตอนนี้ประกอบขึ้นเป็นขั้นตอนการแปล</P>
จากนี้เราจะรู้ว่า: หน้า jsp เพิ่มเนื้อหาจริง (นั่นคือข้อมูลโค้ด) ของหน้าที่ระบุโดยองค์ประกอบคำสั่งรวมไปยังหน้า jsp ที่แนะนำมัน หลังจากถูกสังเคราะห์เป็นไฟล์แล้ว มันจะถูกแปลงเป็น a servlet โดยคอนเทนเนอร์ jsp คุณจะเห็นว่าไฟล์คลาสชั่วคราวและไฟล์ java จะถูกสร้างขึ้นในเวลานี้ นี่คือตัวอย่าง </ป>
เซิร์ฟเวอร์ใช้ Tomcat และไฟล์ jsp ที่นำมาใช้ในเพจเรียกว่า test.jsp หน้าที่นำเข้าเรียกว่า date.jsp ไฟล์ jsp นี้เก็บโค้ด jsp ที่เกี่ยวข้องกับเวลา และรูทบริบทปัจจุบันได้รับการตั้งค่าให้ทดสอบ
//======ไฟล์ต้นฉบับของ date.jsp======//
<%@ ภาษาเพจ = "java" contentType="text/html;charset=gb2312"%>
-
java.util.Date date=ใหม่ java.util.Date();
สตริง date_cn = "";
สตริง dateStr = "";
สวิตช์ (date.getDay())
-
กรณีที่ 0:date_cn = "วัน";
กรณีที่ 1:date_cn = "一";
กรณีที่ 2:date_cn = "二";
กรณีที่ 3:date_cn = "三";
กรณีที่ 4:date_cn = "四";
กรณีที่ 5:date_cn = "五";
กรณีที่ 6:date_cn = "六";
-
dateStr = (1900+date.getYear()) + "ปี" + (date.getMonth()+1) + "เดือน" + date.getDate() + "วัน (วันธรรมดา) + date_cn + ")";
-
document.write("<%=dateStr%>");
//======ต่อไปนี้เป็นไฟล์ต้นฉบับของ test.jsp=============//
<%@ ภาษาหน้า =”java” contentType=”text/html;charset=gb2312”%>
<html>
<หัว>
<title>การใช้สองอย่างของ include</title>
<jsp:include page=”date.jsp” flush=”true”/>
<%--@ รวมไฟล์=”date.jsp” %-->
//เราใช้รูปแบบที่แตกต่างกันสองรูปแบบที่นี่เพื่อแนะนำไฟล์ date.jsp
<หัว>
<ร่างกาย>
<ตาราง><tr><td>
โปรดใส่ใจกับการใช้งานทั้งสองแบบของ include ใน jsp
</td></tr></table>
</ร่างกาย>
</html></P>
ในไฟล์ test.jsp เราจะแสดงเฉพาะบรรทัดข้อความ "เกี่ยวกับการใช้สองรายการของ include ใน jsp โปรดทราบ" ขั้นแรกให้เราใช้แบบฟอร์ม <%@ include file="date.jsp" %> Introduce the ไฟล์ date.jsp คุณคิดว่ามีบางอย่างผิดพลาดหรือไม่? ข้อความแสดงข้อผิดพลาดปรากฏขึ้นในขณะนี้:
สถานะ HTTP 500?
org.apache.jasper.JasperException: /date.jsp(0,0) คำสั่งหน้า: ไม่สามารถมี contentType ได้หลายครั้ง
มีข้อผิดพลาดมากมายด้านล่าง แต่เราเพียงต้องดูสิ่งนี้เพื่อดูว่าปัญหาอยู่ที่ใด รหัสสถานะคือ http 500 Server Internal Error ลองดูคำแนะนำด้านล่างอีกครั้ง ไม่สามารถระบุประเภทเนื้อหาหลายประเภทในหน้า date.jsp ได้</P>
นี่คือเหตุผล เนื่องจากในระหว่างขั้นตอนการแปล โค้ดของไฟล์ date.jsp จะถูกเพิ่มไปยังเพจ test.jsp เหมือนเดิมเพื่อสังเคราะห์ไฟล์ ไฟล์สังเคราะห์จะเหมือนกัน:
<%@ ภาษาหน้า =”java” contentType=”text/html;charset=gb2312”%>
รหัสนี้. วิธีแก้ไขคือการลบประโยคนี้ในไฟล์ date.jsp รีเฟรชแล้วขอหน้า test.jsp</P>
คำขอ test.jsp จะแสดงบนเพจดังนี้
10 ธันวาคม 2546 13:12:40 น
โปรดใส่ใจกับการใช้งานทั้งสองแบบของ include ใน jsp </ป>
เรายังไม่พบสิ่งใดเลย มาตรวจสอบไฟล์ชั่วคราวภายใต้ Tomcat กัน ไปที่นั่นและดูว่าเนื้อหาของไฟล์ date.jsp ถูกเพิ่มลงในไฟล์ test.jsp หรือไม่
<หมายเหตุ Tomcat ที่นี่ได้รับการติดตั้งในไดเร็กทอรีรากของไดรฟ์ E>
สารบัญ
E:tomcatworkStandalonelocalhosttest.
ในไดเร็กทอรีนี้คุณจะเห็น
มีสองไฟล์ test_jsp.java และ test_jsp.class </ป>
ไฟล์ java ที่นี่คือไฟล์ test_jsp.java ที่ได้รับจากการแปลง jsp เป็นเซิร์ฟเล็ตโดยคอนเทนเนอร์ jsp </ป>
ไฟล์ test_jsp.class ที่สอดคล้องกันคือไฟล์คลาสที่สร้างขึ้นโดยการคอมไพล์ไฟล์เซิร์ฟเล็ต test_jsp.java เปิดไฟล์เซิร์ฟเล็ตที่สร้างขึ้น (test_jsp.java) ณ จุดนี้ เราจะพบว่าเมื่อไฟล์ test.jsp ถูกแปลงเป็นไฟล์เซิร์ฟเล็ต โค้ดบางส่วนที่ไม่อยู่ในหน้า test.jsp จะถูกเพิ่มระหว่างเอาต์พุต <haed> เนื้อหาที่เพิ่มใหม่คือโค้ดในวันที่ jsp: โปรดทดสอบและดูว่ามีการเพิ่มเนื้อหาใหม่อะไรบ้างหรือว่ามีการเพิ่มเนื้อหาใหม่จริงๆ หรือไม่ โดยสรุปจะไม่ลงรายละเอียดที่นี่</P>
ข้างต้นคือผลลัพธ์ที่เราได้รับโดยใช้แบบฟอร์ม <%@ include file="date.jsp"%>
ต่อไป เราใช้ <jsp:include page="dae.jsp" flush="true"/> นั่นก็คือ
แทนที่ <%@ include file="date.jsp"%> ด้วย <jsp:include page="dae.jsp" flush="true"/> จากนั้นจึงขอ test.jsp
2546? 12??10?? 13:30:13
โปรดใส่ใจกับการใช้งานทั้งสองแบบของ include ใน jsp </ป>
ในเวลานี้ คุณจะเห็นว่าอักขระภาษาจีนในเอาต์พุตวันที่ตาม date.jsp ที่เราแนะนำนั้นอ่านไม่ออก สาเหตุคืออะไร เป็นเพราะองค์ประกอบพฤติกรรมรวมถูกดำเนินการในระหว่างขั้นตอนการประมวลผลคำขอ (ในที่นี้เรา จำเป็นต้องอธิบายขั้นตอนการประมวลผลคำขอ นอกเหนือจากการรับผิดชอบในการแปลงเพจ jsp เป็นเซิร์ฟเล็ตตามที่กล่าวไว้ข้างต้นแล้ว คอนเทนเนอร์ Jsp ยังรับผิดชอบในการเรียกคลาสการใช้งานเพจ jsp เพื่อประมวลผลแต่ละคำขอและสร้างการตอบกลับ ขั้นตอนนี้เรียกว่า ขั้นตอนการประมวลผลคำขอ ขั้นการประมวลผลคำขอจะดำเนินการเฉพาะไฟล์คลาส) </ป>
ดังนั้นเมื่อเราแนะนำองค์ประกอบการดำเนินการรวมลงในเพจ จริงๆ แล้วเราจะอ้างอิงเฉพาะไฟล์คลาสเซิร์ฟเล็ตที่สร้างขึ้นหลังจากไฟล์ date.jsp ถูกแปลงและคอมไพล์แล้ว ในกรณีนี้ date.jsp จะถูกทดสอบเป็นไฟล์แยกต่างหากหลังการดำเนินการ เรียกว่าเมื่อไฟล์ .jsp กำลังทำงาน เนื่องจากไม่ได้ระบุการเข้ารหัสอักขระในไฟล์ date.jsp อักขระที่อ่านไม่ออกจึงปรากฏขึ้น
<%@ ภาษาหน้า =”java” contentType=”text/html;charset=gb2312”%>
หลังจากเพิ่มบรรทัดคำสั่งนี้แล้ว ให้รีเฟรชและรันใหม่ ในขณะนี้ เพจจะแสดงอย่างถูกต้องและเหมือนกับเมื่อรันตามปกติด้วยคำสั่ง include หากคุณดูไฟล์ชั่วคราวภายใต้ Tomcat คุณจะพบว่ามี เป็นไฟล์ date_jsp.java และไฟล์ date_jsp.class ทั้งสองไฟล์ได้รับในลักษณะเดียวกับไฟล์ test_jsp.java และ test_jsp.class คุณจะพบว่ามีเพียงโค้ดบรรทัดใหม่เท่านั้นที่ถูกเพิ่มเข้ามาในขณะนี้:
JspRuntimeLibrary.include(คำขอ, ตอบกลับ, "date.jsp", ออก, จริง);</P>
โดยจะไม่เพิ่มโค้ดของไฟล์ date.jsp ลงใน test.jsp</P>
เพียงแนะนำการตอบสนองที่สร้างขึ้นหลังจากเพจ date.jsp ถูกดำเนินการขณะรันไทม์ ซึ่งหมายความว่าเราสามารถระบุทรัพยากรบนเว็บใด ๆ ที่สามารถสร้างการตอบสนอง (เช่น เซิร์ฟเล็ตหรือเพจ jsp) ตราบใดที่ประเภทที่สร้างโดยสิ่งเหล่านี้ ทรัพยากรเหมือนกับ jsp ประเภทเนื้อหาที่สร้างโดยเพจเหมือนกัน คอนเทนเนอร์ JSP จะดำเนินการทรัพยากรที่ระบุผ่านการเรียกฟังก์ชันภายใน ดังนั้น ทรัพยากรที่นำเข้าเหล่านี้สามารถช่วยประมวลผลคำขอดั้งเดิม ดังนั้นทรัพยากรเหล่านี้จึงสามารถเข้าถึงออบเจ็กต์ทั้งหมดได้ ในขอบเขตคำขอ และพารามิเตอร์คำขอดั้งเดิมทั้งหมด</P>
เนื่องจากเพจเหล่านี้ยังไม่ได้ถูกนำมาใช้กับเพจหลักเมื่อมีการร้องขอเพจหลัก คุณสามารถใช้ค่าแอตทริบิวต์เวลาร้องขอสำหรับแอตทริบิวต์เพจเพื่อกำหนดเพจที่จะแนะนำตามสถานการณ์รันไทม์ คุณยังสามารถเพิ่มคำขอบางส่วนได้อีกด้วย พารามิเตอร์ที่จะอ่านโดยหน้าที่เข้ามา
<jsp:include page="<%=pageSelectedAtRuntime%>" flush="true">
<jsp:ชื่อพารามิเตอร์=”fitstParamer” value=”firstvalue”>
<jsp:param name=”lastParamer” value=”lastvalue”>
</jsp:รวม></P>
หากมีการแก้ไขเพจ jsp ที่นำเข้า เวอร์ชันล่าสุดของเพจจะสามารถใช้งานได้ทันที เนื่องจากเพจที่นำเข้าได้รับการปฏิบัติในลักษณะเดียวกับเพจ jsp ที่เรียกโดยเบราว์เซอร์โดยตรงทุกประการ นั่นคือ คอนเทนเนอร์ตรวจพบการเปลี่ยนแปลงเพจ . และเข้าสู่ขั้นตอนการแปลโดยอัตโนมัติเพื่อรับหน้าเว็บเวอร์ชันล่าสุด</P>
(โปรดทราบว่าองค์ประกอบพฤติกรรมรวมจะเหมือนกับองค์ประกอบ jsp อื่นๆ หากไม่มีเนื้อหาพฤติกรรม จะต้องลงท้ายด้วย "/" เช่นเดียวกับดังต่อไปนี้
<jsp:include page="<%=pageSelectedAtRuntime%>" flush="true" />)</P>
ต่อไปนี้เป็นข้อแตกต่างระหว่างสองประเพณีของการรวม มีความแตกต่างที่สำคัญสองประการ
1: เวลาดำเนินการ:
<%@ include file=”relativeURI”%> จะถูกดำเนินการในระหว่างขั้นตอนการแปล
<jsp:include page="relativeURI" flush="true" /> จะถูกดำเนินการในระหว่างขั้นตอนการประมวลผลคำขอ
2: ความแตกต่างในเนื้อหาที่แนะนำ:
<%@ รวมไฟล์ =”relativeURI”%>
แนะนำข้อความคงที่ (html, jsp) และรวมเข้ากับเพจ JSP ก่อนที่จะแปลงเป็นเซิร์ฟเล็ต
<jsp:include page="relativeURI" flush="true" />แนะนำข้อความตอบกลับที่สร้างโดยหน้าดำเนินการหรือเซิร์ฟเล็ต
นอกจากนี้ ในการใช้งานทั้งสอง คุณลักษณะของไฟล์และเพจจะถูกตีความว่าเป็น URI แบบสัมพัทธ์ หากเริ่มต้นด้วยเครื่องหมายสแลช แสดงว่าเป็นพาธที่สัมพันธ์กับสภาพแวดล้อม จะถูกตีความตามคำนำหน้าที่กำหนดให้กับ URI ของแอปพลิเคชัน หากเป็น If มันไม่ได้ขึ้นต้นด้วยเครื่องหมายทับ แต่เป็นเส้นทางที่เกี่ยวข้องกับเพจ โดยจะถูกตีความตามเส้นทางของเพจที่มีการแนะนำไฟล์นี้ สำหรับข้อมูลเพิ่มเติมเกี่ยวกับวิธีการตีความ URL โปรดดูเอกสารที่เกี่ยวข้อง หรือ หนังสือ