浅谈struts2之chain[1]

        前一段时间,有关chain的机制着实困绕了许久.尽管网上有许多关于chain的解说,但要不是只谈大理论,不结合实例;要不就是只有示例,没有挖出示例背后的意义.

    先解释下chain吧:

  Chain:基本用途是构造成一条动作链。前一个动作将控制权转交给后一个动作,而前一个动作的状态在后一个动作里仍然保持着。动作链由Chaining拦截器负责处理,因为这个拦截器是defaultStack拦截器栈的一份子,多以你随时都可以使用动作链。

      有人说:chain是共享valuestack;也有人说chain是共享表单参数.就我个人而言,以上两种说法都不见完全正确.

      先看一个chain的例子:

  struts.xml:

      

<package name="default" extends="struts-default">
       <action name="action1" class="web.action.Action1">
           <result type="chain">action2</result>
       </action>

         <action name="action2" class="web.action.Action2">
         <interceptor-ref name="defaultStack"></interceptor-ref>
           <result>/result2.jsp</result>
       </action>
    </package>

   Action1.java

  

public class Action1 extends ActionSupport {
	private String str1;
	private String str2;

	 public String execute() throws Exception {

		return SUCCESS;

	}

	public String getStr1() {
		return str1;
	}
	public void setStr1(String str1) {
		this.str1 = str1;
	}
	public String getStr2() {
		return str2;
	}
	public void setStr2(String str2) {
		this.str2 = str2;
	}

}

Action2.java

public class Action2 extends ActionSupport {
	private String str1;
	private String str2;

	 public String execute() throws Exception {

		return SUCCESS;

	}

	public String getStr1() {
		return str1;
	}
	public void setStr1(String str1) {
		this.str1 = str1;
	}
	public String getStr2() {
		return str2;
	}
	public void setStr2(String str2) {
		this.str2 = str2;
	}

}

 

接着再上jsp文件:

result1.jsp

 

  <form action="action1.action" method="post">
        str1:<input type="text" name="str1"><br/>
        str2:<input type="text" name="str2"><br/>
        <input type="submit">
  </form>

 result2.jsp

    <s:debug/>
    str1:${str1 }
    <br/>
    str2:${str2 }

其实整个流程如下图所示:

运行结果也很简单,没有悬念:

  在result1.jsp输入:str1=111,str2=222

       在result2.jsp显示:str1=111,str2=222

 

下面进入探讨阶段:

  首先修改下action1.java,在action1中,修改valuestack中的str1的,如下所示:

   

public class Action1 extends ActionSupport {
	private String str1;
	private String str2;

	 public String execute() throws Exception {
		str1="set in action1";
		return SUCCESS;
	}
//省掉get,set
}

再次来运行.
  在result1.jsp输入:str1=111,str2=222

       在result2.jsp显示:str1=111,str2=222

结果很奇怪?为什么在result2.jsp不是显示str1=set in action1? 难道action1.java中修改过后的str1的值没有写入valuestack

那我们看看result2.jsp中通过<s:debug/>打印出来的信息.

从debug信息可以看出:

1)在action1的valuestack中,str1的确被成功修改了.

2)但是action2中的valuestack中,str1还是停留在页面上输入的str1的值

难道action1中的valuestack没有共享到action2中的valuestack?

为了进一步了解事实真相,我们继续来做实验:

接下来,我在action2.java中的setStr1(String str)中设置断点,跟踪action2中str1的赋值情况

发现:str1其实是被赋了两次值:第一次是"set in action1",而第二次是"111"

如此就得到了如上所示的运行结果.

很奇怪是吧?

我猜测第二次赋值中的"111"来自jsp提交过后产生的表单参数对象,即parameters.

为了验证猜测,我们把result1.jsp中的str1的输入去掉,如下代码所示:

  <form action="action1.action" method="post">

        str2:<input type="text" name="str2"><br/>
        <input type="submit">
  </form>

然后重新运行result1.jsp

运行过程所下:

   在result1.jsp中输入str2=222

           在result2.jsp中显示:str1=set in action1,str2=222

OK,如此,我们在action1中的对str1的修改成功传递给了action2,而action2中setStr1()也只执行了一次.

真相呼之欲出了,我们还是用一幅图来表示整个过程

如此,在执行第四步的时候,如果表单参数中和action1的valuestack中同时有str1这一项,

则表单参数中str1会覆盖action1的valuestack中的str1,最终action2的str1是以表单参数中的str1为准

 

好了,以上仅是根据运行结果作出的猜测和解释.

若想进一步了解事实的真相,从源代码的角度解释这一现象,可参考我接下来要写的<<浅谈struts2之chain[2]>>

先吃饭.下午接着写<<浅谈struts2之chain[2]>>

时间: 2024-08-04 04:07:32

浅谈struts2之chain[1]的相关文章

