【发布时间】:2011-03-21 12:23:47
【问题描述】:
使用struts2,它会通过ognl自动在我们的action中创建bean,在我们创建新对象的时候很容易使用,例如在用户注册页面,我们构建一个表单来填写他们的信息,在action中我们得到属性填充的bean,我们可以直接保存(可能需要一些验证),就是这么简单。
但是如何更新数据库中已存在的对象呢?
我们可以构建一个表单,(预先填充页面中可以更新的属性),当用户进行一些修改时,我们更新它。
但是我们在action中得到的bean是struts2创建的(我们称这个bean为bean_struts2),而我们要更新的是db中的(我们称这个bean为bean_db)。
现在的问题是如何将bean_struts2的修改复制到bean_db?
对于非嵌套对象,我们可以迭代bean_struts2的所有属性,并将其设置为bean_db。
例如:
bean_db.setPassword(bean_struts2.getPassword());
.....
但是当要更新的bean是嵌套对象时,就没有那么容易了。
就我而言,这些是实体:
class Task{
Object non_updatedProperty;
List<TaskSteps> steps;
List<User> managers;
User publisher;
}
class User{
id,name;
}
class TaskStep{
id,name;
List<Operator> operators;
TaskStepStatus status;
}
enum TaskStepStatus{
ongoing,completed.
}
class Operator{
id,name;
}
要更新的bean是“Task”对象。
在页面中:
<s:form action="task_update" namespace="/common" cssStyle="width:95%">
<s:textfield value="%{task.id}" cssStyle="display:none" name="task.id"></s:textfield>
<s:textfield value="%{task.publisher.name}" readonly="true" label="Publisher"></s:textfield>
<s:textfield name="task.name" value="%{task.name}" label="Task Name"/>
<table>
<caption align="left">Steps</caption>
<tr>
<th>Step Name</th>
<th>Operators</th>
<th>Status</th>
<th>Set order</th>
<th><span id="addStep" style="cursor:pointer" >Add a step</span></th>
</tr>
<s:iterator value="task.steps">
<tr class="step">
<td>
<s:textfield name="task.steps[0].name" value="%{#this.name}" theme="simple"/>
<s:textfield name="task.steps[0].id" value="%{#this.id}" theme="simple" cssStyle="display:none"/>
</td>
<td><s:textfield name="task.steps[0].end" value="%{#this.end}" theme="simple"/></td>
<td>
<s:select list="allOpIndb" listKey="id" listValue="name" value="%{#this.operator.{id}}"
name="task.steps[0].operator.id" multiple="true" theme="simple" id="a">
</s:select>
</td>
<td>
<s:select list="@com.zjswkj.location.entity.TaskStepStatus@values()" theme="simple"
name="task.steps[0].status" listValue="cnValue" value="%{#this.status}" id="b"/>
</td>
<td>
<span class="up">up</span>
<span class="down">down</span>
<span class="del">del</span>
</td>
<td></td>
</tr>
</s:iterator>
</table>
</s:form>
通过struts2,我可以得到bean_strtus2(Task),它的id和bean_db是一样的。 我可以轻松地将其非嵌套属性复制到 bean_db。但是它的TaskSteps的属性和它的TaskSteps的操作符呢?
只需使用:
task_db.setTaskSteps(task_struts2.getTaskSteps());??
当然不会,这可能会导致一些新的同名TaskStep被持久化到数据库中。
还有一些属性是不能更新的,比如Task的“non_updatedProperty”属性是不能更新的,只能在创建任务时设置。
所以在更新表单中,我没有提供 UI 来更新这个属性,所以如果我们调用:
task_db.setNon_updateProperty(task_struts2.getNon_updateProperty);
会错过现有的属性,因为
task_struts2.getNon_updateProperty==null; !!!
我只是想知道是否有一些好主意来处理这些类型的更新?
我不确定你们是否知道我的意思,但我已经尽力表达了。
如果有更多问题,我仍然可以更新。
【问题讨论】: