ความแตกต่างระหว่างการรวมไฟล์ที่มี JSP รวมถึงคำสั่ง JSP รวมการกระทำและการใช้ไฟล์แท็ก JSP คืออะไร


155

ดูเหมือนว่ามีสองวิธีในการสร้างเทมเพลตด้วย JSP การรวมไฟล์กับหนึ่งในข้อความเหล่านี้

<%@ include file="foo.html" %>
<jsp:include page="foo.html" />

หรือใช้ไฟล์แท็ก JSP

// Save this as mytag.tag
<%@ tag description="Description" pageEncoding="UTF-8"%>
<html>
<head>
</head>
<body>
    <jsp:doBody/>
</body>
</html>

และในหน้า JSP อื่นเรียกมันว่าด้วย

<%@ taglib prefix="t" tagdir="/WEB-INF/tags" %>

<t:mytag>
    <h1>Hello World</h1>
</t:mytag>

ดังนั้นฉันควรใช้วิธีใด ขณะนี้มีการพิจารณาว่าเลิกใช้แล้วหรือทั้งสองใช้ได้และครอบคลุมกรณีการใช้ที่แตกต่างกัน

แก้ไข

การใช้ไฟล์แท็กนี้เหมือนกับการใช้การรวมหรือไม่

// Save this as product.tag
<%@ tag description="Product templage" pageEncoding="UTF-8"%>
<%@ tag import="com.myapp.Product" %>
<%@ attribute name="product" required="true" type="com.myapp.Product"%>

Product name: ${product.name} <br/>
Quantity: ${product.quantity} <br/>

และเรียกมันบน JSP อื่นด้วย

<%@ taglib prefix="t" tagdir="/WEB-INF/tags" %>

<t:product>
    <c:forEach items="${cart.products}" var="product">
        <t:product product="${product}"/>
    </c:forEach>
</t:product>

ดูเหมือนว่าฉันจะเหมือนกันกับการใช้พารามิเตอร์การรวมและการส่งผ่านไป ดังนั้นไฟล์แท็กเหมือนกับที่รวมไว้หรือไม่

คำตอบ:


293

ภาพรวมขององค์ประกอบไวยากรณ์ JSP

ก่อนอื่นเพื่อทำให้สิ่งต่าง ๆ ชัดเจนยิ่งขึ้นนี่คือภาพรวมสั้น ๆ ขององค์ประกอบไวยากรณ์ JSP :

  • คำสั่ง : ข้อมูลเหล่านี้นำเสนอเกี่ยวกับหน้า JSP โดยรวม
  • องค์ประกอบการเขียนสคริปต์ : สิ่งเหล่านี้คือองค์ประกอบการเข้ารหัสของ Java เช่นการประกาศการแสดงออกของสคริปต์และความคิดเห็น
  • วัตถุและขอบเขต : วัตถุ JSP สามารถสร้างได้ทั้งโดยชัดแจ้งหรือโดยนัยและสามารถเข้าถึงได้ภายในขอบเขตที่กำหนดเช่นจากที่ใดก็ได้ในหน้า JSP หรือเซสชัน
  • การดำเนินการ : สิ่งเหล่านี้สร้างวัตถุหรือส่งผลต่อกระแสข้อมูลขาออกในการตอบสนอง JSP (หรือทั้งสองอย่าง)

เนื้อหารวมอยู่ใน JSP อย่างไร

มีกลไกหลายอย่างสำหรับการนำเนื้อหามาใช้ซ้ำในไฟล์ JSP

4 กลไกต่อไปนี้เพื่อรวมเนื้อหาใน JSPสามารถจัดประเภทเป็นการใช้ซ้ำโดยตรง :
(สำหรับ 3 กลไกแรกที่อ้างถึงจาก"Head First Servlets และ JSP" )

1) คำสั่งรวมถึง:

<%@ include file="header.html" %>

คงที่ : เพิ่มเนื้อหาจากค่าของแอตทริบิวต์แฟ้มไปยังเพจปัจจุบันในเวลาแปล ในตอนแรกคำสั่งนั้นมีไว้สำหรับแม่แบบเค้าโครงคงที่เช่นส่วนหัว HTML

2) การ<jsp:include> กระทำมาตรฐาน :

<jsp:include page="header.jsp" />

แบบไดนามิก : เพิ่มเนื้อหาจากค่าของแอตทริบิวต์หน้าไปยังหน้าปัจจุบันในเวลาที่ร้องขอ มีไว้สำหรับเนื้อหาแบบไดนามิกที่มาจาก JSP มากขึ้น

3) <c:import>แท็ก JSTL:

<c:import url=”http://www.example.com/foo/bar.html” />

แบบไดนามิก : เพิ่มเนื้อหาจากค่าของแอตทริบิวต์ URL ไปยังเพจปัจจุบันที่ในเวลาที่ร้องขอ มันใช้งานได้ดีเหมือน <jsp:include>กัน แต่มันมีประสิทธิภาพและยืดหยุ่นมากกว่า: ไม่เหมือนกับอีกสองอันรวมกัน<c:import> url สามารถมาจากนอกเว็บคอนเทนเนอร์ได้ !

4) Preludes และ codas:

คงที่ : แปร่งปร่าและ codas สามารถนำมาใช้เท่านั้นที่จะเป็นจุดเริ่มต้นและสิ้นสุดของหน้าเว็บ
คุณสามารถรวมpreludes (หรือที่เรียกว่าส่วนหัว) และcodas (หรือที่เรียกว่าส่วนท้าย) สำหรับกลุ่มของหน้า JSP โดยการเพิ่ม <include-prelude>และ<include-coda>องค์ประกอบตามลำดับภายใน<jsp-property-group>องค์ประกอบในตัวให้คำอธิบายการปรับใช้เว็บแอปพลิเคชันweb.xml อ่านเพิ่มเติมได้ที่นี่:
•การกำหนดค่าการรวมโดยปริยายที่จุดเริ่มต้นและจุดสิ้นสุดของ JSP
การกำหนดการรวมโดยนัย


ไฟล์แท็กเป็นวิธีการทางอ้อมของการนำเนื้อหามาใช้ซ้ำซึ่งเป็นวิธีการห่อหุ้มเนื้อหาที่นำมาใช้ซ้ำได้ แท็กไฟล์เป็นไฟล์ต้นทางที่ประกอบด้วยชิ้นส่วนของรหัส JSP ที่นำมาใช้ใหม่เป็นแท็กที่กำหนดเอง

วัตถุประสงค์ของการรวมและไฟล์แท็กแตกต่างกัน

ไฟล์แท็ก (แนวคิดที่นำมาใช้กับ JSP 2.0) เป็นหนึ่งในตัวเลือกสำหรับการสร้างแท็กที่กำหนดเอง มันเป็นวิธีที่เร็วและง่ายต่อการสร้างแท็กที่กำหนดเอง แท็กที่กำหนดเองหรือที่เรียกว่าส่วนขยายแท็กเป็นองค์ประกอบ JSP ที่อนุญาตให้ตรรกะที่กำหนดเองและเอาท์พุทที่จัดทำโดยส่วนประกอบ Java อื่น ๆ ที่จะแทรกลงในหน้า JSP ตรรกะให้ผ่านแท็กที่กำหนดเองที่มีการดำเนินการโดยวัตถุ Java ที่รู้จักกันเป็นตัวจัดการแท็ก

ตัวอย่างของงานที่สามารถทำได้โดยแท็กที่กำหนดเองรวมถึงการดำเนินการกับวัตถุโดยนัยรูปแบบการประมวลผลการเข้าถึงฐานข้อมูลและบริการองค์กรอื่น ๆ เช่นอีเมลและไดเรกทอรีและการนำโฟลว์คอนโทรลไปใช้


เกี่ยวกับการแก้ไขของคุณ

บางทีในตัวอย่างของคุณ (ในการแก้ไขของคุณ) ไม่มีความแตกต่างระหว่างการใช้การรวมโดยตรงและไฟล์แท็ก แต่แท็กที่กำหนดเองมีชุดคุณสมบัติมากมาย พวกเขาสามารถ

  • ปรับแต่งโดยใช้คุณสมบัติที่ส่งผ่านจากหน้าโทร

  • ส่งผ่านตัวแปรกลับไปที่หน้าการโทร

  • เข้าถึงวัตถุทั้งหมดที่มีให้กับหน้า JSP

  • สื่อสารกับผู้อื่น คุณสามารถสร้างและเริ่มต้นองค์ประกอบ JavaBeans สร้างตัวแปร EL สาธารณะที่อ้างถึง bean นั้นในแท็กหนึ่งจากนั้นใช้ bean ในแท็กอื่น

  • ซ้อนอยู่ภายในซึ่งกันและกันและสื่อสารโดยใช้ตัวแปรส่วนตัว

