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>
分享到:
相关推荐
- XML配置:在`struts.xml`文件中,使用`<interceptor>`元素定义拦截器,`<interceptor-stack>`元素组合多个拦截器,`<package>`元素下的`interceptors`属性指定拦截器栈。 ```xml <!-- 可以添加其他内置或...
### Struts2拦截器详解 #### 一、Struts2拦截器概述 Struts2框架作为Java Web开发中的一种流行框架,其核心组件之一便是**拦截器**。拦截器不仅在Struts2中扮演着重要角色,更是整个框架灵活性与扩展性的基石。...
2. **拦截器链**:在Struts2中,多个拦截器可以形成一个拦截器链,每个拦截器按照定义的顺序依次执行。如果所有拦截器都允许Action执行,那么Action的结果将被传递到下一个拦截器,直到整个链执行完毕。 ### 二、...
Struts2提供了许多内置的拦截器,比如`defaultStack`拦截器堆栈,包含了多个常用的拦截器,如模型驱动(ModelDriven)、参数拦截器(Parameters)、验证器(Validation)等。使用内置拦截器可以大大简化开发过程。 ...
使用`<interceptor-stack>`标签可以组合多个拦截器形成拦截器栈。通过`<package>`标签的`default-interceptor-ref`属性,可以指定默认拦截器栈,或者在具体的Action配置中使用`interceptor-ref`引用特定的拦截器栈。...
Struts2中的拦截器不是单独工作的,而是以链式结构组织起来,形成所谓的拦截器栈。每个拦截器栈由多个拦截器按照特定顺序排列,当请求到来时,会依次通过这些拦截器。这种配置通常在`struts.xml`或`struts-plugin....
Struts2是一个强大的Java web应用程序框架,...通过深入学习和实践这个案例,你可以更全面地理解和掌握Struts2框架,特别是拦截器的使用,以及如何结合JPA进行数据访问。这将有助于提升你在Java web开发领域的技能。
3. 配置拦截器栈:Struts2使用拦截器栈的概念,即将多个拦截器组织成一个栈,按照栈的顺序依次执行。在`struts.xml`中,可以创建一个或多个拦截器栈,并将权限拦截器包含在内。 4. 应用拦截器:在Action配置中,...
拦截器栈是Struts2中拦截器的组织方式,它将多个拦截器按照预设的顺序组合成一个链式结构。在Action的执行过程中,这些拦截器会被依次调用,每个拦截器都有机会在Action方法执行前后进行干预。拦截器栈的顺序至关...
2. 拦截器配置:在struts.xml配置文件中,你可以定义多个拦截器,并通过`<interceptor>`和`<interceptor-stack>`元素来组织它们。例如,创建一个名为`myInterceptorStack`的拦截器栈,包含`logging`和`validation`两...
了解了拦截器的基本原理后,我们可以通过`Struts2.x 拦截器.avi`这个视频文件深入学习Struts2拦截器的实现细节,比如如何编写自定义拦截器、如何配置拦截器链、如何处理异常等。`readme.txt`可能是关于这个主题的...
### Struts2拦截器的使用 ...使用Struts2的拦截器机制,我们可以轻松地控制用户的访问权限,并实现更加安全的Web应用开发。希望这篇文档能帮助读者更好地理解Struts2拦截器的使用及其在实际开发中的作用。
2. **内置拦截器**:Struts2提供了许多内置的拦截器,如`params`拦截器用于从请求中提取参数并注入到Action对象,`exception`拦截器处理未捕获的异常,`i18n`拦截器处理国际化,`logger`拦截器记录日志等。这些拦截...
通过以上详细介绍,我们了解了Struts2中的拦截器和验证框架的基本概念、如何创建自定义拦截器以及如何配置拦截器和使用验证功能。这些知识点对于初学者来说非常重要,能够帮助他们更好地理解和使用Struts2框架。
Struts拦截器是Java Web开发中的重要概念,尤其在基于Struts 2框架的应用中扮演着核心角色。这个"struts拦截器的例子"提供了一个学习和理解拦截器工作原理的起点,非常适合对这一主题感兴趣的初学者。 Struts 2框架...
拦截器栈是由多个拦截器组成的一个链条,它们按顺序执行。同一个拦截器栈中的拦截器可以重复出现,每次出现的位置不同,因此可以控制其执行的顺序。拦截器栈使得我们可以灵活地组织和复用拦截器。 7. **应用场景**...
- 在`struts.xml`配置文件中,使用`<interceptors>`标签定义拦截器,`<interceptor>`子标签用于声明一个拦截器,`name`属性为拦截器的名称,`class`属性指定拦截器的完整类名。 - 使用`<interceptor-ref>`标签引用...
2. **如何实现**:Struts2提供了一个灵活的Interceptor框架,开发者可以通过实现Interceptor接口来自定义拦截器,也可以通过继承已有的拦截器实现来进行扩展。 3. **配置方式**:Interceptor的配置通过Struts2的配置...