2011-10-17 25 views
16

Tôi đang cố truy cập một số biến JSTL được đặt trên một vòng lặp JSTL trong một bao gồm.Chuyển c: forEach biến thành một jsp: include

Ví dụ:

<c:forEach items="${cart.entries}" var="entry"> 
<jsp:include page="helper.jsp"></jsp:include> 
</c:forEach> 

Bên helper.jsp Tôi muốn để có thể tham khảo các biến 'nhập'. Nó tiếp tục trở thành 'trống rỗng'. Tôi nghĩ có lẽ có một cách để thêm phạm vi cho biến forEach giống như bạn có thể với các biến đặt bình thường.

Bất kỳ ý tưởng nào?

Trả lời

25

ĐÁP: Tôi đã kết thúc việc phải làm điều này để làm cho nó hoạt động.

<c:forEach items="${cart.entries}" var="entry"> 
<c:set var="entryFC" value="${entry}" scope="request"></c:set> 
<jsp:include page="helper.jsp"></jsp:include> 
</c:forEach> 

Sau đó, tôi tham chiếu entryFC trong phạm vi của tôi. Không phải là rất thanh lịch ở tất cả, nhưng nó làm việc vì vậy tôi đoán bị bệnh đi với nó.

+11

Tôi đang tìm kiếm một cách thanh lịch hơn, nhưng cuối cùng lại làm điều này. Nhân tiện, bạn không cần phải đổi tên biến: '' hoạt động tốt và có thể ít gây nhầm lẫn . – Dmitri

0

Tôi biết rất muộn để trả lời cho câu hỏi này, nhưng có thể hữu ích cho những người bị kẹt trong tình huống này và tìm kiếm câu trả lời.

Câu trả lời của tôi sẽ hoạt động nếu bạn không bị ràng buộc chặt chẽ khi sử dụng thẻ <jsp: include> để bao gồm jsp. Thay vào đó, bạn có thể sử dụng <%@include file="/WEB-INF/views/path-to-jsp.jsp" %> để nhập một jsp khác trong trang và trang này có thể sử dụng biến vòng lặp thẻ <c:forEach> của bạn.

Ví dụ:

<c:forEach items="${users}" var="user"> 

    <%@include file="/WEB-INF/views/path-to-jsp.jsp" %> <!-- here ${user} can be use in importing jsp file. --> 
</c:forEach> 

Nó đang làm việc vì <%@include file="" %> thẻ sẽ bơm các nội dung của tập tin có tên vào JSP chứa thẻ, như thể nó đã được sao chép và dán. Điều này được thực hiện trước khi nội dung của tệp được bao gồm được phân tích cú pháp, thay vào đó phân tích cú pháp nó trong khi JSP chứa được phân tích cú pháp. Điều này giống với chỉ thị C#include, nơi trong quá trình xử lý trước, tệp được bao gồm được "dán" vào vị trí trước khi tệp được biên dịch. Sau khi nội dung được bao gồm, nó được đánh giá, tất cả trong cùng một bối cảnh, và do đó với cùng một truy cập và ràng buộc mã được bao gồm sẽ có nếu các nội dung được gõ vào vị trí đơn giản.

Trong khi đó, <jsp:include page=""/> thẻ hoạt động khác nhau ở chỗ kết quả hiển thị trang được chỉ định được đưa vào JSP chứa tại điểm của thẻ. Điều này được thực hiện bằng cách chủ yếu gửi trang được yêu cầu đến cùng một vùng chứa, dưới dạng yêu cầu hiển thị riêng lẻ và lấy kết quả chứ không phải nội dung của tệp. Yêu cầu này được thực hiện theo ngữ cảnh riêng của nó, có nghĩa là yêu cầu này không sử dụng thông tin trang giống như trang chứa thẻ. Điều này có thể hữu ích, đặc biệt là nếu nội dung được bao gồm có thể có các biến xung đột.