`

struts2源码分析 serviceAction

阅读更多
据说struts2是根据webwork修改过来的。下了struts2的代码看了看,果然跟webwork如出一辙。不过struts2貌似更简洁一些。

webwork的精华在于和http解耦,基于接口编程,以及利用IOC的解耦设计。拦截器是它非常漂亮的思想,当然实现也非常的漂亮。

下面是代码

public void serviceAction(HttpServletRequest request, HttpServletResponse response, ServletContext context, ActionMapping mapping) throws ServletException {
Map<String, Object> extraContext = createContextMap(request, response, mapping, context);

// If there was a previous value stack, then create a new copy and pass it in to be used by the new Action
//压栈
ValueStack stack = (ValueStack) request.getAttribute(ServletActionContext.STRUTS_VALUESTACK_KEY);
if (stack != null) {
extraContext.put(ActionContext.VALUE_STACK, ValueStackFactory.getFactory().createValueStack(stack));
}

String timerKey = "Handling request from Dispatcher";
try {
UtilTimerStack.push(timerKey);
String namespace = mapping.getNamespace();
String name = mapping.getName();
String method = mapping.getMethod();

String id = request.getParameter(XWorkContinuationConfig.CONTINUE_PARAM);
if (id != null) {
// remove the continue key from the params - we don't want to bother setting
// on the value stack since we know it won't work. Besides, this breaks devMode!
Map params = (Map) extraContext.get(ActionContext.PARAMETERS);
params.remove(XWorkContinuationConfig.CONTINUE_PARAM);

// and now put the key in the context to be picked up later by XWork
extraContext.put(XWorkContinuationConfig.CONTINUE_KEY, id);
}
//代理,实现了接口到实现的转换。
ActionProxy proxy = ActionProxyFactory.getFactory().createActionProxy(
configurationManager.getConfiguration(), namespace, name, extraContext, true, false);
proxy.setMethod(method);
request.setAttribute(ServletActionContext.STRUTS_VALUESTACK_KEY, proxy.getInvocation().getStack());

// if the ActionMapping says to go straight to a result, do it!
if (mapping.getResult() != null) {
Result result = mapping.getResult();
//执行action
result.execute(proxy.getInvocation());
} else {
proxy.execute();
}

// If there was a previous value stack then set it back onto the request
if (stack != null) {
request.setAttribute(ServletActionContext.STRUTS_VALUESTACK_KEY, stack);
}
} catch (ConfigurationException e) {
LOG.error("Could not find action or result", e);
sendError(request, response, context, HttpServletResponse.SC_NOT_FOUND, e);
} catch (Exception e) {
LOG.error("Could not execute action", e);
sendError(request, response, context, HttpServletResponse.SC_INTERNAL_SERVER_ERROR, e);
} finally {
UtilTimerStack.pop(timerKey);
}
}
分享到:
评论

相关推荐

    struts2 源码分析

    Struts2 源码分析 Struts2 是一个基于MVC 模式的Web 应用程序框架,它的源码分析可以帮助我们更好地理解框架的内部机制和工作流程。下面是Struts2 源码分析的相关知识点: 1. Struts2 架构图 Struts2 的架构图...

    Struts2源码阅读

    `ActionMapper`根据请求信息创建`ActionMapping`,然后在`Dispatcher`的`serviceAction`方法中,`ActionProxy`被创建。`ActionProxy`是Action的代理,负责找到Action实例,无论是本地还是远程。`ActionProxy`创建并...

    Struts2.3源码

    Struts2.3源码分析 Struts2作为一款经典的Java Web框架,是Apache软件基金会下的一个项目,它基于Model-View-Controller(MVC)设计模式,为开发者提供了构建可扩展、模块化且易于维护的Web应用的一种高效方式。...

    struts2工作原理及源码分析学习笔记

    在本文中,我们将深入探讨Struts2的工作原理和源码分析,以帮助理解其内在机制。 1. **Struts2架构图**: 当一个HTTP请求到达服务器时,它首先通过一系列Filter(过滤器),包括ActionContextCleanUp,该过滤器...

    浪曦struts2源码15课

    通过深入学习"浪曦struts2源码15课",你可以掌握Struts2框架的核心组件,如Action、Result、Interceptor(拦截器)的运作方式,理解Struts2的配置机制,以及如何使用Struts2进行MVC架构的开发。此外,还能了解如何...

    struts2源码研究

    Struts2 源码分析主要涉及其在Tomcat启动过程中的初始化步骤以及请求处理流程。首先,我们来看Tomcat启动时Struts2框架如何准备和执行。 在Tomcat启动时,Struts2的Filter文件被加载,具体是`...

    Struts 2权威指南源码.rar

    通过分析和运行这些源码,你可以深入了解Struts 2的架构、工作流程和最佳实践。对于初学者,可以从简单的示例开始,逐步了解并掌握其核心概念。对于有经验的开发者,源码可以帮助你更高效地解决实际项目中的问题。...

    TestStruts2程序源码

    通过分析"TestStruts2程序源码",你可以深入理解以上各个知识点的应用,包括Action的配置和实现、拦截器的使用、结果类型的设置,以及Struts2框架的整体工作流程。这将有助于提升你在实际项目开发中的技能。

    spring整合struts2 开发源码

    本教程将深入探讨如何将Spring与Struts2进行整合,以及相关的源码分析。 首先,Spring和Struts2的整合主要体现在以下几个方面: 1. **依赖注入**:Spring通过DI机制,将Struts2的Action、拦截器等组件的创建和管理...

    Struts2+spring的源码

    Struts2源码分析: Struts2的核心组件包括Action、Interceptor(拦截器)、Result和配置文件。Action是业务逻辑的载体,它接收用户请求并处理。Interceptor是Struts2的一个强大特性,允许在Action执行前后插入自定义...

    JAVA的Struts2完整项目版(源码+数据库)

    Struts2是一个强大的Java web开发框架,它基于MVC(Model-View-Controller)设计模式,主要用于构建企业级的Web应用程序。...通过阅读和分析源码,可以提升对Struts2及其相关技术的理解和运用能力。

    Struts2+Spring+Hibernate框架技术与项目实战 源码(下).zip

    这个"Struts2+Spring+Hibernate框架技术与项目实战 源码(下).zip"文件包含了第6篇综合实例的代码,旨在帮助开发者深入理解和应用这三大框架。 Struts2作为MVC框架,主要处理用户请求和响应。它提供了强大的Action...

    Struts2权威指南全部源码

    在"Struts2权威指南全部源码"中,你可以深入理解Struts2的工作原理,进一步提升你的开发技能。 Struts2的核心组件包括: 1. **Action**:Action是业务逻辑处理的主要部分,负责接收请求、处理业务并返回结果。它...

    struts 1.3.8 源码

    在源码分析中,我们可以看到 Struts 1.3.8 使用了工厂模式(如 ActionServlet 实例化 Action 对象)、装饰器模式(如 ActionMapping 和 ActionForm 的扩展)以及策略模式(如 ActionForward 和 Action 的多种行为)...

    Struts2 Spring Hibernate的配置及登录实例(附源码)

    6. **源码分析** - 源码中可能包含`struts.xml`、`applicationContext.xml`、`hibernate.cfg.xml`等配置文件。 - LoginAction类实现登录功能,可能包含validate()方法进行验证,execute()方法处理登录逻辑。 - ...

    struts2简介

    关于源码分析,Struts2的源代码结构清晰,易于理解和学习。开发者可以通过阅读源码来了解其实现原理,如ActionInvocation、InterceptorStack等核心类的工作方式。 至于工具方面,Eclipse、IntelliJ IDEA等集成开发...

    struts2+hibernate3源码

    当Struts2与Hibernate3结合使用时,通常会通过Action类调用Service层的方法,Service层再利用Hibernate的Session进行数据操作。这样,业务逻辑被封装在Service层,Action只负责接收请求、传递参数,并将Service返回...

    Struts 1.2源码

    这个源码分析将帮助我们深入理解Struts 1.2的工作原理和内部机制。 1. **MVC架构** - Model:在Struts 1.2中,模型通常由JavaBean或业务服务对象(Business Service Objects, BSOs)组成,负责处理业务逻辑。 - ...

    MLDN STRUTS 2. 1 完整源码

    Struts 2是Java开发Web应用的一个非常流行的框架,它基于Model-View-Controller(MVC)设计模式,提供了一种组织和管理...此外,分析源码也有助于你掌握Struts 2框架的内部工作原理,增强问题排查和性能优化的能力。

Global site tag (gtag.js) - Google Analytics