Sự khác biệt giữa bao gồm các tệp với JSP bao gồm chỉ thị, JSP bao gồm hành động và sử dụng Tệp thẻ JSP?


155

Dường như có hai phương thức để tạo khuôn mẫu với JSP. Bao gồm các tệp có một trong các tuyên bố này

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

hoặc sử dụng các tệp thẻ JSP

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

Và trong một trang JSP khác, hãy gọi nó bằng

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

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

Vậy tôi nên sử dụng phương pháp nào? Bây giờ một cái được coi là không dùng nữa hay cả hai đều hợp lệ và bao gồm các trường hợp sử dụng khác nhau?

Biên tập

Không sử dụng tệp thẻ này giống như sử dụng bao gồm?

// 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/>

Và gọi nó trên một tệp JSP khác với

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

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

Điều đó đối với tôi có vẻ giống như sử dụng một tham số bao gồm và truyền tham số cho nó. Vì vậy, các tập tin thẻ giống như bao gồm?

Câu trả lời:


293

Tổng quan về các thành phần cú pháp của JSP

Đầu tiên, để làm cho mọi thứ rõ ràng hơn, đây là một tổng quan ngắn về các thành phần cú pháp của JSP :

  • Chỉ thị : Chúng truyền đạt thông tin liên quan đến toàn bộ trang JSP.
  • Các phần tử script : Đây là các phần tử mã hóa Java như khai báo, biểu thức, scriptlets và bình luận.
  • Đối tượngphạm vi : Các đối tượng JSP có thể được tạo một cách rõ ràng hoặc ngầm định và có thể truy cập được trong một phạm vi nhất định, chẳng hạn như từ bất kỳ nơi nào trong trang JSP hoặc phiên.
  • Hành động : Những điều này tạo ra các đối tượng hoặc ảnh hưởng đến luồng đầu ra trong phản hồi JSP (hoặc cả hai).

Làm thế nào nội dung được bao gồm trong JSP

Có một số cơ chế để sử dụng lại nội dung trong tệp tin JSP.

4 cơ chế sau đây để bao gồm nội dung trong JSP có thể được phân loại thành tái sử dụng trực tiếp :
(đối với 3 cơ chế đầu tiên được trích dẫn từ "Head First Servlets và JSP" )

1) Chỉ thị bao gồm :

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

Tĩnh : thêm nội dung từ giá trị của thuộc tính tệp vào trang hiện tại tại thời điểm dịch . Lệnh ban đầu được dành cho các mẫu bố cục tĩnh, như các tiêu đề HTML.

2) <jsp:include> Hành động chuẩn :

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

Động : thêm nội dung từ giá trị của thuộc tính trang vào trang hiện tại vào thời điểm yêu cầu . Được dự định nhiều hơn cho nội dung động đến từ các tệp tin.

3) <c:import>Thẻ JSTL:

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

Động : thêm nội dung từ giá trị của thuộc tính URL vào trang hiện tại, tại thời điểm yêu cầu . Nó hoạt động rất giống <jsp:include>, nhưng nó mạnh mẽ và linh hoạt hơn: không giống như hai phần còn lại bao gồm, <c:import> url có thể từ bên ngoài Web Container !

4) Preludes và codas:

Tĩnh : preludes và codas chỉ có thể được áp dụng cho phần đầu và phần cuối của trang .
Bạn ngầm có thể bao gồm prelude (còn gọi là tiêu đề) và codas (còn gọi là footers) cho một nhóm các trang JSP bằng cách thêm <include-prelude><include-coda>các yếu tố tương ứng trong một <jsp-property-group>phần tử trong ứng dụng Web web.xml mô tả triển khai. Đọc thêm tại đây:
• Định cấu hình Bao gồm ẩn ở đầu và cuối của các tệp
Xác định ẩn bao gồm


Tag File là một phương pháp gián tiếp để tái sử dụng nội dung, cách đóng gói nội dung có thể sử dụng lại . Một Tag file là một file nguồn có chứa một đoạn mã JSP đó là tái sử dụng như một thẻ tùy chỉnh .

