`

Struts2 ActionProxy

阅读更多
/*
 * Copyright (c) 2002-2006 by OpenSymphony
 * All rights reserved.
 */
package com.opensymphony.xwork2;

import com.opensymphony.xwork2.config.Configuration;
import com.opensymphony.xwork2.config.ConfigurationException;
import com.opensymphony.xwork2.config.entities.ActionConfig;
import com.opensymphony.xwork2.inject.Inject;
import com.opensymphony.xwork2.util.LocalizedTextUtil;
import com.opensymphony.xwork2.util.logging.Logger;
import com.opensymphony.xwork2.util.logging.LoggerFactory;
import com.opensymphony.xwork2.util.profiling.UtilTimerStack;

import java.io.Serializable;
import java.util.Locale;

import org.apache.commons.lang.StringUtils;


/**
 * The Default ActionProxy implementation
 *
 * @author Rainer Hermanns
 * @author Revised by <a href="mailto:hu_pengfei@yahoo.com.cn">Henry Hu</a>
 * @author tmjee
 * 
 * @version $Date: 2009-05-08 05:54:47 +0200 (Fr, 08 Mai 2009) $ $Id: DefaultActionProxy.java 1991 2009-05-08 03:54:47Z musachy $
 * @since 2005-8-6
 */
public class DefaultActionProxy implements ActionProxy, Serializable {
	
	private static final long serialVersionUID = 3293074152487468527L;

	private static final Logger LOG = LoggerFactory.getLogger(DefaultActionProxy.class);

    protected Configuration configuration;
    protected ActionConfig config;
    protected ActionInvocation invocation;
    protected UnknownHandlerManager unknownHandlerManager;
    protected String actionName;
    protected String namespace;
    protected String method;
    protected boolean executeResult;
    protected boolean cleanupContext;

    protected ObjectFactory objectFactory;

    protected ActionEventListener actionEventListener;

    /**
     * This constructor is private so the builder methods (create*) should be used to create an DefaultActionProxy.
     * <p/>
     * The reason for the builder methods is so that you can use a subclass to create your own DefaultActionProxy instance
     * (like a RMIActionProxy).
     */
    protected DefaultActionProxy(ActionInvocation inv, String namespace, String actionName, String methodName, boolean executeResult, boolean cleanupContext) {
        
        this.invocation = inv;
		this.cleanupContext = cleanupContext;
		if (LOG.isDebugEnabled()) {
			LOG.debug("Creating an DefaultActionProxy for namespace " + namespace + " and action name " + actionName);
		}

		this.actionName = actionName;
		this.namespace = namespace;
		this.executeResult = executeResult;
        this.method = methodName;
    }
    
    @Inject
    public void setObjectFactory(ObjectFactory factory) {
        this.objectFactory = factory;
    }
    
    @Inject
    public void setConfiguration(Configuration config) {
        this.configuration = config;
    }
    
    @Inject
    public void setUnknownHandler(UnknownHandlerManager unknownHandlerManager) {
        this.unknownHandlerManager = unknownHandlerManager;
    }
    
    @Inject(required=false) 
    public void setActionEventListener(ActionEventListener listener) {
        this.actionEventListener = listener;
    }

    public Object getAction() {
        return invocation.getAction();
    }

    public String getActionName() {
        return actionName;
    }

    public ActionConfig getConfig() {
        return config;
    }
    
    public void setExecuteResult(boolean executeResult) {
        this.executeResult = executeResult;
    }

    public boolean getExecuteResult() {
        return executeResult;
    }

    public ActionInvocation getInvocation() {
        return invocation;
    }

    public String getNamespace() {
        return namespace;
    }

    public String execute() throws Exception {
        ActionContext nestedContext = ActionContext.getContext();
        ActionContext.setContext(invocation.getInvocationContext());

        String retCode = null;

        String profileKey = "execute: ";
        try {
        	UtilTimerStack.push(profileKey);
        	
            retCode = invocation.invoke();
        } finally {
            if (cleanupContext) {
                ActionContext.setContext(nestedContext);
            }
            UtilTimerStack.pop(profileKey);
        }

        return retCode;
    }


    public String getMethod() {
        return method;
    }

    private void resolveMethod() {
        // if the method is set to null, use the one from the configuration
        // if the one from the configuration is also null, use "execute"
        if (StringUtils.isEmpty(this.method)) {
            this.method = config.getMethodName();
            if (StringUtils.isEmpty(this.method)) {
                this.method = "execute";
            }
        }
    }

    protected void prepare()  {
        String profileKey = "create DefaultActionProxy: ";
        try {
            UtilTimerStack.push(profileKey);
            config = configuration.getRuntimeConfiguration().getActionConfig(namespace, actionName);
    
            if (config == null && unknownHandlerManager.hasUnknownHandlers()) {
                config = unknownHandlerManager.handleUnknownAction(namespace, actionName);
            }
            if (config == null) {
                String message;
    
                if ((namespace != null) && (namespace.trim().length() > 0)) {
                    message = LocalizedTextUtil.findDefaultText(XWorkMessages.MISSING_PACKAGE_ACTION_EXCEPTION, Locale.getDefault(), new String[]{
                        namespace, actionName
                    });
                } else {
                    message = LocalizedTextUtil.findDefaultText(XWorkMessages.MISSING_ACTION_EXCEPTION, Locale.getDefault(), new String[]{
                        actionName
                    });
                }
                throw new ConfigurationException(message);
            }

            resolveMethod();
            
            if (!config.isAllowedMethod(method)) {
                throw new ConfigurationException("Invalid method: "+method+" for action "+actionName);
            }

            invocation.init(this);

        } finally {
            UtilTimerStack.pop(profileKey);
        }
    }
}

分享到:
评论
2 楼 yangjuanjava 2010-06-16  
  
1 楼 yangjuanjava 2010-06-16  
支持支持!!!!!

相关推荐

    struts2源代码分析

    ActionProxy是Struts2中的一个重要组件,因为它封装了Action的实例化和调用过程。通过ActionProxy,开发者可以实现更复杂的逻辑,如动态Action映射或延迟加载Action。 Struts2的视图组件被封装在`org.apache.struts...

    struts2 源码分析

    Struts2 的架构图主要包括 Filter chain、ActionMapper、ActionProxy、ActionInvocation 和 Result 等组件。Filter chain 负责处理请求,Filter 主要包括 ActionContextCleanUp,它主要清理当前线程的 ActionContext...

    Struts2+技术内幕——深入解析Struts2架构设计与实现原理

    在源码分析部分,你将了解到Struts2如何解析HTTP请求,如何通过ActionMapper定位Action,ActionProxy是如何创建并执行Action的,以及RequestProcessor的角色。通过阅读源码,开发者能更深入地理解Struts2的工作原理...

    struts2面试题

    Struts2 面试题 Struts2 是基于 Java 语言的 Web 应用程序框架,继承自 WebWork 框架。Struts2 的主要特点是使用 FilterDispatcher 作为核心控制器,将请求分发到相应的 Action 中。下面是 Struts2 面试题中涉及到...

    Struts2源码分析

    `ActionProxy`是`com.opensymphony.xwork2.ActionProxy`,它是Action的代理接口,负责调用实际的Action对象的`execute()`方法。通过这个代理,Struts2能够动态地决定调用哪个Action以及如何调用。`StrutsActionProxy...

    深入浅出Struts2.pdf

    **Struts2 框架详解** Struts2 是一个基于 Model-View-Controller (MVC) 设计模式的开源Java Web框架,由Apache软件基金会维护。它为开发者提供了构建可扩展、模块化且易于维护的Web应用的强大工具。本资料“深入浅...

    struts2重要知识点原理

    Struts2是一个流行的Java web开发框架,主要用于构建MVC(模型-视图-控制器)架构的应用程序。它的设计目标是简化开发过程,提供强大的验证和国际化功能,以及灵活的插件架构。Struts2的核心是基于拦截器的Action...

    Struts2初步使用总结

    在Struts2中,所有的Action调用都是通过`ActionProxy`来完成的。 通过以上内容,我们可以看到Struts2是一个功能强大且易于使用的Java Web开发框架,它简化了Web应用程序的开发过程,使开发者能够更专注于业务逻辑的...

    Struts2 工作原理 Struts2框架 有图

    Struts2框架作为Java Web开发领域中的一款经典MVC(Model-View-Controller)框架,其工作原理涉及到了一系列复杂的组件交互与流程控制。本文将深入解析Struts2的工作流程,帮助开发者理解其核心机制。 ### 一、...

    Struts2精简jar包

    Struts2是一个流行的Java web应用程序框架,用于构建和维护可扩展、模块化且易于管理的MVC(模型-视图-控制器)架构的应用程序。它提供了丰富的功能集,旨在简化开发流程并提高代码的可测试性。这个"Struts2精简jar...

    Struts2源码阅读

    Struts2是一个流行的Java Web应用程序框架,用于构建MVC(模型-视图-控制器)架构的应用。源码阅读对于理解其工作原理至关重要。本文将深入探讨Struts2的核心概念、类和请求处理流程。 首先,我们来看Struts2的架构...

    Struts2 动态方法调用(十三)

    2. **ActionProxy**:是Struts2的核心组件之一,它创建Action实例并管理Action的生命周期。当ActionMapper解析出方法名后,ActionProxy会根据这个名字来决定调用哪个方法。 3. **ActionInvocation**:表示Action...

    Struts1与Struts2原理 区别详解汇总

    4. **ActionProxy处理请求**:ActionProxy根据配置文件(struts.xml)找到需要调用的具体Action类,并创建ActionInvocation实例。 5. **执行Action**:ActionInvocation通过代理模式调用Action,并在调用前加载...

    struts2 源码绝对完整

    2. **com.opensymphony.xwork2.DefaultActionProxy**:ActionProxy负责创建并管理Action实例,执行Action的业务逻辑。 3. **com.opensymphony.xwork2.interceptor.DefaultWorkflowInterceptor**:这是默认的工作流...

    struts2运行机制

    `ActionProxy`是Struts2中处理Action请求的关键组件,它通过`Configuration Manager`查询框架配置文件,找到与请求匹配的Action类。 ##### 6. ActionInvocation实例化与执行 `ActionProxy`会创建一个`...

    struts2版本 2.1.6 必须的jar包 和 web.xml 文件的修改

    1. **struts2-core.jar** - 包含Struts2框架的核心组件,如ActionContext、ActionProxy、Dispatcher等。 2. **struts2-convention-plugin.jar** - 提供了约定优于配置的特性,允许根据类名和方法名自动映射Action。 ...

    Struts2资源

    ActionProxy是Struts2框架的重要组成部分,它通过获取XML配置信息来确定下一步操作,并根据当前的Action信息创建ActionInvocation实例,从而大大减轻了Action的复杂度。 4. **ActionInvocation**:表示Action的执行...

    struts2 源码解读

    1. `ActionProxy`:它是Struts2的核心,负责创建并执行Action。理解其内部如何根据配置信息找到并实例化Action是关键。 2. `Invocation`:表示拦截器链的执行过程,封装了ActionContext和ActionInvocation,其中...

    struts2流程与流程图

    一个请求在Struts 2框架中的处理大概分为以下几个步骤。  客户端提交一个(HttpServletRequest)请求,如上文在浏览器中输入 http://localhost: 8080/bookcode/ch2/Reg.action就是提交一个(HttpServletRequest)...

Global site tag (gtag.js) - Google Analytics