2012-04-12 25 views
6

Tôi đã mã sau:Làm thế nào để truy cập các đối tượng ValueStack trong bộ lặp Struts?

<s:iterator value="reviews"> 

    <img src="<s:property value="#request.restaurant.portalImage.url" />" /> 

    <s:property value="user.firstName" /> 
    <s:property value="user.lastName" /> 
    <s:property value="rating" /> 
    <s:property value="review" /> 

</s:iterator> 

đánh giá là một danh sách các đối tượng xem xét có chứa thông tin chi tiết của một bài đánh giá, chẳng hạn như đánh giá và tên của người dùng.

Vấn đề của tôi là tôi không thể truy cập bất kỳ đối tượng nào có trên ValueStack trong vòng lặp.

Bên ngoài vòng lặp <s:property value="#request.restaurant.portalImage.url" /> hoạt động chính xác. Nhưng trong vòng lặp nó in null.

AFAIK một trình vòng lặp đẩy bộ sưu tập của nó trên ValueStack sao cho tất cả các biểu thức OGNL đều giải quyết nó. Nhưng tôi đã sử dụng # có nghĩa là tôi đang xác định rõ ràng đối tượng gốc để giải quyết.

Tại sao nó vẫn không hoạt động?

Trả lời

1

Bạn nên thay đổi nó như dưới đây:

<s:iterator value="reviews" var="varrequest"> 

    <img src="<s:property value="#varrequest.restaurant.portalImage.url" />" /> 

    <s:property value="#varrequest.user.firstName" /> 
    <s:property value="#varrequest.user.lastName" /> 
    <s:property value="#varrequest.rating" /> 
    <s:property value="#varrequest.review" /> 

</s:iterator> 

Sử dụng một biến tham chiếu iterator để lấy đối tượng chỉ số duy nhất.

+0

Varrequest là gì? –

+0

Đó là biến chứa đối tượng được lập chỉ mục hiện tại để bạn truy cập. Vui lòng xem tài liệu này để biết thêm thông tin. http://struts.apache.org/2.0.11/docs/iterator.html – Phani

+0

Đối tượng được lập chỉ mục hiện tại sẽ là đối tượng đánh giá từ danh sách. Tôi muốn truy cập một cái gì đó bên ngoài danh sách. Một đối tượng nhà hàng được lưu trữ trong phạm vi yêu cầu. –

1

Tôi không chắc chắn đối tượng nào được chứa trong bộ sưu tập bạn đang sử dụng trong Iterator.As cho mỗi trình vòng lặp khi bạn lặp lại bộ sưu tập bằng cách sử dụng thẻ trình lặp S2 nó sẽ đẩy đối tượng lên trên cùng của giá trị ngăn xếp, có nghĩa là , nói rằng bạn có bộ sưu tập các đối tượng người dùng mà bạn đang lặp lại như

<s:iterator value="userCollection"> 

</s:iterator> 

nên khi điều này sẽ lặp, S2 iterator sẽ đẩy đối tượng user trên đầu trang của giá trị ngăn xếp và nếu chúng tôi muốn đề cập đến name tài sản của user đối tượng, tất cả chúng ta cần phải tham chiếu đến thuộc tính tên

<s:property name="userName"/> 

từ OGNL sẽ cố gắng giải quyết userName trong giá trị ngăn xếp và chúng tôi đã có đối tượng người dùng là đối tượng cấp cao nhất trong stack.I giá trị đề nghị phải đi qua các tài liệu thẻ Iterator và làm thế nào nó đẩy giá trị

+0

đối tượng cấp cao nhất không quan trọng. # được sử dụng để chỉ rõ một cách rõ ràng đối tượng cần xử lý cho dù nó có ở trên đầu hay không. –

0

tôi nghĩ rằng nó giải quyết vấn đề của bạn

s:iterator value="reviews" status="position"> 
    <img src="<s:property value="#request.restaurant.portalImage.url"/>"/> 
    <s:property value="#position.user.firstName"/> 
    <s:property value="#position.user.lastName"/> 
    <s:property value="#position.rating"/> 
    <s:property value="#position.review"/> 
</s:iterator> 

yêu cầu của bạn hơi khó hiểu

2

Tôi đã dành toàn bộ buổi chiều của mình chiến đấu chống lại một vấn đề tương tự. Trong trường hợp của tôi, vấn đề là biến lặp của tôi (Trong trường hợp của bạn reviews) có một trường có cùng tên với biến ngoài.

Không có vấn đề làm thế nào cứng tôi đã cố gắng để thoát ra khỏi ngăn xếp cục bộ của iterator, nó sẽ không truy cập vào biến bên ngoài.

Nếu đánh giá của bạn iterator có một trường gọi là nhà hàng đi của nó để ghi đè lên bên ngoài nhà hàng biến, không có gì khó khăn khi bạn cố gắng :(

Các giải pháp tôi tìm thấy là chỉ đơn giản là đổi tên ngoài biến (ví dụ: theRestaurant)..

Khi tôi đổi tên nó, nó đã không còn đụng độ với các biến bên trong, và tôi đã có thể truy cập nó từ bên trong iterator

+1

Cảm ơn, điều này đã giúp ích rất nhiều! Một giải pháp khác là lưu trữ "giá trị bên ngoài" trong biến cục bộ TRƯỚC KHI trình vòng lặp bằng cách sử dụng thẻ và tham khảo biến cục bộ này thay vào đó ( hoặc $ {theRestaurant}). – mmuller

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