`
苏飞
  • 浏览: 71452 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

webwork2.1.7源代码分析之--初始化及创建action过程(草稿)

阅读更多

  写文章是一件困难的事,如果要讲的简单明了更难。

  一,总体说明
  来看看com.opensymphony.webwork.dispatcher.ServletDispatcher extends HttpServlet implements WebWorkStatics

  看看也许是作者提的问题:

/*
* TODO: QUESTIONS:
*
* 1) What unit is maxSize of attachments in? (assuming bytes for now)
* 2) Isn't error message wrong in catch of try/catch in service() method?
* 3) Why is getActionName(String) not declared public? (The fix would not be an API addition so this could be
* done for pre 2.1)
* 4) Why does createContextMap(...) return a HashMap and not a Map? (2.1 api change)
* 5) Why doesn't getNameSpace(request) get the servlet path in the same way that getActionName(request) does?
* 6) Why does getParameterMap throw an IOException? Can't see a reason for that. (2.1 api change)
*/ 


  注意 com.opensymphony.webwork.WebWorkStatics 一些webwork常量而己。把常量定义在interface里也是一种很好的策略,这要就不用每次用常量时都要带个常量类名。


  另外有两个类,都在相同的包com.opensymphony.webwork.dispatcher下,一是CoolUriServletDispatcher,二是FilterDispatcher。前面那个继承自ServletDispatcher,后面的则不同,完全是一个filter。搜了一下网络,好象没人讲明白是它究竟干什么,其api文档也没有说明这个类,暂且放下。

  Cool类不讲它。讲ServletDispatcher。


When a request enters the servlet the following things will happen:


a.The action name is parsed from the servlet path (i.e., /foo/bar/MyAction.action -> MyAction).
b.A context consisting of the request, response, parameters, session and application properties is created.
c.An XWork ActionProxy object is instantiated (wraps an Action) using the action name, path, and context then executed.
d.Action output will channel back through the response to the user.


它比我讲的清楚。

  
  1.init方法

 

  

 public void init(ServletConfig servletConfig) throws ServletException { 
super.init(servletConfig); 

LocalizedTextUtil.addDefaultResourceBundle("com/opensymphony/webwork/webwork-messages"); 

//check for configuration reloading 
if ("true".equalsIgnoreCase(Configuration.getString("webwork.configuration.xml.reload"))) { 
FileManager.setReloadingConfigs(true); 
} 

if (Configuration.isSet("webwork.i18n.encoding")) { 
encoding = Configuration.getString("webwork.i18n.encoding"); 
} 

if (Configuration.isSet("webwork.locale")) { 
locale = localeFromString(Configuration.getString("webwork.locale")); 
} 

// store a reference to ourself into the SessionContext so that we can generate a PageContext 
servletConfig.getServletContext().setAttribute("webwork.servlet", this); 

// test wether param-access workaround needs to be enabled 
if (servletConfig.getServletContext().getServerInfo().indexOf("WebLogic") >= 0) { 
log.info("WebLogic server detected. Enabling parameter access work-around."); 
paramsWorkaroundEnabled = true; 
} else { 
log.debug("Parameter access work-around disabled."); 
} 
} 


  
 很好理解,我们应该看看default.properties和webwork.properties。

注意还有一个com/opensymphony/webwork/webwork-messages.properties


2.service()方法

request = wrapRequest(request);
serviceAction(request, response, getNameSpace(request), getActionName(request), getRequestMap(request), getParameterMap(request), getSessionMap(request), getApplicationMap());

//如果是上传文件,则将request改为MultiPartRequestWrapper。有两个参数savedir与maxsize

//解析四个对象,分别进入四个实现了Map接口的对象。三大对象,RequestMap,SessionMap,ApplicationMap。

3.serviceAction()方法

  HashMap extraContext = createContextMap(requestMap, parameterMap, sessionMap, applicationMap, request, response, getServletConfig());
extraContext.put(SERVLET_DISPATCHER, this);

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

//我不太喜欢的OgnlValueStack,同一个请求会被重新创建。


ActionProxy proxy = ActionProxyFactory.getFactory().createActionProxy(namespace, actionName, extraContext);
request.setAttribute(ServletActionContext.WEBWORK_VALUESTACK_KEY, proxy.getInvocation().getStack());//ignore it....
proxy.execute();

//创建DefaultActionProxyFactory,然后创建ActionProxy


protected void prepare() throws Exception {
 invocation = ActionProxyFactory.getFactory().createActionInvocation(this, extraContext);
}

//调用DefaultActionProxyFactory创建DefaultActionInvocation。并
//注入自己及相关对象,然后产生所需对象。

protected Action action;
protected ActionProxy proxy;
protected List preResultListeners;
protected Map extraContext;
protected ActionContext invocationContext;
protected Iterator interceptors;
protected OgnlValueStack stack;
protected Result result;
protected String resultCode;
protected boolean executed = false;
protected boolean pushAction = true;


//Action ActionContext OgnlValueStack三个对象重要。

protected DefaultActionInvocation(ActionProxy proxy, Map extraContext, boolean pushAction) throws Exception {
this.proxy = proxy;
this.extraContext = extraContext;
this.pushAction = pushAction;
init();
}

//注意init()方法。


private void init() throws Exception {
Map contextMap = createContextMap();

createAction();

if (pushAction) {
stack.push(action);
}

invocationContext = new ActionContext(contextMap);
invocationContext.setName(proxy.getActionName());

// get a new List so we don't get problems with the iterator if someone changes the list
List interceptorList = new ArrayList(proxy.getConfig().getInterceptors());
interceptors = interceptorList.iterator();
}

//得到运行所需的所有参数



至此,ServletDispacher的serviceAction中的这一句

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);
}


//这一句可以说明,action是每次实例化的。
action = ObjectFactory.getObjectFactory().buildAction(proxy.getConfig());



   //看的很仓促,欢迎指点。明天写一下执行过程。接下来是转向过程。然后是一些边边角角吧。

 

分享到:
评论

相关推荐

    WebWork-2.1.7 中文开发文档-小白

    WebWork-2.1.7 中文开发文档-小白

    webwork 2.1.7.jar

    5. **Tiles Framework Integration**:WebWork可以与Tiles框架集成,用于创建复杂的、模块化的页面布局。Tiles允许你定义可重用的页面片段,然后组合成完整的页面。 6. **Form Handling**:WebWork自动处理表单提交...

    webwork2.1.7

    2. **webwork-2.1.7.jar**:WebWork的核心库文件,包含了框架的所有核心组件和功能。 3. **webwork-migration.jar**:可能包含帮助迁移其他框架到WebWork的相关工具或类库。 4. **webflow-2.1.7.jar**:Spring Web...

    webwork-2.1.7 xwork.jar

    webwork 2.1.7 版 原版留存 xwork.jar

    webwork2.1.7+spring+hibernate+oracle整合

    WebWork 2.1.7版本是一个较为成熟的版本,提供了一系列功能强大的特性,如请求映射、类型转换、数据验证、国际化等,使得开发者能够更专注于业务逻辑而非框架细节。通过使用`webwork2.1.7.jar`、`xwork.jar`、`os...

    webwork-2.1.7.jar

    描述: webwork-2.1.7.jar 修改: package com.opensymphony.webwork.interceptor.FileUploadInterceptor 类line88 to line 93 修复bug:upload empty file cause nullponit exception 博文链接:...

    webwork2.1.7+spring+hibernate3+oracle+weblogic8.1登录示例(详解)

    8. **web.xml配置**:在`WEB-INF/web.xml`文件中,配置了Spring上下文初始化参数,指定了Spring配置文件的位置`/WEB-INF/applicationContext.xml`以及日志配置文件`/WEB-INF/log4j.properties`。同时,还定义了监听...

    剖析WEBWORK源代码

    1. **添加必要的JAR包**:将webwork-2.1.7.jar、xwork-1.0.5.jar等所需库文件复制到项目的`WEB-INF\lib`目录下。 2. **配置webwork.properties文件**:创建此文件,并根据项目需求进行相应的配置。例如,默认编码...

    webwork in action_第1部分-WebWork简介_第2章-WebWork方式的Hello World

    webwork in action_第1部分-WebWork简介_第2章-WebWork方式的Hello World

    webwork2实例源代码

    本实例源代码提供了深入理解WebWork2工作原理和应用开发的机会。以下是对WebWork2核心知识点的详细阐述: 1. **MVC架构**:WebWork2遵循MVC模式,将应用程序逻辑、用户界面和数据模型分离,提高代码的可维护性和可...

    webwork-2.2.5源码包下载.txt

    1. **解压源码包**:下载完成后,首先需要解压缩zip文件,得到WebWork-2.2.5的源代码及相关文档。 2. **环境准备**:确保已经安装了Java开发工具包(JDK),推荐版本为1.5以上。此外,还需要安装Ant或其他构建工具...

    webwork in action 源代码

    《WebWork in Action》是一本专注于介绍WebWork框架的书籍,源代码的提供是为了让读者更深入地理解和实践书中的示例。WebWork是一个基于Java的MVC(模型-视图-控制器)框架,用于构建动态Web应用程序。它强调了代码...

    webwork-1.4-src.zip_webwork_webwork s_webwork.zip_webwork1.4.zip

    在"webwork-1.4-src.zip"这个压缩包中,包含了WebWork1.4的源代码,这对于学习和理解WebWork的工作原理以及进行定制开发非常有帮助。 1. **MVC模式**:WebWork1.4遵循MVC架构,将应用程序分为模型、视图和控制器三...

    xwork源代码(webwork源代码,xwork source,)

    《XWork源代码详解——深度剖析WebWork框架基础》 XWork源代码是WebWork框架的核心组成部分,WebWork是一款强大的MVC(Model-View-Controller)框架,它为Java Web应用提供了一种灵活且可扩展的开发模式。XWork作为...

    三框架源代码之STRUTS-2.0

    Struts 2是Java Web开发中的一个非常重要的MVC...源代码分析有助于理解框架的设计思想,以及如何根据需求定制和扩展框架功能。同时,这也是一种深度学习Java Web开发的好方法,有助于提升开发技能和解决问题的能力。

    《webwork in action》源代码.rar

    6. **ActionServlet**:WebWork使用自定义的Servlet(ActionServlet)作为入口点,负责初始化框架、处理请求以及管理Action实例。 7. **配置管理**:WebWork使用XML配置文件定义Action、Interceptor和URL映射。...

    webwork2中文参考1.0a-pdf

    Webwork2是一个开源的在线作业系统,主要用于数学和科学教育领域。它允许教师创建和管理交互式的数学问题,学生可以在浏览器中解答这些问题,系统会自动评估答案并提供反馈。"webwork2中文参考1.0a-pdf"是针对这个...

    webwork-2.2.2和xwork1.1.3的jar包and源代码

    WebWork是一个轻量级的MVC框架,它通过使用动作(Action)和结果(Result)的概念来处理用户请求,并且提供了强大的数据绑定、类型转换、异常处理和国际化支持。WebWork 2.2.2是该框架的一个稳定版本,它引入了许多...

    webwork in action

    - 解压文件后,你会看到示例应用程序、文档以及框架源代码等资源。 - 必需的库文件包含在内,例如`xwork.jar`、`commons-logging.jar`、`oscore.jar`和`velocity-dep.jar`等。 2. **准备基本的Web应用文件结构**...

Global site tag (gtag.js) - Google Analytics