2010-02-24 38 views
8

Tôi không thể tin một cái gì đó đơn giản này có vẻ khó khăn như vậy trong Struts 2.Struts 2 nesting iterators

Đây là khoảng những gì tôi muốn làm như nó sẽ được thực hiện trong Java.

for (Parent parent : parents){ 
    for (Child child: parent.getChildren()){ 
    System.out.println(child.getName()); 
    } 
} 

Điều đó sẽ dịch một cái gì đó gần với điều này trong các thẻ Stuts:

<s:iterator var="parent" value="parents"> 
    <s:iterator var="child" value="parent.children"> 
    <s:property value="child.name"/> 
    <s:iterator> 
<s:iterator> 

tôi giả parent.children nên một cái gì đó giống như $ {% (# parent.children)} nhưng tôi có không tìm thấy sự kết hợp đúng của $ {% (# ký tự để sử dụng :-). Tôi cũng có thể sử dụng liên kết đến trang giải thích thời điểm sử dụng một trong các trang này.

Trả lời

11

Hãy thử điều này:

<s:iterator var="parent" value="parents"> 
    <s:iterator var="child" value="#parent.children"> 
     <s:property value="#child.name"/> 
    <s:iterator> 
<s:iterator> 
+0

Điều đó có hiệu quả. Cảm ơn bạn. – Bloodboiler

+0

Ai đó có thể giải thích ý nghĩa của dấu #? Tôi đã phạm sai lầm giống như poster gốc. Cảm ơn! – Jim

+1

Trang này giải thích: http://struts.apache.org/2.x/docs/ognl.html – Nate

4

Nó làm việc cho tôi:

<s:iterator value="parents"> 
    <s:iterator value="children"> 
     <s:property value="name" /> 
    </s:iterator> 
</s:iterator> 
+1

Thanh lịch hơn câu trả lời được chấp nhận! Điều này làm việc vì mục hiện tại trong ieration sẽ được đẩy lên trên cùng của ngăn xếp, do đó không cần phải sử dụng var = "xxxx" để truy cập nó. – user1884155

1

Đây là cách mã JSP sẽ trông giống như:

<s:form action="saveaction" > 
     <s:iterator value="lstBean" id="lstBean" status="outerStat"> 
      <s:textfield value="%{name}" name="lstBean[%{#outerStat.index}].name"/> 
      <s:textfield value="%{amt}" name="lstBean[%{#outerStat.index}].amt"/> 
      <s:textfield value="%{id}" name="lstBean[%{#outerStat.index}].id"/> 
      <s:iterator value="%{lstString}" status="myStat"> 
       <s:textfield name="lstBean[%{#outerStat.index}].lstString[%{#myStat.index}]"/> 
      </s:iterator> 
     </s:iterator> 
     <s:submit value="Click me to submit lstBean"/> 
    </s:form> 

Tiếp theo là đậu (XBean) Danh sách của họ được sử dụng trong JSP:

public class XBean 
{  
private ArrayList<String> lstString=new ArrayList<String>(); 
private String name; 
private Double amt; 
private Integer id; 
//Getters and setters of fields 
} 

Bây giờ bạn có thể chỉ đơn giản là có một lĩnh vực lstBean với setters trong hành động gửi của bạn (saveaction) và hey bạn đã làm xong.

+1

Vì vậy, bạn có nghĩa là trong vòng lặp bên trong tôi cũng có thể nhận được quyền truy cập vào giá trị phần lặp lại bên ngoài? Tuyệt quá..... – FaithReaper

0

Đối với Struts 2.3.x bạn có thể sử dụng ví dụ này, được chiết xuất từ ​​http://struts.apache.org/release/2.3.x/docs/iterator-tag-examples.html

Trong ví dụ này, 'nước' là một danh sách các đối tượng nước, mỗi trong số đó có một cái tên và một danh sách các thành phố. Mỗi thành phố đều có một cái tên.

<s:iterator value="countries"> 
    <s:iterator value="cities"> 
     <s:property value="name"/>, <s:property value="[1].name"/><br> 
    </s:iterator> 
</s:iterator> 

Chúng đề cập đến một vị trí cụ thể trên ngăn xếp: '[1]'. Phía trên cùng của ngăn xếp, vị trí 0, chứa thành phố hiện tại, được đẩy bởi bộ lặp bên trong; vị trí 1 chứa quốc gia hiện tại, được đẩy bởi trình lặp bên ngoài.

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