MỤC ĐÍCH bao gồm và các tệp thẻ là khác nhau.

Tệp thẻ (một khái niệm được giới thiệu với JSP 2.0) là một trong các tùy chọn để tạo thẻ tùy chỉnh . Đó là cách nhanh hơn và dễ dàng hơn để xây dựng các thẻ tùy chỉnh . Các thẻ tùy chỉnh , còn được gọi là các phần mở rộng thẻ, là các phần tử JSP cho phép logic và đầu ra tùy chỉnh được cung cấp bởi các thành phần Java khác được chèn vào các trang JSP. Logic được cung cấp thông qua thẻ tùy chỉnh được triển khai bởi một đối tượng Java được gọi là trình xử lý thẻ .

Một số ví dụ về các tác vụ có thể được thực hiện bằng thẻ tùy chỉnh bao gồm vận hành trên các đối tượng ẩn, xử lý biểu mẫu, truy cập cơ sở dữ liệu và các dịch vụ doanh nghiệp khác như email và thư mục và thực hiện kiểm soát luồng.


Về chỉnh sửa của bạn

Có thể trong ví dụ của bạn (trong Chỉnh sửa của bạn ), không có sự khác biệt giữa việc sử dụng trực tiếp bao gồm và Tệp thẻ. Nhưng thẻ tùy chỉnh có một bộ tính năng phong phú . Họ có thể

  • Được tùy chỉnh bằng các thuộc tính được truyền từ trang gọi.

  • Truyền biến trở lại trang gọi.

  • Truy cập tất cả các đối tượng có sẵn cho các trang JSP.

  • Giao tiếp với mọi người. Bạn có thể tạo và khởi tạo một thành phần JavaBeans, tạo một biến EL công khai tham chiếu đến bean đó trong một thẻ và sau đó sử dụng bean trong một thẻ khác.

  • Được lồng vào nhau và giao tiếp bằng các biến riêng tư.

Đồng thời đọc phần này từ "Pro JSP 2": Tìm hiểu các thẻ tùy chỉnh của JSP .


Đọc hữu ích.


Phần kết luận

Sử dụng các công cụ phù hợp cho từng nhiệm vụ.


Sử dụng Tệp thẻ như một cách nhanh chóng và dễ dàng để tạo các thẻ tùy chỉnh có thể giúp bạn đóng gói nội dung có thể sử dụng lại .

Đối với nội dung bao gồm trong JSP (trích dẫn từ đây ):

  • Sử dụng lệnh bao gồm nếu tệp hiếm khi thay đổi . Đó là cơ chế nhanh nhất. Nếu vùng chứa của bạn không tự động phát hiện các thay đổi, bạn có thể buộc các thay đổi có hiệu lực bằng cách xóa tệp lớp trang chính.
  • Chỉ sử dụng hành động bao gồm cho nội dung thay đổi thường xuyên và nếu trang nào bao gồm không thể được quyết định cho đến khi trang chính được yêu cầu.

Nhưng không phải <jsp: include> giống như sử dụng tệp thẻ? Tôi không thể thấy bất kỳ sự khác biệt nào ... Bạn có thể chuyển các biến cho các tệp được bao gồm <jsp: include> giống như bạn có thể chuyển các biến cho các tệp thẻ. Cả hai phương pháp đều cho phép bạn sử dụng lại nội dung, chúng dường như thực hiện chính xác cùng một điều. Có sự khác biệt nào giữa họ ngoài tên của họ không?
sonicboom

@sonicboom cập nhật câu trả lời của tôi
informatik01

1
@ notifyatik01 câu trả lời rất hay, tôi đánh giá cao độ sâu, định dạng đẹp và danh sách 4 cơ chế rất tiện dụng.
Russell Silva

1
chính xác thì lợi thế của <jsp: include> trên <* @ bao gồm url ..> là gì?
Krsna Chaitanya

