Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1606271
  • 博文数量: 695
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 4027
  • 用 户 组: 普通用户
  • 注册时间: 2013-11-20 21:22
文章分类

全部博文(695)

文章存档

2018年(18)

2017年(74)

2016年(170)

2015年(102)

2014年(276)

2013年(55)

分类: Java

2016-09-03 10:16:41

1. 关于action

Struts2会为每个处理线程分配一个 Action对象,将提交的参数注入到Action属性中,并调用Action的相关方法如execute()等完成业务逻辑,因此struts2的 Action会有多个对象。处理完毕,线程结束,Action也会被抛弃,Struts2的Action是线程安全的。

当Struts单独使用时action使用Struts2自己负责;当使用Spring+Struts联合使用时,action实例使用Spring负责创建。两种情况下的配置文件也略有不同。

1.Struts单独使用时,配置中action的class属性属于全路径名。

2.当和Spring联合使用时,class属性属于相应bean的id.

2. action中模型(model)对象的赋值

model对象在action的初始化(拦截器执行之前已经初始化完毕)过程中被创建 (通过action的构造函数)。当通过ModeDriven拦截器时,通过调用getModel()方法将model压入值栈。当调用action中的 业务逻辑方法(如:designSurvey()方法)时,需要给模型对象赋值。但此时值栈中的模型对象仍是旧对象,所以涉及到model对象的赋值问 题。

[java] view plain copy
  1. public Survey designSurvey() {    
  2.                this.model = surveyService(sid);  
  3.     return "designSurveyPage";  
  4. }  

2.1 使用paramsPrepareParamsStack和prepare拦截器

通过配置paramsPrepareParamsStack(prepare拦截器在ModeDriven拦截器之前)。使用prepare拦截器直接新模型对象赋给action中的模型。

[java] view plain copy
  1. public void prepareDesignSurvey(){  
  2.     this.model = surveyService.getSurveyWithChildren(sid);  
  3. }  

[java] view plain copy
  1. @Override  
  2. public Survey getSurvey(Integer sid) {    
  3.     return surveyDao.getEntity(sid);  
  4. }  
  5.   
  6. /** 
  7.  * 设计调查 
  8.  */  
  9. @Override  
  10. public Survey getSurveyWithChildren(Integer sid) {  
  11.     // 使用this.getSurvey()方法而不直接使用getEntity()方法体现的高内聚低耦合的思想,因为  
  12.     //此处设计service和dao两个组件之间的调用,如果是组件内部可以之间完成的功能就不要调用另一组件的方法  
  13.     Survey s = this.getSurvey(sid);  
  14.     for(Page p : s.getPages()){  
  15.         p.getQuestions().size();  
  16.     }  
  17.     return s;  
  18. }  

此方法性能不好,因为当有多个model时就需要多个prepareXxx()方法,造成方法爆炸。

2.2  通过刷新机制

通过配置ModelDriven拦截器中refreshModelBeforeResult属性为true来实现当发现model为新model时自动刷新(可参考ModelDrivenInterface源代码),一般采用此种方法。

[html] view plain copy
  1. <interceptors >  
  2.   
  3. <interceptor name="LoginInterceptor" class="com.xie.surveypark.struts2.interceptor.LoginInterceptor">
    阅读(1355) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~