`
zy116494718
  • 浏览: 471277 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Struts2中Action执行顺序

阅读更多
struts2后台ACTION中方法的执行顺序
后台ACTION类:
public class DownloadAction extends ActionSupport {
private String downloadFileName;
private String inputPath;

public DownloadAction(){
System.out.println("DownloadAction^^^^^^^^^^^^^^^^^^");
}

    public void setInputPath(String value) {

       inputPath = value;

    }

   public InputStream getInputStream() throws Exception {
   String photoName=ActionContext.getContext().getSession().get("photoName").toString();
       return ServletActionContext.getServletContext().getResourceAsStream ("\\files\\"+photoName);

   }    
   public String execute() throws Exception {
         return SUCCESS;
   }  
  
   public String getDownloadFileName() {
   System.out.println("getDownloadFileName^^^^^^^^^^^^^^^^^^^^^^");
this.downloadFileName=ActionContext.getContext().getSession().get("photoName").toString();
return downloadFileName;
}

public void setDownloadFileName(String downloadFileName) {
this.downloadFileName = downloadFileName;
}

public void validate(){
System.out.println("validate^^^^^^^^^^^^^^^^^^^^^^^^^^");
}

public String download(){
System.out.println("download^^^^^^^^^^^^^^^^^^^^^^");
return SUCCESS;
}

}
struts.xml中action的配置:
<action name="download" class="com.globalzt.struts2.action.DownloadAction" method="download">
            <result name="success" type="stream">
                <param name="contentType">image/jpg</param>
                <param name="inputName">inputStream</param>
                <!-- 使用经过转码的文件名作为下载文件名,downloadFileName属性对应action类中的方法 getDownloadFileName() -->
                <param name="contentDisposition">attachment;filename="${downloadFileName}"</param>
                <param name="bufferSize">4096</param>
            </result>
        </action>

执行顺序:
DownloadAction^^^^^^^^^^^^^^^^^^
validate^^^^^^^^^^^^^^^^^^^^^^^^^^
download^^^^^^^^^^^^^^^^^^^^^^
getDownloadFileName^^^^^^^^^^^^^^^^^^^^^^

由此可见,其执行顺序为:
1.构造函数
2.验证函数
3.目标函数
4.属性的get方法


补充:
如果重写了父类的excute()方法,那么如果指定了触发的ACTION,则不执行该excute()函数。


原文出处:http://code.iteye.com/blog/277677





上图中的“分流”是指根据我们所请求的url把request交给某个指定的action来处理。那么在这个FilterDispatcher中还有一些什么操作呢?在Struts1中我们经常要把一个ActionForm和一个Action相关联,ActionForm中封装了表单的所有值,并且这些都是在ActionServlet中完成的,因此我们在action中可以直接通过ActionForm得到表当中的值,那么Struts2中又是怎么做的呢?我们怎么取得那些值呢?我发现可以这么做:对表单中每一个要获取的值,在action中相应添加这样的一个域,然后再设置相应的set和get方法,即采用javabean风格,貌似这个现在比较流行。比方说在前面的例子中,在sayHello.jsp的表单中有一个文本域,它的name=”name”,在我的action文件HelloWorld.java中有一个域private String name;同时还分别设置了相应的setName和getName方法,现在我把setName方法改为如下:

public void setName(String name) {

       System.out.println("name:"+name);     

this.name = name;

}

OK,在浏览器中输入http://localhost:8888/Struts/sayHello.jsp,这时我们发现后台打印出了name:CMTobby,CMTobby是我输入的name的值,这说明setName方法被执行了,奇怪啊,我们根本没有显式的调用这个方法啊,它是什么时候调用的呢?现在我们在setName方法里面设置一个断点,然后再在execute方法里面设置一个断点,再次运行我们的程序,结果显示setName方法在execute方法前面执行。

接着,无聊的我又做了一些测试:

1.把setName改为setName1,结果页面输出:Hello null,并且setName1为执行

2.在sayHello.jsp的form之外加了一个文本框,取名address,在HelloWorld中增加相应的域address、setAddress方法和getAddress方法,通过断点测试发现,setAddress方法不会执行。

基于以上测试,我认为在执行action的操作之前,首先会根据请求页面的form表当中所包含的参数来调用action中相应的set****方法,比如说,本例中,form中有name属性,因此会在执行execute之情调用setName方法,而address因为不在form中所以不会调用setAddress方法.

在处理完请求之后如何把用户所请求的值回传到结果页面当中呢?在HelloWorld.jsp中我们用了<s:property value="name" />,嘿嘿,难道又是隐式的调用了getName方法吗?于是我在HelloWorld.java的getName方法处设置了一个断点,再次运行我们的程序,果然getName被隐式的调用了。

此外如果我把<s:property value="name" />中value的值改为别的如name1,这时页面出错,一片空白。我接着又把getName方法改为getName1,这时页面仍然一片空白,因为取不到name属性的值。如果我把<s:property value="name" />改为

<s:property value="name1" />,同时也把getName改为getName1,那么显示就正常了,这个表明框架会根据属性的名字去调用相应的get方法。

上述机制是不是和我们前面所讨论的BeanUtils的copyProperties方法一样,实际上很多ORM框架都采用的这个机制,都是首先得到属性名再调用相应的set或者get方法,而不是直接访问的域。



本文来自CSDN博客:http://blog.csdn.net/CMTobby/archive/2007/07/26/1710368.aspx
分享到:
评论

相关推荐

    struts2流程与流程图

     一旦Action执行完毕,ActionInvocation负责根据struts.xml中的配置找到对应的返回结果result。 Struts 2的核心控制器是FilterDispatcher,有3个重要的方法:destroy()、doFilter()和Init(),可以在Struts 2的下载...

    Struts2架构剖析

    action command在穿越了一系列Struts2和XWork的拦截器之后,最后执行用户编写的Action类,在Action执行之后,响应还会穿越相同的拦截器(按照与请求相反的顺序),最后通过Struts2的HttpServletResponse转换成Web可...

    struts2.0.jar

    Struts 2.0框架中出现的许多特性旨在让Struts更容易使用: · 改进的设计: 与Struts 1相比,...· 易于定制的控制器: Struts 1允许请求处理程序可按照模块来定制,在Struts 2中,需要的话,可以按照动作来定制请求处理

    Struts拦截器及token拦截器防止重复提交例子源码

    Struts2拦截器的实现原理相对简单,当请求struts2的action时,Struts 2会查找配置文件,并根据其配置实例化相对的 拦截器对象,然后串成一个列表,最后一个一个地调用列表中的拦截器 三、定义Struts2拦截器。 ...

    struts2拦截器示例

    struts2拦截器可以控制action的执行顺序,这个小示例直接在Tomcat下配置完就可以发布

    基于Struts2的图书管理系统源代码

    2. 模糊查询时,因同时需要进行where筛选,SQL语句无法执行,只好分开查询,先进行模糊查询,查询结果存放到list表中,再通过遍历list表进行判断是否符合where的条件,若符合,则存入另一个list表中。这种方法虽然...

    理解拦截器用于在某个方法或字段被访

    谈到拦截器,还有一个词大家应该知道——拦截器链(Interceptor Chain,在Struts 2中称为拦截器栈Interceptor Stack)。拦截器链就是将拦截器按一定的顺序联结成一条链。在访问被拦截的方法或字段时,拦截器链

    FilterAndInterceptor

    本资源是包含过滤器、拦截器的一个完整的MyEclipse项目。下载后可以直接导入MyEclipse中部署运行。 关于过滤器和拦截器: 过滤器--是在java web中,提前...执行顺序:过滤前 - 拦截前 - Action处理 - 拦截后 - 过滤后

    JAVA程序开发大全---上半部分

    本书内容丰富、技术全面、案例实用,而且所有的实例都以MyEclipse工程的形式组织,并按章节的顺序组织在附书光盘中,源代码工程都经过精心调试,可以直接导入MyEclipse中运行。 本书内容精练、重点突出、实例丰富,...

    ssh(structs,spring,hibernate)框架中的上传下载

     以上是Spring+Hibernate将文件二进制数据持久化到数据库的解决方案,而Struts通过将表单中file类型的组件映射为ActionForm中类型为org.apache.struts.upload. FormFile的属性来获取表单提交的文件数据。  工程...

    Spring面试题

    构造注入的优点:可以在构造器中决定依赖关系的顺序。 什么是AOP? 面向切面编程(AOP)完善spring的依赖注入(DI),面向切面编程在spring中主要表现为两个方面 1.面向切面编程提供声明式事务管理 2.spring...

    java面试题

    select执行顺序? 答:from where group by having select order by Collection和Collections的区别? 答:Collection是集合类的父类,继承它的主要由set和list Collections是针对集合类的帮助类,它提供了一...

    很好的银行系统源代码

    5.Struts1.2.7 的 Validator验证框架 不稳定,只能显示第一个参数,同时执行多个验证时参数的显示顺序也不对,是程序原因还是 配置不正确,再上网查找。 6.本项目大部分错误都用异常的形式来处理,异常虽可以使程序...

    ARCH4系统开发指南

    2.28.2 Struts2校验框架应用 71 2.28.2.1 校验配置文件 71 2.28.2.2 角色Insert页面示例 71 2.28.2.3 用户Query页面示例 73 2.28.2.4 多行输入域校验 75 2.29 多语言管理 77 2.29.1 定义输入域的name属性和资源文件 ...

    Java面试宝典2010版

    5、谈谈Struts中的Action servlet。 6、Struts优缺点 优点: 1. 实现MVC模式,结构清晰,使开发者只关注业务逻辑的实现. 7、STRUTS的应用(如STRUTS架构) 8、说说struts1与struts2的区别。 9、hibernate中的update...

    最新Java面试宝典pdf版

    5、谈谈Struts中的Action servlet。 120 6、Struts优缺点 优点: 1. 实现MVC模式,结构清晰,使开发者只关注业务逻辑的实现. 120 7、STRUTS的应用(如STRUTS架构) 121 8、说说struts1与struts2的区别。 121 9、...

    Java面试笔试资料大全

    5、谈谈Struts中的Action servlet。 120 6、Struts优缺点 优点: 1. 实现MVC模式,结构清晰,使开发者只关注业务逻辑的实现. 120 7、STRUTS的应用(如STRUTS架构) 121 8、说说struts1与struts2的区别。 121 9、...

Global site tag (gtag.js) - Google Analytics