С Struts2 он автоматически создаст bean-компонент в нашем действии через ognl, его легко использовать при создании нового объекта, например, на странице регистрации пользователя, мы создаем форму для использования, чтобы заполнить их информацию. и в действии мы получаем свойства заполненного компонента, мы можем сохранить его напрямую (возможно, потребуется некоторая проверка), это так просто.
Но как насчет обновления существующего объекта в БД?
Мы можем создать форму (предварительно заполнив свойства, которые могут быть обновлены на странице), когда пользователь вносит изменения, мы обновляем его.
Но компонент, который мы получаем в действии, создается Struts2 (мы называем этот компонент bean_struts2), и то, что мы хотим обновить, находится в БД (мы называем этот компонент bean_db).
Теперь проблема в том, как скопировать модификации bean_struts2 в bean_db?
Для не вложенного объекта мы можем выполнить итерацию всех свойств bean_struts2 и установить для него bean_db.
Например:
bean_db.setPassword(bean_struts2.getPassword());
.....
Но не так просто, когда обновляемый компонент является вложенным объектом.
В моем случае это сущности:
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;
}
Обновляемый компонент - это объект "Задача".
На странице:
<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), его идентификатор совпадает с bean_db.
Я могу легко скопировать его не вложенные свойства в bean_db. но как насчет свойств его TaskSteps и операторов его TaskSteps.
Просто используйте:
task_db.setTaskSteps(task_struts2.getTaskSteps());??
Конечно нет, это может привести к тому, что какой-то новый TaskStep с тем же именем будет сохранен в БД.
Кроме того, некоторые свойства не могут быть обновлены, например, свойство Task «non_updatedProperty» не может быть обновлено, его можно установить только при создании задачи.
Итак, в форме обновления я не предоставил пользовательский интерфейс для обновления этого свойства, поэтому, если мы вызовем:
task_db.setNon_updateProperty(task_struts2.getNon_updateProperty);
пропустит существующее свойство, потому что
task_struts2.getNon_updateProperty==null; !!!
Мне просто интересно, есть ли какие-нибудь хорошие идеи для обработки этих типов обновлений?
Я не совсем уверен, что вы, ребята, знаете, что я имею в виду, но я изо всех сил стараюсь выразить это.
Если есть еще вопросы, я могу обновить их.