นอกจากนี้อ่านนี้จาก "โปร JSP 2": ความเข้าใจ JSP กำหนดเองแท็ก


การอ่านที่มีประโยชน์


ข้อสรุป

ใช้เครื่องมือที่เหมาะสมสำหรับแต่ละงาน


ใช้ไฟล์แท็กเป็นวิธีที่รวดเร็วและง่ายดายในการสร้างแท็กที่กำหนดเองที่สามารถช่วยคุณห่อหุ้มเนื้อหาที่นำมาใช้ซ้ำได้

สำหรับเนื้อหารวมถึงใน JSP (อ้างจากที่นี่ ):

  • ใช้สั่งรวมถึงหากไฟล์ที่เปลี่ยนแปลงไม่ค่อย มันเป็นกลไกที่เร็วที่สุด หากคอนเทนเนอร์ของคุณตรวจไม่พบการเปลี่ยนแปลงโดยอัตโนมัติคุณสามารถบังคับให้การเปลี่ยนแปลงมีผลโดยลบไฟล์คลาสของหน้าหลัก
  • ใช้การดำเนินการรวมสำหรับเนื้อหาที่มีการเปลี่ยนแปลงบ่อยครั้งและหากไม่สามารถตัดสินใจว่าจะรวมเพจใดจนกว่าจะมีการร้องขอหน้าหลัก

แต่ <jsp: include> ไม่เหมือนกับการใช้ไฟล์แท็กใช่หรือไม่ ฉันไม่เห็นความแตกต่างใด ๆ ... คุณสามารถส่งตัวแปรไปยังไฟล์ที่รวมอยู่ใน <jsp: include> ได้เช่นเดียวกับที่คุณสามารถส่งตัวแปรไปยังไฟล์แท็ก ทั้งสองวิธีให้คุณนำเนื้อหากลับมาใช้ใหม่ดูเหมือนว่าจะทำสิ่งเดียวกัน มีความแตกต่างระหว่างชื่ออื่นหรือไม่?
sonicboom

@sonicboom อัปเดตคำตอบของฉัน
informatik01

1
@ informatik01 คำตอบที่ดีมากฉันซาบซึ้งในความลึกการจัดรูปแบบที่ดีและกลไก 4 รายการที่มีประโยชน์มาก
รัสเซลซิลวา

1
อะไรคือข้อได้เปรียบของ <jsp: include> มากกว่า <* @ include url .. >
Krsna Chaitanya

@KrsnaChaitanya หมายเหตุ: คุณมี typo (เครื่องหมายดอกจัน*) ในคำสั่ง include <jsp:include>เป็นมาตรฐานรวมถึงการดำเนินการ , <%@ include file="" %>เป็นรวมถึงคำสั่ง อ่านหัวข้อสุดท้าย (ในกล่องสีเทา) ซึ่งสรุปข้อดี (เช่นคำแนะนำเมื่อเลือกอย่างใดอย่างหนึ่ง) ตรวจสอบบทความนี้สำหรับคำอธิบายโดยละเอียด หวังว่านี่จะช่วยได้
informatik01

21

คำถามซ้ำที่เป็นไปได้

<@include>- แท็ก directive สั่งให้คอมไพเลอร์ JSP เพื่อรวมเนื้อหาของไฟล์ที่รวมอยู่ใน JSP ก่อนที่จะสร้างรหัสเซิร์ฟเล็ตที่สร้างขึ้น มันเทียบเท่ากับการตัดและวางข้อความจากหน้ารวมของคุณลงใน JSP ของคุณ

  • เซิร์ฟเล็ตเดียวเท่านั้นที่ถูกเรียกใช้งานขณะรันไทม์
  • ตัวแปรสคริปต์เล็ตที่ประกาศในเพจพาเรนต์สามารถเข้าถึงได้ในเพจที่รวมไว้ (จำไว้ว่าเป็นเพจเดียวกัน)
  • หน้ารวมไม่จำเป็นต้องสามารถรวบรวมเป็น JSP แบบสแตนด์อโลน สามารถเป็นส่วนของรหัสหรือข้อความธรรมดา หน้ารวมจะไม่ถูกรวบรวมเป็นแบบสแตนด์อโลน หน้ารวมยังสามารถมีส่วนขยายใด ๆ แม้ว่า. jspf ได้กลายเป็นส่วนขยายที่ใช้ตามอัตภาพ
  • ข้อเสียเปรียบประการหนึ่งของคอนเทนเนอร์เก่าคือการเปลี่ยนแปลงหน้ารวมอาจไม่มีผลจนกว่าจะมีการอัปเดตหน้าหลัก Tomcat รุ่นล่าสุดจะตรวจสอบหน้ารวมสำหรับการปรับปรุงและบังคับให้คอมไพล์ใหม่ของแม่ถ้าพวกเขากำลังปรับปรุง
  • ข้อเสียเปรียบเพิ่มเติมคือเนื่องจากรหัสถูก inline โดยตรงกับวิธีการบริการของ servlet ที่สร้างขึ้นวิธีการสามารถเติบโตมาก หากเกิน 64 KB การรวบรวม JSP ของคุณอาจล้มเหลว

