论坛首页 入门技术论坛

webwork同一个ACTION不同操作时,域值的困惑。

浏览 3769 次
该帖已经被评为新手帖
作者 正文
   发表时间:2007-01-18  
    webwork中,在1个ACTION内,定义了2个方法,init()用于加载JSP页面时调用(如:test!init.action,初始化JSP的一些显示初始值(例如firstString)。
    用户对于JSP进行选择或输入后,点击提交,执行ACTION的另一个方法execute(),(如:test!execute.action),但是,这时在execute这个方法执行时,init()设置的域值都丢失了(firstString),重新为NULL。这个问题如何解决呢?
public class Test extends ActionSupport {
	
	private String firstString;
	private String secondString;
	
	public String init() throws Exception{
		firstString = "init in init()";
		return SUCCESS;
	}
	
	public String execute() throws Exception{
		secondString = firstString;
		return SUCCESS;
	}

	public String getFirstString() {
   		return firstString;
	}

	public void setFirstString(String firstString) {
		this.firstString = firstString;
	}

	public String getSecondString() {
		return secondString;
	}

	public void setSecondString(String secondString) {
		this.secondString = secondString;
	}

}

    我的理解是,因为webwork是基于线程独立的,是不同的actionContext,因此,init()和execute()执行时,其实处于不同的线程实例,因此,init()里初始化的值,在execute()中,已不可见。不知道对不对?
    那样的话,是不是我只能把init()的值(firstString)放到Session或者request中。除此之外,还有其他方法不?
    谢谢!
   发表时间:2007-01-18  
你分析的不错,ww对每个线程都会重新生成action实例,所以action的实例是不会在不同线程中共享的。

推荐几个做法:
1,把init处理后的数据做为隐藏域放到页面的form中,然后一并提交至action中处理。
2,利用spring2.0的session生命周期来管理这个action。(这个做法我没试过,只是理论上觉得可以)

一般我的做法都是用第一种方法~
0 请登录后投票
   发表时间:2007-01-18  
另外还可以考虑用 webwork 的 continuation 方法..
0 请登录后投票
   发表时间:2007-01-18  
定义个抽象类继承ActionSupport,然后在抽象类中的execute调用init,后你的Action继承这个抽象类
0 请登录后投票
   发表时间:2007-01-18  
一般我也是采用hidden的input来传递参数,如果参数不多且不存在安全性问题,不建议用session.session终究是要保存在服务器端的,消耗内存,而且如果你不自己动手清,一直要占用到session过期。

页面传递比较好,消耗少。
0 请登录后投票
   发表时间:2007-01-20  
谢谢各位的答复!
我发现,如果仅仅为了维持一个简单的String,Integer这种数值的话,使用hidden的确是一个解决的方法。
我举的例子比较简单,实际在用时,可能要维持一个对象实例,例如,一个查询页面,刚打开时,用一个List对象表示可供选则地区siteList,每一个list元素是一个SiteVO对象。在init()中初始化,在JSP中放到一个hidden中,在execute()中发现,siteList的确有值,但是值是这样:
[com.mysite.vo.SiteVO@1f9cdda, com.mysite.vo.Site@139d369]
根本无法再还原为原来的siteList了。
0 请登录后投票
   发表时间:2007-02-02  
郁闷,我现在用webwork只是管理请求分发,这些方法都没用过
0 请登录后投票
   发表时间:2007-02-14  
让Spring来管理Action。Scope设成"session"。
0 请登录后投票
   发表时间:2007-02-14  
晕,http form只能传点文本的,你企图传一个对象,那你就做一下序列化啊…… asp.net就是那么干的,一大堆东西序列化后放到hidden实现页面状态的效果。你直接把一个list对象toString当然只有一堆ref地址了。
0 请登录后投票
   发表时间:2007-02-22  

在配置文件中这样配置就可以了,比如:

xml 代码
  1. <action name="init"  
  2.    class="xxx.Test" method="init">  
  3.    <result name="success" type="chain">test.action</result>  
  4.   </action>  
  5.      
  6.   <action name="test"  
  7.    class="xxx.Test">  
  8.    <result name="success">xxx.jsp</result>  
  9.   </action>  

注意指明type="chain"就可以了

 

0 请登录后投票
论坛首页 入门技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics