Search code examples
javajspcollectionsstrutsjavabeans

How to "logic:iterate" just one object?


So, I have this code:

logic:iterate name="nameForm" property="name" id="nameId" indexId="index"
bean:write name="nameId" property="field1"/
bean:write name="nameId" property="field2"/

This works great because I'm receiving a "table of objects" so I can do the iterate without issues.

Now, on another page I need to do the same but the issue is I am not receiving a "table of objects" but an object itself. I tried it nonetheless and - as expected - got the error: Cannot create iterator for this collection

I've RTFM'd and I'm still more confused than before.
I get how the "name" inside the "logic:iterate" points to the form name in the struts-config, now I need to do the same with just one bean, any help please?


Solution

  • You can use a bean name with the <logic:iterate>, but it should be a collection or array, or implement Iterable. Here's the example of the tag usage.

    In Struts, you can use logic:iterate tag to iterate over collections. Here’re the example:

    Iterate over a list/array (Object)

    Create a normal list with few "user" objects and store it into HttpServletRequest as name "listUsers".

    public class User{
    
      String username;
      String url;
    
        //getter and setter methods
    }
    
    
    ...
    
    public class PrintMsgAction extends Action{
    
      public ActionForward execute(ActionMapping mapping,ActionForm form,
          HttpServletRequest request,HttpServletResponse response) 
            throws Exception {
    
          List<User> listUsers = new ArrayList<User>();
    
          listUsers.add(new User("user1", "http://www.user1.com"));
          listUsers.add(new User("user2", "http://www.user2.com"));
          listUsers.add(new User("user3", "http://www.user3.com"));
          listUsers.add(new User("user4", "http://www.user4.com"));
    
          request.setAttribute("listUsers", listUsers);
    
          return mapping.findForward("success");
      }
    
    }
    

    Inside the logic tag, you can use the "name" attribute (listUsers) to get the list value, while "property" attribute to display the object property value.

    <%@taglib uri="http://struts.apache.org/tags-bean" prefix="bean"%>
    <%@taglib uri="http://struts.apache.org/tags-logic" prefix="logic"%>
    <html>
    <head>
    </head>
    <body>
    <h1>Struts <logic:iterate> example</h1>
    
    <logic:iterate name="listUsers" id="listUserId">
    <p>
      List Users <bean:write name="listUserId" property="username"/> , 
      <bean:write name="listUserId" property="url"/>
    </p>
    </logic:iterate>
    
    </body>
    </html>
    

    enter image description here