使用struts2拦截器轻松更新对象多个属性(此对象有继承结构)

1、如果你的方法设计的是二个参数
public void modify(Organization org, int pid) {
//要在页面中把没有在修改页面上列出的字段值用隐含域传递到Action中进行赋值,否则 //没有修改的字段值会为null
if(pid != 0){
//如果pid !=0说明他不是顶级机构,这时要维护它和父类之间的关系
org.setParent(get(pid));
}
this.getHibernateTemplate().update(org);
}


2、如果你的方法设计的是一个参数:
假设我们一个对象有100个字段,如果我们只要修改其中的2个字段,这个时候如果用第一种方法就不大现实了,太麻烦了,所以我们可以用传过来的org对象的id把这个对象在修改之前先查询出来,然后把要修改的俩个字段设置到查询上来的对象中,然后更新查询上来的对象即可
public void modify(Organization org) {
Organization oldOrg = this.get(org.getId());
oldOrg.setOrgName(org.getOrgName());
oldOrg.setDescr(org.getDescr());
//在这里因为我们下面update的是oldOrg所以他的父类关系已经有了不用我们维护了
this.getHibernateTemplate().update(oldOrg);
}


3、如果你的方法设计的是一个参数:
假设我们一个对象有100个字段,如果我们只要修改其中的98个字段,那么我们又该如何做呢?

public void modify(Organization org) {
Organization oldOrg = this.get(org.getId());
//维护与父类的关系
org.setParent(oldOrg.getParent())
org.setXXX()//把没有修改的两个字段设置上
//如果用hibernate的update的方法在这个地方更新对象是会报错的,因为oldOrg用org的id load上来的他是持久化状态 而org此时是瞬时状态,在当update org的时候 org会变为持久化状态,而这时oldOrg和他拥有同样的id,所以会报错,我们要用merge方法
//this.getHibernateTemplate().update(org);
this.getHibernateTemplate().merge(org);
}


4、如果你的方法设计的是一个参数:
试想如果我们的一个对象有100个参数而我们要修改其中的50个参数,那么我们该怎么做呢,我们要么在页面中设置50个隐藏域要么在service层中用上面的方法重新设置50遍?我们可以用interceptor来实现
在Action中,我们一ModerDriven的方式来接受参数,因为我们要修改对象的50个属性,所以在Aciton中接受到的参数就有50个那么这个时候这个对象的另外50个属性的值就为空了,因为在得到这个对象的时候是用getModel方法得到的,所以我们可以在页面的50个参数传递过来之前,把这个对象先查询出来然后页面的参数传递过来之后会覆盖掉对象里原来的值而剩下的50个属性的值就保存在对象中了,这个时候在进行更新就可以了。
//1、定义查询对象的接口
public interface IUpdate {
public void preUpdate(int id);
}

//2、定义拦截器
public class MyInterceptor extends AbstractInterceptor {

@Override
public String intercept(ActionInvocation invoke) throws Exception {
if("update".equals(invoke.getProxy().getMethod())) {
if(invoke.getAction() instanceof IUpdate) {
IUpdate update = (IUpdate)invoke.getAction();
String[] ids = (String[])invoke.getInvocationContext().getParameters().get("id");
int id = Integer.parseInt(ids[0]);
update.preUpdate(id);
}
}
return invoke.invoke();
}

}

//3、Action中的应用
private OrgAction org ;
public void preUpdate(int id) {
org = this.orgService.get(id);
}

@Override
public Object getModel() {
if(org == null) {
org = new Organization();
//org.setDescr("xxxxxxxxxxxxxxx");
}
return org;
}


4、struts.xml文件中的配置

<package name="default" extends="struts-default">

<interceptors>
<interceptor name="updatableInterceptor" class="com.bjsxt.oa.util.MyInterceptor"/>
<interceptor-stack name="defaultStack">
<interceptor-ref name="exception"/>
<interceptor-ref name="alias"/>
<interceptor-ref name="servletConfig"/>
<interceptor-ref name="i18n"/>
<interceptor-ref name="prepare"/>
<interceptor-ref name="chain"/>
<interceptor-ref name="debugging"/>
<interceptor-ref name="scopedModelDriven"/>
<!--因为页面提交过来的参数是在modelDriven拦截器中进行赋值操作的,所以我们的拦截器必须定义在它的前面否则我们把要修改的值给覆盖掉了 -->
<interceptor-ref name="updatableInterceptor"/>
<interceptor-ref name="modelDriven"/>
<interceptor-ref name="fileUpload"/>
<interceptor-ref name="checkbox"/>
<interceptor-ref name="multiselect"/>
<interceptor-ref name="staticParams"/>
<interceptor-ref name="actionMappingParams"/>
<interceptor-ref name="params">
<param name="excludeParams">dojo\..*,^struts\..*</param>
</interceptor-ref>
<interceptor-ref name="conversionError"/>
<interceptor-ref name="validation">
<param name="excludeMethods">input,back,cancel,browse</param>
</interceptor-ref>
<interceptor-ref name="workflow">
<param name="excludeMethods">input,back,cancel,browse</param>
</interceptor-ref>
</interceptor-stack>

</interceptors>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值