`
zy116494718
  • 浏览: 476877 次
  • 性别: 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 拦截器的执行顺序(二十九)

    在Struts2中,每个拦截器的执行顺序是由`struts-default.xml`或自定义的配置文件中`&lt;interceptor-stack&gt;`元素定义的。默认情况下,Struts2提供了一些预定义的拦截器,如`params`(处理请求参数)、`exception`(处理...

    Struts2 in action(struts2实战)

    - **Action**:在Struts2中,Action是业务逻辑的载体,负责处理用户请求并返回结果。每个Action对应一个特定的用户操作。 - **Result**:Action执行完毕后,会返回一个Result,定义了页面跳转或数据呈现的方式。 ...

    struts2配置文件加载顺序

    配置文件在Struts2中起着至关重要的作用,它们定义了请求如何被映射到特定的Action,以及如何处理结果。了解Struts2配置文件的加载顺序对于优化应用性能和解决配置问题至关重要。 Struts2的配置主要分布在以下几个...

    struts2 result转向到action

    在 Struts2 中使用 `redirect-action` 来实现 Action 之间的跳转是一种常见的做法,特别是在需要按顺序执行多个 Action 的业务场景中。通过这种方式,不仅可以保持应用程序的良好结构,还能有效地组织业务流程。同时...

    Struts2InAction中文+源代码

    SampleApplication是《Struts2 in Action》书中配套的示例项目,包含了完整的Struts2应用结构。这个项目可以帮助读者理解如何组织Struts2的配置文件、动作类、视图和模型,以及如何将它们整合在一起形成一个功能完备...

    简单理解Struts2中拦截器与过滤器的区别及执行顺序

    Struts2 中拦截器与过滤器的区别及执行顺序 Struts2 中的拦截器(Interceptor)和过滤器(Filter)是两个不同的概念,虽然它们都可以影响请求的处理过程,但它们的作用域、执行顺序和实现机制都有所不同。 拦截器...

    Struts2--为Action的属性注入值

    在Struts2中,Action类是处理用户请求的核心组件,它封装了业务逻辑。为Action的属性注入值是Struts2的一个关键特性,使得我们可以方便地从请求参数中获取数据并绑定到Action实例上,以便后续的业务处理。 这个特性...

    Struts 2使用注解配置Action

    1. `@Action`: 这是Struts 2中最核心的注解,用于标记一个方法为处理请求的Action。你可以指定Action的名字、结果页面和其他属性。例如: ```java @Action(value = "myAction", results = { @Result(name = ...

    Struts2执行原理

    Struts2中的过滤器链包括了`ActionContextCleanUp`,它负责清理ActionContext,确保每个请求都有独立的上下文。接下来可能会有其他自定义过滤器如`OtherFilters`和`SiteMesh`, SiteMesh则主要用于页面布局和装饰,...

    struts2简单例子

    在Struts2中,模型负责业务逻辑,视图负责展示数据,而控制器接收用户请求并协调模型和视图的交互。 2. **Struts2入门**: 创建一个简单的Struts2应用通常涉及以下步骤: - 引入Struts2库:在项目中添加Struts2的...

    struts2面试题

    (8)Action 执行完毕后,返回一个 result 字符串,此时再按相反的顺序通过 Interceptor 拦截器。 (9)最后 ActionInvocation 负责根据 struts.xml 中配置的 result 元素,找到与返回值对应的 result,决定进行下...

    struts2注解配置Action及拦截器几种不同方式写法对应的路径指向.docx

    Struts2 中的拦截器链(Interceptor Stack)是用于定义多个拦截器的执行顺序的组件。拦截器链可以通过 XML 配置文件方式来配置。下面是一个简单的拦截器链示例: ```xml ``` 在上面的示例中,我们定义了一个...

    Struts2 Struts2 超好的Struts2 pdf 文档

    3. **拦截器(Interceptors)**:拦截器是Struts2的一大特色,它们按照预定义的顺序在Action调用前后执行,可以实现如日志记录、权限验证、性能监控等功能。常见的拦截器有`params`(处理请求参数)、`validation`...

    struts2-action.pdf

    `ActionInvocation`在Struts2框架中扮演着调度者的角色,负责整个Action执行过程的调度。它不仅负责调用Action的`execute`方法,还负责拦截器链的执行顺序,以及最终结果的处理。`ActionInvocation`通过调用拦截器链...

    struts2与前台交互时序

    3. **拦截器(Interceptors)**:在Action执行之前,一系列的拦截器会按照预定义的顺序被调用。这些拦截器可以实现各种功能,如登录检查、数据验证、日志记录等。拦截器是Struts2的一大特色,它们提供了扩展框架功能的...

    最新Manning - Struts 2 in Action

    - 第三章深入介绍了Struts 2中的动作(Action),这是处理用户请求的主要组件。 - 动作通常包含业务逻辑,并负责将数据传递给视图层进行展示。 - 讨论了如何编写和配置动作类,以及如何利用Struts 2的拦截器来增强...

    struts2 源码解读

    Interceptor是拦截器,是Struts2的一大特色,它允许我们在Action执行前后插入自定义的处理逻辑,例如日志记录、权限检查等。 在Struts2的执行流程中,当一个HTTP请求到达,DispatcherServlet会根据配置找到对应的...

Global site tag (gtag.js) - Google Analytics