-------------This post is orignal sent to Martin Gainty. It seems he maybe busy now,so I post it to the list and wonder if any other guys can do me a favor.
------------------- ---------- Forwarded message ---------- From: maven apache <apachemav...@gmail.com> Date: 2011/3/19 Subject: Re: update a complex object through struts2 To: Martin Gainty <mgai...@hotmail.com> Thank you very much for your attention and patience. The following is my codes,after trying the whole afternoon,I just can make the adding task page,thougth there is also some problem: I have a class named Task. class Task{ private int id; private String name; private List<Operator> managers; //the operator who will be responsible for this task private List<TaskStep> steps; //the required steps to complete this task //getter and setter } class TaskStep{ private int id; private String name; private List<Operator> operators; //the operator who will directly do this job private Status status; // the status of this step(complted or not) } enum Status{ ongoing,done; } My Action TaskAction(used to update and add task) class TaskAction extends ActionSupport{ private int taskid; private List<Operator> allOpInDb; private Task task; public String updatePage(){ //retrive the Task of id "takid", task=new TaskDaoImpl().queryById(taskid); // put it in the valuestack,so it can be referd in thejsp page //initization the allOpInDb allOpInDb=new OperatorDaoImpl().list(); return "updatePage"; } public String update(){ // } public String addPage(){ //initization the allOpInDb allOpInDb=new OperatorDaoImpl().list(); } public String add(){ // } } The struts.xml(core part) <package name="task" extends="struts-default" > <action name="task_*" class="TaskAction" method="{1}"> <result name="updatePage">/jsp/updatePage.jsp</result> <result name="update"></result> <result name="addPage">/jsp/addPage.jsp</result> <result name="add"></result> </action> </package> Now I have pages which are used to add/update a task(including its steps): By entering : http://xxxx/task_addPage; I get the addpage: <s:form action="task_add.action"> <s:textfield name="task.name" label="Task Name"> <s:select list="allOpInDb" listKey="id" listValue="name" multiple="true" label="Manager" name="task.managers.id"/> Steps: <!-- step01 --> <table> <tr> <th>Step Name</th> <th>Step Operators</th> <th>Step Status</th> </tr> <tr> <td><s:textfield name="task.steps[0].name"/></td> <td> <s:select list="allOpInDb" listKey="id" listValue="name" multiple="true" name="task.steps[0].id" /> </td> <td> <!-- Here,I do not know hwo to list the Status with the radio button --> <s:radio list="xx" name="task.steps[0].status" /> </td> </tr> <!-- step02 --> <tr> <td><s:textfield name="task.steps[2].name"/></td> <td> <s:select list="allOpInDb" listKey="id" listValue="name" multiple="true" name="task.steps[2].id" /> </td> <td> <!-- Here,I do not know hwo to list the Status with the radio button --> <s:radio list="xx" name="task.steps[2].status" /> </td> </tr> </table> <input type="text" value="add more steps"> </s:form> Question: 1)when to add the "[index]" syntax? For example: "task.steps[0].id" use this syntax,but "task.managers.id" does not. Both the steps and the managers are all java.uitl.List. I wonder why? 2)how to list the value of the enum type,in my case how to list "ongoing","done" as two radio button in the page? The above is the adding task page,and I have to build another page,updating task. By entering :http://xxx/task_updatePage?taskid=1<http://xxx/task_updatePage> I get the update page,It seems that it is more complex than the adding page: <s:form action="task_update.action"> <s:textfield name="task.name" value="task.name" label="Task Name"> <s:select list="allOpInDb" listKey="id" listValue="name" multiple="true" label="Manager" name="task.managers.id" value="task.managers.id"/> <table> <tr> <th>Step Name</th> <th>Step Operators</th> <th>Step Status</th> <th> </th> </tr> <!-- Iterator the steps of this task(these steps have id in the db yet) --> <s:iterator value="task.steps"> <tr> <td><s:textfield name="xxx" value="#this.name"></td> <td> <s:select list="allOpInDb" listKey="id" listValue="name" multiple="true" name="xxx" value="#this.operators"/> </td> <td> <!-- Here,I do not know hwo to list the Status with the radio button --> <s:radio list="xx" name="xxx" value="#this.status"/> </td> <td> <!--set the order of the steps --> <a>Make this step up</a><br> <a>Make this step down</a> </td> </tr> </s:iterator> </table> </s:form> As you can see,in the form I can just read the value form the stack,but I do not know how to set the "name" attribute of each input. Also,suppose all of these question are solved which I mean the value can be sent to the server side,so a new object of "Task" will be created by struts,since I am update this task,so this task must own a id in the db,I have the following things to do: 1)get the being updated Task from the db from the id. 2)copy all the field attributes of the Task object created by struts to the Task object in the db,this is crazy,since there are so many fields in the task,and even is field "List<TaskStep>" also own in in the db,I may make a duplicate object and save it to db. Any secury problem? BTW,the tag "s:select" with property of "multiple='true'" will take too much space in the page if the "list" own a large size,any way to slove this?