Struts2系列:(18)ActionProxy

ActinoProxy的全名是com.opensymphony.xwork2.ActionProxy,

ActionProxy = Action + Proxy,从字面意思来解释:Action的代理。

在Struts中,ActionContext、ActionInvocation、ActionProxy、ActionConfig联系的很紧密。

ActionContext<-->ActionInvocation<-->ActionProxy-->ActionConfig

(1.1)从ActionContext对象可以得到ActionInvocation对象

(1.2)从ActionInvocation对象可以得到ActionContext对象

(2.1)从ActionInvocation对象可以得到ActionProxy对象

(2.2)从ActionProxy对象可以得到ActionInvocation对象

(3.1)从ActionProxy对象可以得到ActionConfig对象

在搜索的时候 ,遇到一句描述ActionInvocation和ActionProxy关系的话,感觉非常切中要害:

Essentially, ActionProxy encapsulates how an Action can be obtained. ActionInvocation encapsulates how the Action is executed when a request is invoked.

本质上来,ActionProxy对如何获取Action对象进行了封装,而ActionInvocation对如何执行Action进行了封装。

原话地址:https://struts.apache.org/docs/action-proxy-actionproxy-factory.html

Typically, an ActionProxy will utilize the ActionInvocation to encapsulate the execution of a particular request.

The ActionInvocation determines how an Action is handled: Is it being intercepted? Is there a PreResultListener acting on it?

在上面图中,

ActionConfig,负责从struts.xml文件中读取配置;

ActionSupport,我们自己实现的Action类一般都继承ActionSupport类;

ActionContext,是Action运行的环境,为Action类提供一些信息;

ActionProxy,是如何获取Action;

ActionInvocation是如何执行Action。

上面标的(1)至(4),都能通过ActionProxy来获得:

(1)表示当前Action类在struts.xml文件中对应的<action>标签所在的<package>标签的namespace属性

(2)表示<action>标签的name属性

(3)表示真实的Action类的实例,不是字符串类型,而<action>标签的class属性对应的类的实例化。

(4)<action>标签的method属性

从我个人理解的角度来说(可能理解是不对的),ActionProxy实现了URL和真正Action类之间的映射。



1、如何获取ActionProxy对象

ActionProxy proxy = invocation.getProxy();

2、如何获取ActionProxy中的值

(1)获取当前<action>所在的命名空间

String namespace = proxy.getNamespace();

(2)获取<action>的名字

String actionName = proxy.getActionName();

(3)获取Action类的实例

Object action = proxy.getAction();

(4)获取<action>执行的方法

String method = proxy.getMethod();

(5)得到ActionInvocation和ActionConfig对象

ActionConfig config = proxy.getConfig();

ActionInvocation invocation2 = proxy.getInvocation();

3、ActionProxy的源代码

package com.opensymphony.xwork2;

import com.opensymphony.xwork2.config.entities.ActionConfig;

/**
 * ActionProxy is an extra layer between XWork and the action so that different proxies are possible.
 * <p/>
 * An example of this would be a remote proxy, where the layer between XWork and the action might be RMI or SOAP.
 *
 * @author Jason Carreira
 */
public interface ActionProxy {

    /**
     * Gets the Action instance for this Proxy.
     *
     * @return the Action instance
     */
    Object getAction();

    /**
     * Gets the alias name this ActionProxy is mapped to.
     *
     * @return the alias name
     */
    String getActionName();

    /**
     * Gets the ActionConfig this ActionProxy is built from.
     *
     * @return the ActionConfig
     */
    ActionConfig getConfig();

    /**
     * Sets whether this ActionProxy should also execute the Result after executing the Action.
     *
     * @param executeResult <tt>true</tt> to also execute the Result.
     */
    void setExecuteResult(boolean executeResult);

    /**
     * Gets the status of whether the ActionProxy is set to execute the Result after the Action is executed.
     *
     * @return the status
     */
    boolean getExecuteResult();

    /**
     * Gets the ActionInvocation associated with this ActionProxy.
     *
     * @return the ActionInvocation
     */
    ActionInvocation getInvocation();

    /**
     * Gets the namespace the ActionConfig for this ActionProxy is mapped to.
     *
     * @return the namespace
     */
    String getNamespace();

    /**
     * Execute this ActionProxy. This will set the ActionContext from the ActionInvocation into the ActionContext
     * ThreadLocal before invoking the ActionInvocation, then set the old ActionContext back into the ThreadLocal.
     *
     * @return the result code returned from executing the ActionInvocation
     * @throws Exception can be thrown.
     * @see ActionInvocation
     */
    String execute() throws Exception;