浅谈struts2之chain[2]

      上午写了<<浅谈struts2之chain[1]>>,现在接着写下半部分:从源码的角度谈chain的机制 因为我的源码全是通过反编译jar包得来,不能保证100%的正确性,若遇到不对的地方,请大家指出.也请大家先谅解 在<<浅谈struts2之chain[1]>>最后,用了一个简略图来表示chain机制: 但实际上,如果考虑valuestack的话,这幅图应该这样画: 对于此图中,关键性两个步骤:5和6, 实际上涉及到两个拦截器: 1)chain

浅谈Struts2的学习

今天无意中翻看了一下Struts2.0,结果发现它与Struts1.1有很大的变化,可以说已经变的面目全非了.作为程序员,又必须掌握最新的技术,因此,它一升级,我们就得跟着学习,真可谓不亦苦乎!但水来土掩兵来将挡,你有降龙十八掌,我有乾坤大挪移,咱们见招拆招,以不变应万变:管你山大王还是蜘蛛精,在我眼里,都是一堆白骨而已! 首先需要说明的是:在web开发中最好不要滥用Struts标签--能用html标签的就尽量使用html标签,比如一些最基本的页面对象如button,radio,label,te

浅谈Struts2下载文件的方法实现

Struts2下载文件实现的说明 contentType 内容类型,和互联网MIME标准中的规定类型一致,例如text/plain代表纯文本,text/xml表示XML, image/gif代表GIF图片,image/jpeg代表JPG图片 inputName 下载文件的来源流,对应着action类中某个类型为Inputstream的属性名,例如取值为inputStream的 属性需要编写getInputStream()方法 contentDisposition 文件下载的处理方式,包括内联(i

浅谈Struts2验证框架及用户注册

Struts2验证比起Struts1验证框架来,好用多了,使程序更加清晰易读,充分利用了配置文件的作用,也 算是解耦的表现吧. 核心代码如下: 1.用户注册页面register.jsp < ?xml:namespace prefix = s />< s:fielderror>< /s:fielderror> < /FONT> < !-- 读取显示提示信息 --> < TABLE> 用户名: 密码: < INPUT type=pa

浅谈struts和依赖注入在项目中的应用

我喜欢struts,喜欢ibatis,喜欢spring,但我却喜欢.net,这实在是件很矛盾的事情..net很好用,但在做项目的过程,总觉得缺少了点什么,对了,是框架.在java的世界里,有着许多成熟优秀的框架,但.net的框架,可选择的实在很少.在盼星星盼月亮的漫长过程里,终于盼到了Asp.net MVC,恕我不才,看来看去,都觉得这Asp.net MVC用起来实在是麻烦.我还是喜欢使用struts,尽管我很烦恼那些配置文件,但配置文件确实给我们带来了很多的好处.能轻松的扩展,轻易的修改.不过

面向对象浅谈

如今当我们谈到Web开发时,程序员们总是热衷于讨论一些我们耳熟能详的Web开发框架,如Struts2.Spring.Hibernate等.有些程序员将这些框架奉为宝典,并且趋之若鹜地挖掘框架的方方面面.比较各种开发框架的优劣.似乎对于这些框架的熟悉与否,似乎已成为衡量一个程序员是否精通Java,精通J2EE开发的事实标准.甚至在广大程序员找工作的过程中,这些主流的开发框架中的知识细节也常常成为面试中必考的元素,答不上这些问题,无疑会为找工作蒙上一层阴影.  面对这些框架,大家曾经是否真的思考过,

浅谈PHP拦截器之__set()与__get()的理解与使用方法_php实例

"一般来说,总是把类的属性定义为private,这更符合现实的逻辑. 但是,对属性的读取和赋值操作是非常频繁的,因此在PHP5中,预定义了两个函数"__get()"和"__set()"来获取和赋值其属性,以及检查属性的"__isset()"和删除属性的方法"__unset()". 我们为每个属性做了设置和获取的方法,在PHP5中给我们提供了专门为属性设置值和获取值的方法,"__set()"和&qu

浅谈Python中copy()方法的使用

  这篇文章主要介绍了浅谈Python中copy()方法的使用,Python中的拷贝分为潜拷贝和深拷贝,本文只是简单介绍用法,需要的朋友可以参考下 copy()方法返回字典的浅拷贝. 语法 以下是copy()方法的语法: ? 1 dict.copy() 参数 NA 返回值 此方法返回字典的浅拷贝. 例子 下面的例子显示了copy()方法的使用. ? 1 2 3 4 5 6 #!/usr/bin/python   dict1 = {'Name': 'Zara', 'Age': 7};   dict

浅谈document.write()输出样式

  这篇文章主要介绍了浅谈document.write()输出样式,十分的简单实用,有需要的小伙伴可以参考下. js中的最基本的命令之一:document.write(),用于简单的打印内容到页面上,可以逐字打印你需要的内容--document.write("content"),这里content就是需要输出的内容;当然还有一种情况,需要输出JS之中比如变量等等变化的东西,那么就需要用document.write(+variable);当然variable就是你想要输出的变量. 既然可