2011-08-17 28 views
10

Nếu tôi làm:Tệp tin JSP có thể truy cập vào PageContext của JSP gọi không?

<% pageContext.setAttribute("foo", "bar"); %> 
<custom:myTag/> 

nó có vẻ như tôi sẽ có thể làm:

<%= pageContext.getAttribute("foo") %> 

bên trong myTag.tag ... nhưng tất nhiên tôi không thể vì doesn thẻ tập tin không có quyền truy cập vào pageContext (thay vào đó nó có quyền truy cập vào một jspContext ... mà không có các thuộc tính giống như trang pageContext của trang gọi).

Bây giờ, bạn có thể truy cập vào pageContext qua ELScript:

${pageContext} 

nhưng điều đó không giúp vì ELScript không có cách nào qua các đối số, vì vậy bạn không thể làm:

${pageContext.getAttribute("foo")} 

Tuy nhiên, thực tế là ELscript có thể truy cập ngữ cảnh trang và thực tế là thẻ có thể truy cập tất cả các loại biến như jspContext, rằng phải có một số cách để thẻ truy cập (theo cách viết mã Java/Java, không chỉ trong ELScript) một thuộc tính từ trang JContext của JSP đang gọi.

Có phải không?

Trả lời

7

Đối với EL, ${pageContext.getAttribute("foo")} chỉ hoạt động ở mức EL 2.2. Trước đó cú pháp đúng là ${pageContext.foo} hoặc chỉ ${foo}. Xem thêm EL wiki page của chúng tôi. Tuy nhiên, ${pageContext} không được chia sẻ giữa tệp JSP gốc và thẻ JSP. Mỗi người có một ví dụ riêng.

Bạn có thể hoặc thiết lập nó như yêu cầu thuộc tính thay vì:

<% request.setAttribute("foo", "bar") %> 
<custom:myTag /> 

với trong thẻ

<%= request.getAttribute("foo") %> 

hay, với EL

${requestScope.foo} 

hoặc

${foo} 

Hoặc, tốt hơn, bạn có thể vượt qua nó như là một thuộc tính tag fullworthy

<custom:myTag foo="bar" /> 

với trong thẻ

<%@attribute name="foo" required="true" %> 
${pageContext.foo} 

hoặc chỉ

<%@attribute name="foo" required="true" %> 
${foo} 
+0

Cảm ơn, nhưng vấn đề là, tôi đã có các biến tôi muốn trong pageContext, và đủ (thừa) mã tham chiếu chúng ở đó mà tôi không muốn phải thay đổi chúng để yêu cầu thuộc tính. Vì vậy, tôi * có thể * chỉ cần đặt bản sao trùng lặp vào yêu cầu, nhưng tôi đã hy vọng có một số cách khác để làm điều đó. Oh, và các biến này sẽ được thông qua A LOT trong rất nhiều thẻ nếu tôi làm cho chúng thuộc tính, vì vậy tôi đã thực sự hy vọng cho một "đằng sau hậu trường" giải pháp. Nếu không có cách nào có thể truy cập trang của JSPTiếp theo từ thẻ mặc dù ... đoán tôi không may mắn :-( – machineghost

+0

Bạn chỉ có thể truy cập ngữ cảnh trang thực tế bằng (PageContext) getJspContext(). Xem câu trả lời của tôi bên dưới. –

+0

@ Jason: câu hỏi không phải là về điều đó. – BalusC

1

Hình như trong WebLogic 10 ít nhất, đối tượng "ứng dụng" ngầm ẩn có sẵn trong các tệp thẻ và là instanceof ServletContext. Có thể sử dụng điều này, khi nó thực sự là ServletContext mà một cái sau, và không nhất thiết phải là pageContext cấp cao hơn.

Các vấn đề liên quan