    /**
     * Gets the method name to execute, or <tt>null</tt> if no method has been specified (meaning <code>execute</code> will be invoked).
     *
     * @return the method to execute
     */
    String getMethod();

    /**
     * Gets status of the method value‘s initialization.
     *
     * @return true if the method returned by getMethod() is not a default initializer value.
     */
    boolean isMethodSpecified();
    
}
时间: 2024-10-26 13:56:03

Struts2系列:(18)ActionProxy的相关文章

[Android学习系列18]线程,进程,异步的一些事

解决NetworkOnMainThreadException http://www.aitinan.com/4387.html 参考: android进程与线程详解一:进程 android进程与线程详解二:线程 android进程与线程详解三:AsyncTask android进程与线程详解四:线程安全和进程间通信 [Android学习系列18]线程,进程,异步的一些事,码迷,mamicode.com

深入struts2.0(六)--ActionProxy类

1.1     ActionProxy接口以及实现 ActionProxy在struts框架中发挥着非常重要的作用.通过webwork和xwork交互关系图可以看出,它是action和xwork中间的一层. 正因为ActionProxy的存在导致Action调用更加简洁.接下来我们一起研究下这个核心类. 1.1.1       ActionProxy接口方法 图 3.3.1 ActionProxy接口主要方法图 ActionConfig getConfig();该方法主要是获得创建ActionP

【SSH框架】之Struts2系列(一)

微信公众号:compassblog 欢迎关注.转发,互相学习,共同进步! 有任何问题,请后台留言联系 1.Struts2框架概述 (1).什么是Struts2 Struts2是一种基于MVC模式的轻量级web框架,本质上相当于一个servlet.在MVC设计模式中,Struts2作为控制器来建立模型与视图的数据交互,以WebWork为核心,采用拦截器机制来处理用户的请求,使得业务逻辑控制器能够与ServletAPI完全脱离,是致力于组件化和代码重用的J2EE Web框架. (2).Struts2

【SSH框架】之Struts2系列(二)

微信公众号:compassblog 欢迎关注.转发,互相学习,共同进步! 有任何问题,请后台留言联 1.Struts2常量配置 (1).Struts2默认常量配置文件路径,如下图: (2).Struts2常量配置方式:以配置国际化字节编码UTF-8为例 方式1:在struts.xml文件中配置 <constant name="struts.i18n.encoding" value="UTF-8"></constant> 方式2:在src下创建

《Entity Framework 6 Recipes》中文翻译系列 (18) -----第三章 查询之结果集扁平化和多属性分组

翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 3-14  结果集扁平化 问题 你有一对多关联的两个实体,你想通过一个查询,获取关联中的两个实体的扁平化投影.扁平化或者叫压缩,这是不规范的叫法.它是指一个有父类和子类的对象图,被投影到一个单独的类中. 解决方案 假设你有一对拥有一对多关联的实体,如图3-15所示的模型. 图3-15 模型中,一个代表助理的Associate的实体类型和一个代表助理工资历史的AssociateSalary实体

Struts2系列:(12)拦截器

学习拦截器 1.拦截器能够做什么?(Why 和 What) 2.如何定义拦截器?(How to use) 3.如何注册拦截器?(How to use) 4.如何使用拦截器?(How to use) 1.拦截器能够做什么? Struts2 拦截器在访问某个 Action 方法之前或之后实时拦截的可插拔的组件. 拦截器栈(Interceptor Stack): 将拦截器按一定的顺序联结成一条链. 实现原理:当请求action时,Struts 查找配置文件,根据其配置实例化拦截器对象,并形成一个列表,

Struts2系列:(16)Interceptor组成的链是如何进行调用的

首先看一下com.opensymphony.xwork2.interceptor.Interceptor的源码: public interface Interceptor extends Serializable {     /**      * Called to let an interceptor clean up any resources it has allocated.      */     void destroy();     /**      * Called after 

Struts2系列笔记(3)---Action类的3种书写方式

Action类的3种书写方式 本文主要写有关写Action类的3种书写方式: (1)第一种 Action可以是POJO (简单模型对象)  不需要继承任何父类 也不需要实现任何接口 (2)实现Action接口 (3)继承ActionSupport(推荐) 那我们先来书写第一种: (1)第一种 Action可以是POJO (简单模型对象)  不需要继承任何父类 也不需要实现任何接口 1 //这里其实就是一个普通的类,类里面的方法可以任意写,如果写execute()方法那就代表默认执行它 2 pub

Struts2系列:(15)对于Validator接口的探究

1在com.opensymphony.xwork2.validator包下定义了Validator接口. public interface Validator<T> {     //... } validator分为两大类:Plain Validators和FieldValidators. The validators come in two different flavors: a)Plain Validators / Non-Field validators b)FieldValidato