<jsp:include> - แท็ก JSP Action ในอีกทางหนึ่งจะสั่งให้คอนเทนเนอร์หยุดการทำงานของหน้านี้ชั่วคราวไปที่เรียกใช้หน้าที่รวมและผสานเอาท์พุทจากหน้านั้นไปยังเอาท์พุทจากหน้านี้

  • แต่ละเพจที่รวมจะถูกเรียกใช้งานเป็น servlet แยกต่างหากในขณะใช้งาน
  • หน้าสามารถรวมเงื่อนไขในเวลาทำงาน สิ่งนี้มักจะมีประโยชน์สำหรับการสร้างเทมเพลตเฟรมเวิร์กที่สร้างเพจจากการรวม เพจระดับบนสามารถกำหนดว่าจะรวมเพจใดบ้างถ้ามีตามเงื่อนไขรันไทม์บางหน้า
  • ค่าของตัวแปรสคริปต์เล็ตจะต้องผ่านไปยังหน้ารวมอย่างชัดเจน
  • หน้ารวมจะต้องสามารถเรียกใช้ด้วยตัวเอง
  • คุณมีโอกาสน้อยที่จะพบข้อผิดพลาดในการรวบรวมเนื่องจากมีขนาดเกินวิธีสูงสุดในคลาสเซิร์ฟเล็ตที่สร้างขึ้น

คุณอาจใช้<@include>หรือ ขึ้นอยู่กับความต้องการของคุณ<jsp:include>


1
คุณหมายความว่าคุณแสดงให้เห็นในคำถามของคุณ: <t:mytag><h1>Hello World</h1></t:mytag>? นั่นไม่ใช่การรวมมันเป็นการใช้แท็กปกติ (เช่น<jsp:useBean>หรือ<c:if>)
Uooo

ดังนั้นอะไรคือความแตกต่างระหว่างการใช้ไฟล์แท็กและรวมตามที่ดูเหมือนว่าไฟล์แท็กสามารถใช้เพื่อรวมเนื้อหาในหน้า?
sonicboom

9

ประโยชน์หลักของการ<jsp:include />ผ่าน<%@ include >คือ:

<jsp:include /> อนุญาตให้ส่งผ่านพารามิเตอร์

<jsp:include page="inclusion.jsp">
    <jsp:param name="menu" value="objectValue"/>
</jsp:include>

ซึ่งเป็นไปไม่ได้ <%@include file="somefile.jsp" %>


สิ่งที่เกี่ยวกับ tagfiles ฉันรู้ว่า inlcudes ทำงานอย่างไร ฉันสงสัยว่าไฟล์แท็กเกี่ยวข้องกับการรวมอย่างไรดูเหมือนว่าพวกเขามีฟังก์ชั่นเดียวกัน ข้อแตกต่างระหว่างการใช้ tagfiles และการใช้รวมคืออะไร
sonicboom

แล้วไง<%@include file="somefile.jsp?menu=value" %>ล่ะ นั่นถูก จำกัด ด้วยเหรอ?
Roshana Pitigala

5

ทั้งหมดสามตัวเลือกแม่แบบ - <%@include>, <jsp:include>และ<%@tag>มีความถูกต้องและทั้งสามปกกรณีการใช้งานที่แตกต่างกัน

