`

使用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
分享到:
评论

相关推荐

    Struts2入门教程(全新完整版)

    一、准备工作及实例 3 1.解压struts-2.1.6-all.zip 3 2.六个基本包 3 3.初识struts2配置文件 4 ... 下面对struts2的基本执行流程作一简要说明,此流程说明可以结合官方提供的struts2结构图来看: 60

    struts项目学习笔记

    Struts2 是一个非常优秀的MVC框架,基于Model2 设计模型 由传统Struts1和WebWork两个经典框架发展而来 Struts2框架=Struts2+XWork Strust2 核心功能 允许POJO(Plain Old Java Objects,简单javabean对象,没有继承,...

    jfreechar 整合struts2.1.8版本生成线图,饼图,柱形图

    -- package提供了将多个Action组织为一个模块的方式 package的名字必须是唯一的 package可以扩展 当一个package扩展自 另一个package时该package会在本身配置的基础上加入扩展的package 的配置 父package必须...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part2

     9.2 利用拦截器(Interceptor)生成审计日志  9.3 Hibernate的事件处理机制  9.4 批量处理数据  9.4.1 通过Session来进行批量操作  9.4.2 通过StatelessSession来进行批量操作  9.4.3 通过HQL来进行批量操作 ...

    Struts2的配置文件基础

    Struts2框架中核心组件就是Action、拦截器等,Struts2框架使用包来管理Action和拦截器等。每个包就是多个Action、多个拦截器、多个拦截器引用的集合。在struts.xml文件中package元素用于定义包配置,每个package元素...

    Spring面试题

    5.Dispathcher查询一个或多个ViewResolver视图解析器,找到ModelAndView对象指定的视图对象 6.视图对象负责渲染返回给客户端。 为什么用: {AOP 让开发人员可以创建非行为性的关注点,称为横切关注点,并将它们插入...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part4

     9.2 利用拦截器(Interceptor)生成审计日志  9.3 Hibernate的事件处理机制  9.4 批量处理数据  9.4.1 通过Session来进行批量操作  9.4.2 通过StatelessSession来进行批量操作  9.4.3 通过HQL来进行批量操作 ...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part3

     9.2 利用拦截器(Interceptor)生成审计日志  9.3 Hibernate的事件处理机制  9.4 批量处理数据  9.4.1 通过Session来进行批量操作  9.4.2 通过StatelessSession来进行批量操作  9.4.3 通过HQL来进行批量操作 ...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part1.rar

     9.2 利用拦截器(Interceptor)生成审计日志  9.3 Hibernate的事件处理机制  9.4 批量处理数据  9.4.1 通过Session来进行批量操作  9.4.2 通过StatelessSession来进行批量操作  9.4.3 通过HQL来进行批量操作 ...

    java面试题

    答:Struts1和Struts2是两个完全不同的框架,Struts1以ActionServlet作为核心控制器,由ActionServlet负责拦截用户的所有请求。Struts2以核心控制器FilterDispatcher为基础,包含了框架内部的控制流程和处理机制。 ...

    spring in action英文版

     8.3.5 在一个控制器中处理多个动作  8.3.6 使用一次性控制器  8.4 视图解析  8.4.1 使用模板视图  8.4.2 解析视图Bean  8.4.3 选择视图解析器  8.5 使用Spring的绑定标签  8.6 处理异常  ...

    经典JAVA.EE企业应用实战.基于WEBLOGIC_JBOSS的JSF_EJB3_JPA整合开发.pdf

    10.4.2 将实体映射到多个表 394 10.4.3 映射复合类型的属性 396 10.4.4 映射实体类的主键 398 10.5 关联关系映射 402 10.5.1 单向N-1关联 403 10.5.2 单向1-1关联 406 10.5.3 单向1-N关联 409 10.5.4 单向N-N...

    Spring中文帮助文档

    13.4.3. 拦截器(HandlerInterceptor) 13.5. 视图与视图解析 13.5.1. 视图解析器(ViewResolver) 13.5.2. 视图解析链 13.5.3. 重定向(Rediret)到另一个视图 13.6. 本地化解析器 13.6.1. ...

    Spring API

    13.4.3. 拦截器(HandlerInterceptor) 13.5. 视图与视图解析 13.5.1. 视图解析器(ViewResolver) 13.5.2. 视图解析链 13.5.3. 重定向(Rediret)到另一个视图 13.6. 本地化解析器 13.6.1. ...

    Spring 2.0 开发参考手册

    13.4.3. 拦截器(HandlerInterceptor) 13.5. 视图与视图解析 13.5.1. 视图解析器 13.5.2. 视图解析链 13.5.3. 重定向(Rediret)到另一个视图 13.6. 本地化解析器 13.6.1. AcceptHeaderLocaleResolver 13.6.2....

    Spring-Reference_zh_CN(Spring中文参考手册)

    13.4.3. 拦截器(HandlerInterceptor) 13.5. 视图与视图解析 13.5.1. 视图解析器 13.5.2. 视图解析链 13.5.3. 重定向(Rediret)到另一个视图 13.5.3.1. RedirectView 13.5.3.2. redirect:前缀 13.5.3.3. forward:...

    Java面试宝典2020修订版V1.0.1.doc

    3、当一个线程进入一个对象的一个synchronized方法后,其它线程是否可进入此对象的其它方法? 56 4、线程的基本概念 57 5、什么是多线程 57 6、程序、进程、线程之间的关系 57 7、创建线程有几种方式,分别是什么? ...

Global site tag (gtag.js) - Google Analytics