2013-05-17 110 views
24

Tôi có điều này trên welcome.jspCách chuyển tham số tới jsp: include qua c: set? Phạm vi của các biến trong JSP là gì?

<c:set var="pgTitle" value="Welcome"/> 
<jsp:include page="/jsp/inc/head.jsp" /> 

Và điều này trong head.jsp:

<title>Site Name - ${pgTitle}</title> 

Nhưng biến là trống, và đầu ra chỉ là

Site Name - 

Tôi có đọc nhiều bài báo, và tôi không thể tìm ra vấn đề là gì. Nếu tôi phản hồi ${pgTitle} ở nơi khác trong cùng welcome.jsp, thì kết quả sẽ tốt.

Tôi bao gồm thư viện thẻ lõi trên cả hai trang.

Trả lời

31

Điều này là do biến số pgTitle được đặt trong phạm vi trang. Kiểm tra xem nó here (xin lỗi tôi không thể có được một tài liệu chính thức cho việc này).

Nếu bạn muốn thực hiện công việc này, bạn phải đặt biến trong phạm vi yêu cầu ít nhất. Để thiết lập biến của bạn trong phạm vi yêu cầu, sử dụng thuộc tính scope trên <c:set>:

<c:set var="pgTitle" value="Welcome" scope="request" /> 

mỗi nhận xét của bạn, trong phát triển web, phạm vi của các biến quan trọng vì nó xác định nơi mà các biến thể được sử dụng (tương tự vào một biến được khai báo là trường trong một lớp và một biến được khai báo cục bộ trong một phương thức). Có bốn phạm vi trong JSP được gọi là ngữ cảnh:

  • Phạm vi trang (được xử lý bởi PageContext). Các biến chỉ có thể đạt được nếu được đặt làm thuộc tính trong trang hiện tại. Điều này có nghĩa, chỉ trang hiện tại mới có thể truy cập các thuộc tính này, các trang được bao gồm là các trang khác nhau, vì vậy chúng không thể truy cập các thuộc tính này.
  • Phạm vi yêu cầu (được xử lý bởi ServletRequest). Các biến chỉ có thể đạt được nếu được đặt làm thuộc tính trong yêu cầu hiện tại. Điều này có nghĩa là mọi trang được xử lý trong cùng một yêu cầu đều có thể truy cập vào các thuộc tính này. Lưu ý quan trọng: Chuyển hướng ngụ ý một quy trình yêu cầu/phản hồi mới. Điều này có nghĩa, nếu bạn đặt thuộc tính trên yêu cầu và thực thi chuyển hướng, các thuộc tính này sẽ không được đặt làm thuộc tính trên yêu cầu mới.
  • Phạm vi phiên (được xử lý bởi HttpSession). Các biến chỉ có thể đạt được nếu được đặt làm thuộc tính trong phiên người dùng hiện tại. Điều này có nghĩa là mọi trang được sử dụng trong cùng một phiên người dùng đều có thể sử dụng các thuộc tính này cho đến khi chúng được xóa hoặc phiên hết hạn.
  • Phạm vi ứng dụng (được xử lý bởi ServletContext). Các biến chỉ có thể đạt được nếu được đặt làm thuộc tính trong ngữ cảnh hiện tại. Điều này có nghĩa, mỗi trang trên mỗi thuộc tính phiên có thể truy cập vào các biến này cho đến khi chúng được xóa khỏi SessionContext hoặc ứng dụng web không được triển khai. Thông tin

thêm:

Đây có phải là cách đúng đắn để thực hiện những gì tôi đang cố gắng để làm gì?

Nếu có Servlet hoặc bộ điều khiển khác xử lý các thuộc tính được đặt trong yêu cầu (ví dụ: @Controller từ bean quản lý Spring MVC hoặc JSF), sau đó đặt thuộc tính ở đó và không trực tiếp trong trang của bạn.

Cá nhân, phải mất một thời gian để kiếm được kinh nghiệm và xác định phạm vi tốt nhất của các biến khi được sử dụng trên các ứng dụng web. Ví dụ cơ bản:

  • Chia tách một String bằng dấu phẩy cho mục đích trình bày sẽ chỉ ảnh hưởng đến chế độ xem hiện tại, do đó, điều này có thể được đặt trong phạm vi trang.
  • Lỗi và thư thành công phù hợp nhất trong phạm vi yêu cầu. Nếu người dùng cập nhật trang, họ có thể không được xem cùng một tin nhắn trừ khi dữ liệu được xử lý lại.
  • Thông tin người dùng dưới dạng tên, biệt hiệu và tùy chọn có thể được đặt trong phạm vi phiên.
  • Nếu bạn phải hiển thị danh sách các Quốc gia (không nên thay đổi trong vài ngày), bạn có thể lưu trữ danh sách này trong phạm vi ứng dụng.
+0

này đã làm trong công việc thực tế. Tôi có thể yêu cầu giải thích kỹ thuật hơn về những gì đang xảy ra ở đây không? Tại sao jsp: include không có quyền truy cập vào một tập hợp biến trong cha mẹ? Câu hỏi cuối cùng: Đây có phải là cách đúng để hoàn thành những gì tôi đang cố gắng làm không? Đã cập nhật – vcardillo

+0

@vcardillo câu trả lời. –

+0

Siêu hữu ích. Cảm ơn bạn đã dành thời gian để cung cấp những chi tiết này! – vcardillo

2

Bạn phải đặt biến thành (ít nhất) request phạm vi. Bạn có thể làm id như sau:

<c:set var="pgTitle" value="Welcome" scope="request"/> 
<jsp:include page="/jsp/inc/head.jsp" /> 

Và sau đó, trong head.jsp, bạn có thể ra các biến như thế này:

<c:out value="${requestScope.pgTitle}" /> 
+0

Không cần phải thêm 'requestScope' vì' $ {} 'đã tìm kiếm biến trong tất cả các thuộc tính phạm vi. –

+0

Không cần thiết, nhưng rõ ràng hơn. :) –

4

Một cách là phải vượt qua các biến để một bao gồm thông qua params truy vấn:

<jsp:include page="/WEB-INF/views/partial.jsp?foo=${bar}" /> 

<jsp:include page="/WEB-INF/views/partial.jsp"> 
    <jsp:param name="foo" value="${bar}" /> 
    <jsp:param name="foo2" value="${bar2}" /> 
</jsp:include> 

sau đó bạn có thể truy cập những params với ${param.foo}

khác là sử dụng các thẻ tùy chỉnh:

/WEB-INF/tags/head.tag

<%@ attribute name="title" %> 

<head> 
    <title>${title}</title> 
</head> 

somePage.jsp

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

<html> 
    <layout:head title="myRadTitle" /> 
    <body></body> 
<html/>