项目里的更新操作写的不赖,分为两步,解决了数据不同步的问题:
第一步:预处理:提取、编辑单个信息
第二步:把预处理的结果传给真正的执行者,修改保存
这个预处理有点意思,它把一个业务细分成俩个操作,第二个操作能根据处理结果返回到预处理的结果上继续修改,等于把一次update完完全全分成两个互不影响的操作了。
执行的数据流:
1.jsp提交要更改的id
<td><s:a href="updatePUser.action?user.id=%{#ul.id}">update</s:a>
提交到UpdatePUserAction(注意有个“P”)
2.UpdatePUserAction
这是个预处理的action,P是perview的意思
public String execute() throws Exception
{
user = this.service.findById(user.getId());
return SUCCESS;
}
这个UpdatePUserAction挺有意思,经过它的预处理 看似麻烦了,其实把流程划分的清晰了很多
user = this.service.findById(user.getId());
这的前后两个user不是一个对象:
后一个user只有从jsp传来的id属性
前一个user是通过id查找到的完整的对象
3.struts处理
UpdatePUserAction返回SUCCESS后
跳转到新的 /update.jsp
<action name="updatePUser" class="updatePUserAction">
<result name="success">/update.jsp</result>
</action>
这两个action多例就行了,没有其他特别的配置
<bean id="updatePUserAction" class="com.test.action.user.UpdatePUserAction" scope="prototype">
<property name="service" ref="userService"></property>
</bean>
<bean id="updateUserAction" class="com.test.action.user.UpdateUserAction" scope="prototype">
<property name="service" ref="userService"></property>
</bean>
4.update.jsp
把表单提交到真正的 UpdateUserAction(不带P了)
这ID用户是不应该改的,所以表单中要用 hidden 传个隐藏值,其余就是正常输入
<s:form action="updateUser">
<table>
<tr>
<td>
<s:hidden name="user.id" value="%{user.id}"></s:hidden>
</td>
</tr>
5.struts验证
UpdateUserAction-validation.xml
和昨天学的struts2的验证框架一样
6.UpdateUserAction
真正的执行,
public String execute() throws Exception
{
this.service.update(user);
return SUCCESS;
}
执行的结果如果成功了,就重定向到ListUserAction
如果有误就去重新输入,之前预处理出来的结果也还都在
<action name="updateUser" class="updateUserAction">
<result name="success" type="redirect">listUser.action</result>
<result name="input">/update.jsp</result>
</action>