ด้วย<@include>ตัวแยกวิเคราะห์ JSP ในบรรทัดเนื้อหาของไฟล์รวมลงใน JSP ก่อนการรวบรวม (คล้ายกับ C #include) คุณจะใช้ตัวเลือกนี้ด้วยเนื้อหาที่เรียบง่ายและคงที่: ตัวอย่างเช่นหากคุณต้องการรวมส่วนหัวส่วนท้ายหรือองค์ประกอบการนำทางไว้ในทุกหน้าในแอปพลิเคชันบนเว็บของคุณ เนื้อหาที่รวมกลายเป็นส่วนหนึ่งของ JSP ที่คอมไพล์แล้วและไม่มีค่าใช้จ่ายเพิ่มเติมขณะใช้งานจริง

<jsp:include>(และ JSTL <c:import>ซึ่งมีความคล้ายคลึงและมีประสิทธิภาพมากกว่า) เหมาะที่สุดสำหรับเนื้อหาแบบไดนามิก ใช้สิ่งเหล่านี้เมื่อคุณต้องการรวมเนื้อหาจาก URL อื่นท้องถิ่นหรือจากระยะไกล เมื่อทรัพยากรที่คุณกำลังรวมอยู่นั้นเป็นไดนามิก หรือเมื่อเนื้อหาที่รวมใช้ตัวแปรหรือคำจำกัดความถั่วที่ขัดแย้งกับหน้ารวม<c:import>ยังช่วยให้คุณสามารถเก็บข้อความที่รวมอยู่ในตัวแปรซึ่งคุณสามารถจัดการหรือนำมาใช้ซ้ำได้อีก ทั้งสองอย่างนี้มีค่าใช้จ่ายรันไทม์เพิ่มเติมสำหรับการแจกจ่าย: นี่เป็นขั้นต่ำ แต่คุณต้องระวังว่าการรวมแบบไดนามิกนั้นไม่ "ฟรี"

ใช้ไฟล์แท็กเมื่อคุณต้องการสร้างส่วนประกอบส่วนต่อประสานผู้ใช้ที่สามารถใช้ซ้ำได้ หากคุณมีรายการวิดเจ็ตพูดและคุณต้องการวนซ้ำวิดเจ็ตและคุณสมบัติการแสดงของแต่ละรายการ (ในตารางหรือในฟอร์ม) คุณจะต้องสร้างแท็ก แท็กสามารถรับอาร์กิวเมนต์ได้โดยใช้<%@tag attribute>และอาร์กิวเมนต์เหล่านี้อาจเป็นข้อบังคับหรือไม่บังคับ - ซึ่งคล้ายกับพารามิเตอร์วิธี

ไฟล์แท็กเป็นกลไกที่เรียบง่ายและใช้ JSP ในการเขียนไลบรารีแท็กซึ่ง (ก่อน JSP 2.0) คุณต้องเขียนโดยใช้โค้ด Java การเขียนไฟล์แท็ก JSP เป็นเรื่องที่สะอาดยิ่งขึ้นเมื่อมีการเรนเดอร์จำนวนมากในแท็ก: คุณไม่จำเป็นต้องผสมโค้ด Java และ HTML ตามที่คุณต้องทำถ้าคุณเขียนแท็กใน Java


1

อ้างอิงจาก: Java Revisited

  1. รีซอร์สที่ถูกรวมโดย directive ถูกโหลดระหว่างเวลาการแปล jsp ในขณะที่รีซอร์สที่ถูกรวมโดย action จะถูกโหลดระหว่างเวลาร้องขอ

  2. การเปลี่ยนแปลงใด ๆ ของทรัพยากรที่รวมจะไม่สามารถมองเห็นได้ในกรณีที่มีคำสั่งรวมถึงจนกว่าไฟล์ jsp จะรวบรวมอีกครั้ง ในขณะที่ในกรณีที่มีการกระทำรวมการเปลี่ยนแปลงใด ๆ ในทรัพยากรรวมจะสามารถมองเห็นได้ในการร้องขอต่อไป

  3. การรวมคำสั่งคือการนำเข้าแบบคงที่ในขณะที่การกระทำคือการนำเข้าแบบไดนามิก

  4. รวมคำสั่งการใช้แอตทริบิวต์ไฟล์เพื่อระบุทรัพยากรที่จะรวมในขณะที่การดำเนินการรวมการใช้แอตทริบิวต์หน้าเพื่อวัตถุประสงค์เดียวกัน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.