以前做项目都是简单的jsp+bean,特没技术含量,终于有机会,自己有个机会决定选择框架,看了不少文章,最后决定用webwork+spring+hibernate来开发。看过了一些文章对这些有了大概的了解。计划五一前,把三个框架深入的研究一下。今天就从webwork开始把。曾经看过夏昕的webwork开发指南,大概流程明白了,具体细节还是不明白,所以下载下源码来看看。
我先大致说说我现在对webwork的理解吧。你们一看就知道了,我是初学者,如果有哪位朋友看到这篇文章,觉得里面有我理解不对的地方,希望给我告诉我一声哦。
webwork1我就不说了,我用的是webwork2,他是采用的webwork2+xwork1这样的框架,新框架与Servlet API 分离出来,这给我们的测试带来的极大地方便(这是不选struts的一个原因)。webwork负责把http请求分离出来,使得请求完全脱离Servlet,然后把请求封装到一个Map中,这样传入xwork中的不是Servlet请求,而是一个Map数据结构,xwork就负责根据这个Map数据填充好我们的VO对象,当然它使用的是拦截器的方式来实现的。然后被激活的Action就可以使用VO来进行相应的工作了。我们就顺着这个流程来逐步分析webwork+xwork的实现机制吧。那首先我们就想到的是webwork是如何把http请求封装成Map数据结构的呢?
在我们看了webwork的example,我们看到webwork所有服务都是以.action作为结尾的,但是http不没有以action结尾的服务资源,我们必须在web.xml里做如下的配置:
<servlet>
<servlet-name>webwork</servlet-name>
<servlet-class>com.opensymphony.webwork.dispatcher.ServletDispatcher</servlet-class>
<servlet>
<servlet-mapping>
<servlet-name>webwork</servlet-name>
<url-pattern>*.action</url-pattern>
<servlet-mapping>
通过这样的配置以后,应用程序Server就是知道凡是以action结尾的服务请求,都由ServletDipatcher接管。
因此,我就从ServletDispatcher源码开始分析。
首先,让我们看看ServletDispatcher.java文件开头的一段说明,这会给你一个对ServletDispatcher工作流程的大概了解。
在webwork中Dispatcher扮演着MVC中的控制器的角色。当请求发送到servlet之后,webwork会做哪些工作呢?
首先,action的名字会从servlet的路径中解析出来(i.e,/foo/bar/MyAction.action--->myAction)
然后,由request,response,parameters,session 和application属性组成的上下文将被创建。
接着,使用action的名字,路径以及上下文实例化ActionProxy,然后执行ActionProxy,最后Action的输出将返回给请求对象。
Servlet使用webwork属性初始化自己,下面这些属性将用于servlet的初始化:
webwork.configuration.xml.reload==true,则每一请求都会重新载入xml配置文件。这个一般用于开发阶段。
webwork.mutipart.saveDir:这个路径被用来保存临时的上传文件。缺省值是应用服务器的临时路径。
webwork.mutipart.maxSize:设置允许多路请求的最大值。
根据说明,大致是这样的。当请求发送到Servlet后,首先要调用ServletDispatcher的init来初始化Servlet,然后调用Service方法,
这个方法主要是得到Action对应的上下文,然后调用serviceAction来执行Action。在serviceAction方法中首先调用createContextMap来
创建Action的上下文环境。我们来仔细分析一下:看源码我们发现,实际上createContextMap就是把http请求的数据全部封装到一个HashMap里面去。
public static HashMap createContextMap(Map requestMap, Map parameterMap, Map sessionMap, Map applicationMap, HttpServletRequest request, HttpServletResponse response, ServletConfig servletConfig) {
HashMap extraContext = new HashMap();
extraContext.put(ActionContext.PARAMETERS, parameterMap);
extraContext.put(ActionContext.SESSION, sessionMap);
extraContext.put(ActionContext.APPLICATION, applicationMap);
extraContext.put(ActionContext.LOCALE, (locale == null) ? request.getLocale() : locale);
extraContext.put(HTTP_REQUEST, request);
extraContext.put(HTTP_RESPONSE, response);
extraContext.put(SERVLET_CONFIG, servletConfig);
extraContext.put(ComponentInterceptor.COMPONENT_MANAGER, request.getAttribute(ComponentManager.COMPONENT_MANAGER_KEY));
// helpers to get access to request/session/application scope
extraContext.put("request", requestMap);
extraContext.put("session", sessionMap);
extraContext.put("application", applicationMap);
extraContext.put("parameters", parameterMap);
AttributeMap attrMap = new AttributeMap(extraContext);
extraContext.put("attr", attrMap);
return extraContext;
}
整个ServletDispatcher的核心就是serviceAction,然后来看看这个方法:
public void serviceAction(HttpServletRequest request, HttpServletResponse response, String namespace, String actionName, Map requestMap, Map parameterMap, Map sessionMap, Map applicationMap) {
//创建了Action的上下文环境
HashMap extraContext = createContextMap(requestMap, parameterMap, sessionMap, applicationMap, request, response, getServletConfig());
extraContext.put(SERVLET_DISPATCHER, this);
// 如果存在值栈,就拷贝一个副本,传给新的action使用,否则就创建一个新的值栈。
OgnlValueStack stack = (OgnlValueStack) request.getAttribute(ServletActionContext.WEBWORK_VALUESTACK_KEY);
if (stack != null) {
extraContext.put(ActionContext.VALUE_STACK,new OgnlValueStack(stack));
}
实际这以下的工作都交给xwork来处理了。
try {
//实例化ActionProxy,然后执行Action.
ActionProxy proxy = ActionProxyFactory.getFactory().createActionProxy(namespace, actionName, extraContext);
request.setAttribute(ServletActionContext.WEBWORK_VALUESTACK_KEY, proxy.getInvocation().getStack());
proxy.execute();
// If there was a previous value stack then set it back onto the request
if (stack != null){
request.setAttribute(ServletActionContext.WEBWORK_VALUESTACK_KEY,stack);
}
} catch (ConfigurationException e) {
log.error("Could not find action", e);
sendError(request, response, HttpServletResponse.SC_NOT_FOUND, e);
} catch (Exception e) {
log.error("Could not execute action", e);
sendError(request, response, HttpServletResponse.SC_INTERNAL_SERVER_ERROR, e);
}
}
分享到:
相关推荐
在深入理解WebWork源码之前,我们首先需要了解一些基本概念。 1. **MVC模式**:WebWork基于MVC模式设计,它将应用程序的逻辑分为三部分:模型负责业务处理,视图负责数据展示,控制器负责接收请求并调用模型进行...
WebWork源码分析: WebWork的核心在于它的Action系统,它通过处理用户请求并调用相应的业务逻辑来驱动应用程序。源码中包含了Action、Interceptor、Result等关键组件的实现。Action是处理用户请求的入口点,...
WebWork2.x 是一个历史悠久的Java Web框架,它是Struts2的前身。本文将深入探讨WebWork2.x的源码,以理解其...通过对WebWork2.x的源码分析,我们可以更深入地了解Struts2的内部运作,从而更好地利用这个框架进行开发。
### 剖析webwork源码:深入了解Struts2.0核心技术 #### WebWork与Struts2.0的关系 WebWork框架,作为Struts2.0的核心技术之一,源自于OpenSymphony组织的开源项目,旨在提供一种组件化和代码重用的MVC模式解决方案...
Webwork2是一款基于Java的开源框架,主要用于构建企业级的Web应用程序。这个框架以其强大的MVC(模型-视图-控制器)架构而闻名,能够帮助开发者实现高效、可维护的代码结构。OpenDoc出品的"Webwork2开发指南.pdf"是...
源码分析可以帮助我们了解这些机制是如何实现的,如何自定义拦截器以满足特定需求,以及如何有效地管理动作和结果。 然后,我们转向Struts2,它是WebWork的后续版本,继承并增强了WebWork的许多优点。Struts2框架...
### 剖析Webwork源码:深入了解Webwork框架的核心机制 #### Webwork框架概览 Webwork,作为OpenSymphony旗下的一款开源项目,自2004年起便以其独特的设计理念吸引了众多开发者的眼球。其核心目标在于提供一种组件...
本实例源码是针对初学者的一个基础入门项目,通过它我们可以深入理解WebWork的核心概念和工作原理。 WebWork的核心特性包括: 1. **Action与DispatcherServlet**:WebWork中的Action类是处理用户请求的核心,它们...
【WebWork+Hibernate用户注册系统】是一个基于早期Java Web开发技术的项目,它结合了WebWork框架和...通过阅读和分析源码,开发者可以提升对Java Web开发的理解,特别是对WebWork和Hibernate这两个框架的掌握。
**WebWork2.2入门详解** WebWork是一个基于Java的MVC(模型-视图-控制器)框架,它为开发企业级Web应用提供了强大的支持...对于初学者,可以从基础概念入手,逐步深入到源码分析,通过实战不断提升自己的Web开发能力。
通过阅读源码,开发者可以了解框架内部的工作流程,遇到问题时能够更快定位和解决问题。同时,这也为自定义或扩展框架功能提供了可能。 总的来说,这个压缩包中的WebWork 2.2.2和XWork 1.1.3 JAR包及其源代码,为...
在深入理解Struts2的工作原理时,源码分析是必不可少的步骤。Struts2的核心设计理念和设计模式相比Struts1.x有了显著的变化,这使得它成为一个独立且成熟的框架。 首先,Struts2的架构基于WebWork的核心,这意味着...
【源码分析】在"WebWork+Spring+Hibernate源码.rar"中,你可以期待找到这三个框架的整合示例代码。这些源码通常包含配置文件(如web.xml、applicationContext.xml、hibernate.cfg.xml)以及相应的Java类。配置文件会...
6. **实际应用与案例分析**: - 通过`@Controller`注解创建Spring MVC控制器,处理HTTP请求;使用`@Service`和`@Repository`注解标记业务层和服务层组件,配合`@Autowired`自动装配依赖。 - 结合iBatis的注解,...
源码分析 了解WebWork的源码可以帮助开发者更深入地理解其工作机制。源码中的`ActionProxy`、`ActionInvocation`和`InterceptorStack`等类是实现框架功能的关键组件。通过阅读和分析这些源码,开发者可以学习到...
通过阅读和分析`oscore-2.2.6.jar`中的源码,我们可以深入理解WebWork如何在后台处理请求,如何将动作映射到具体的业务逻辑,并最终如何将结果呈现给用户。 压缩包中的`webwork`目录可能包含WebWork框架的具体实现...
`src` 目录存放了源代码,可能是WebWork 2.1框架的部分源码,或者是示例应用的源码,供开发者学习和参考。 `lib` 目录通常包含WebWork 2.1运行所需要的其他依赖库,比如第三方的Java库或者特定的Servlet API,这些...
**五、WebWork与源码分析** 了解WebWork的源码有助于深入理解其工作原理,例如ActionServlet如何解析配置文件,如何创建Action实例,以及ActionInvocation如何协调Action的执行和结果返回。源码阅读可以帮助开发者...
Webwork 是一个基于Java的MVC(模型-视图-...通过分析和运行这些文件,你可以更深入地了解Webwork验证的实现细节,并动手实践如何设置和调试验证规则。这将有助于提升你在Webwork框架下进行数据验证的实际操作能力。