@KrsnaChaitanya Lưu ý: bạn có một lỗi đánh máy (dấu hoa thị *) trong lệnh bao gồm. <jsp:include>là một tiêu chuẩn bao gồm hành động , <%@ include file="" %>chỉ thị bao gồm . Đọc phần cuối cùng (trong hộp màu xám) trong đó nêu ra những ưu điểm (tức là khuyến nghị khi chọn cái này hay cái khác). Ngoài ra kiểm tra bài viết này cho mô tả chi tiết. Hi vọng điêu nay co ich.
informatik01

21

Câu hỏi trùng lặp có thể

<@include>- Thẻ chỉ thị hướng dẫn trình biên dịch JSP hợp nhất nội dung của tệp được bao gồm vào tệp trước khi tạo mã servlet được tạo. Nó tương đương với việc cắt và dán văn bản từ trang bao gồm ngay vào tệp JSP của bạn.

  • Chỉ có một servlet được thực thi trong thời gian chạy.
  • Các biến Scriptlet được khai báo trong trang mẹ có thể được truy cập trong trang được bao gồm (hãy nhớ rằng chúng là cùng một trang).
  • Trang được bao gồm không cần phải được biên dịch thành một tệp độc lập. Nó có thể là một đoạn mã hoặc văn bản thuần túy. Trang bao gồm sẽ không bao giờ được biên dịch dưới dạng độc lập. Trang được bao gồm cũng có thể có bất kỳ tiện ích mở rộng nào, mặc dù .jspf đã trở thành tiện ích mở rộng được sử dụng theo quy ước.
  • Một nhược điểm trên các container cũ là các thay đổi đối với các trang bao gồm có thể không có hiệu lực cho đến khi trang mẹ được cập nhật. Các phiên bản gần đây của Tomcat sẽ kiểm tra các trang bao gồm các bản cập nhật và buộc biên dịch lại phụ huynh nếu chúng được cập nhật.
  • Một nhược điểm nữa là mã được nhập trực tiếp vào phương thức dịch vụ của servlet được tạo, nên phương thức có thể phát triển rất lớn. Nếu vượt quá 64 KB, trình biên dịch JSP của bạn có thể sẽ thất bại.

<jsp:include> - Mặt khác, thẻ Hành động JSP chỉ thị cho bộ chứa tạm dừng việc thực thi trang này, chạy trang được bao gồm và hợp nhất đầu ra từ trang đó vào đầu ra từ trang này.

  • Mỗi trang được bao gồm được thực thi như một servlet riêng biệt trong thời gian chạy.
  • Các trang có điều kiện có thể được bao gồm trong thời gian chạy. Điều này thường hữu ích cho các khuôn mẫu tạo khuôn mẫu bao gồm các trang. Trang mẹ có thể xác định trang nào, nếu có, bao gồm theo một số điều kiện thời gian chạy.
  • Các giá trị của các biến scriptlet cần được chuyển rõ ràng đến trang bao gồm.
  • Trang đi kèm phải có khả năng tự chạy.
  • Bạn ít có khả năng gặp phải các lỗi biên dịch do kích thước phương thức tối đa bị vượt quá trong lớp servlet được tạo.

Tùy thuộc vào nhu cầu của bạn, bạn có thể sử dụng <@include>hoặc <jsp:include>


1
Bạn có nghĩa là như bạn thể hiện trong câu hỏi của bạn : <t:mytag><h1>Hello World</h1></t:mytag>? Đó không phải là một bao gồm, đó là việc sử dụng bình thường của một thẻ (như <jsp:useBean>hoặc <c:if>).
Uooo

Vì vậy, sự khác biệt giữa việc sử dụng tệp thẻ và bao gồm vì dường như các tệp thẻ có thể được sử dụng để bao gồm nội dung trong một trang?
sonicboom

9

Ưu điểm chính của <jsp:include />hơn <%@ include >là:

<jsp:include /> cho phép truyền tham số

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

điều này là không thể <%@include file="somefile.jsp" %>


Những gì về tagfiles, tôi biết làm thế nào inlcudes hoạt động. Tôi tự hỏi làm thế nào các tập tin thẻ liên quan đến bao gồm vì dường như chúng cung cấp cùng chức năng. Sự khác biệt giữa việc sử dụng tagfiles và sử dụng bao gồm những gì?
sonicboom

làm thế nào về <%@include file="somefile.jsp?menu=value" %>? Điều đó có bị hạn chế quá không?
Roshana Pitigala

5

Tất cả ba lựa chọn mẫu - <%@include>, <jsp:include><%@tag>có giá trị, và cả ba trang bìa trường hợp sử dụng khác nhau.

Với <@include>, trình phân tích cú pháp JSP nội tuyến nội dung của tệp được bao gồm trong tệp JSP trước khi biên dịch (tương tự như C #include). Bạn sẽ sử dụng tùy chọn này với nội dung tĩnh, đơn giản: ví dụ: nếu bạn muốn bao gồm các yếu tố đầu trang, chân trang hoặc điều hướng vào mỗi trang trong ứng dụng web của mình. Nội dung được bao gồm trở thành một phần của JSP được biên dịch và không có thêm chi phí khi chạy.

<jsp:include>(và của JSTL <c:import>, tương tự và thậm chí còn mạnh hơn) phù hợp nhất với nội dung động. Sử dụng chúng khi bạn cần bao gồm nội dung từ một URL khác, cục bộ hoặc từ xa; khi tài nguyên bạn bao gồm là chính nó động; hoặc khi nội dung được bao gồm sử dụng các biến hoặc định nghĩa bean xung đột với trang bao gồm. <c:import>cũng cho phép bạn lưu trữ văn bản được bao gồm trong một biến mà bạn có thể thao tác hoặc sử dụng lại. Cả hai đều phải chịu một chi phí thời gian chạy bổ sung cho công văn: điều này là tối thiểu, nhưng bạn cần lưu ý rằng bao gồm động không phải là "miễn phí".

Sử dụng tệp thẻ khi bạn muốn tạo các thành phần giao diện người dùng có thể sử dụng lại. Nếu bạn có Danh sách các Widget, giả sử và bạn muốn lặp lại các thuộc tính của Widgets và hiển thị của từng thuộc tính (trong một bảng hoặc trong một biểu mẫu), bạn sẽ tạo một thẻ. Các thẻ có thể lấy các đối số, sử dụng <%@tag attribute>và các đối số này có thể là bắt buộc hoặc tùy chọn - hơi giống các tham số phương thức.

Các tệp thẻ là một cơ chế đơn giản hơn, dựa trên cơ sở viết thư viện thẻ, mà (trước đó là 2.0) bạn phải viết bằng mã Java. Việc viết các tệp thẻ JSP sẽ dễ dàng hơn rất nhiều khi có rất nhiều kết xuất trong thẻ: bạn không cần trộn mã Java và HTML như bạn phải làm nếu bạn đã viết các thẻ của mình bằng Java.


1

Theo: Xem lại Java

  1. Các tài nguyên được bao gồm bởi lệnh bao gồm được tải trong thời gian dịch jsp, trong khi các tài nguyên được bao gồm bởi hành động bao gồm được tải trong thời gian yêu cầu.

  2. Mọi thay đổi về tài nguyên được bao gồm sẽ không hiển thị trong trường hợp bao gồm lệnh cho đến khi tệp jsp biên dịch lại. Mặc dù trong trường hợp bao gồm hành động, mọi thay đổi trong tài nguyên được bao gồm sẽ hiển thị trong yêu cầu tiếp theo.

  3. Bao gồm chỉ thị là nhập tĩnh, trong khi bao gồm hành động là nhập động.

  4. Bao gồm chỉ thị sử dụng thuộc tính tệp để chỉ định tài nguyên được bao gồm trong khi bao gồm hành động sử dụng thuộc tính trang cho cùng mục đích.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.