关闭

Webx示例-PetStore分析1

888人阅读 评论(0) 收藏 举报
分类:

转自:http://www.cnblogs.com/lddbupt/p/5578371.html

1. 下载源码

image

image

 

2. 启动容器,加载组件--WebxContextLoaderListener

image

WebxContextLoaderListener继承自org.springframework.web.context.ContextLoaderListener。它覆盖了一个方法:createContextLoader(),该方法返回一个ContextLoader对象,即上下文加载器。方法的实现采用了匿名内部类方式,返回WebxComponentsLoader的匿名子类,该子类覆盖了一个方法:getDefaultContextClass()。

image

WebxContextLoaderListener继承了父类ContextLoaderListener中的方法contextInitialized(),该方法内部调用了被覆盖过的方法createContextLoader(),并使用该方法返回的WebxComponentsLoader对象调用org.springframework.web.context.ContextLoader的initWebApplicationContext()方法。

image

WebxComponentsLoader中的initWebApplicationContext方法除了保存servletContext对象,调用了init()之后,调用父类ContextLoader的同名方法。

image

image

image

默认使用WebxComponentsContext类作为实际启动Spring容器的ApplicationContext。它派生自WebxApplicationContext类。org.springframework.web.context.support.XmlWebApplicationContext的后代。

image

image

image

image

image

image

WebxComponentsLoader.createComponents方法代码很长,但是做的事情只有一件:创建Webx组件

Webx中的组件是一组相关功能的集合,本质上是一个WebApplicationContext。

组件的来源有两个:

•自动扫描WEB-INF目录下的配置文件生成

•webx.xml中指定

将两种方式获取到的组件名集合取并集,就是最终将要处理的组件名集合。注意,在webx.xml中指定的组件名,其配置文件的名字也是webx-*.xml的形式,并不能随意指定。

•自动扫描是可以关掉的,这个时候,只能通过配置的方式来获取组件

•组件的componentPath属性只能通过webx.xml设定

image

image

自动扫描是这样工作的:扫描WEB-INF目录下所有匹配webx-*.xml的文件,其中*所代替的字符串为组件名。例如,WEB-INF下有一个名为webx-home.xml的文件,那么它代表一个名为home的组件。

image

image

image

 

3. 加载其他配置文件

image

image

 

4. 配置服务

RequestContexts服务

详细讲解可参考官方指南第7,8章。http://openwebx.org/docs/requestcontexts.html

image

upload服务

image

pull服务

image

pull service就相当于提供工具类,可以将工具定义成java类,而能够在vm模板中调用

module-loader服务

image

Module是一段可编程、可执行的逻辑,它由Module接口标识。Module接口只有一个execute方法:

 void execute() throws Exception 

实现自定义的Module只需实现Module接口并在execute()方法中实现自定的执行逻辑。在调用方,通过Module接口调用execute()方法触发Module的执行。

ModuleLoaderService是定义、查找Modules的服务。它通过扫描特定的包或者特定类来加载类,并将加载到的类适配为可执行的Module。ModuleLoaderService中的每个Module都有moduleTypemoduleName这两个用来表示Module的信息。可以根据这两个信息,通过ModuleLoaderService提供的查找接口从ModuleLoaderService中查找所需的Module。

ModuleLoaderService有两个重要组件,ModuleFactoryModuleAdapterFactory。前者用于根据特定的条件扫描并加载module (可以是非Java语言编写);后者则用于将加载到的module转换成可执行的Module(实现Module接口)。因为ModuleFactory加载的module未必都实现了Module接口;即使实现了Module接口,该接口也只有一个无参数的方法,限制了Module的灵活性。所以,!ModuleAdapterFactory通过适配器的机制将未实现Module接口但满足一定条件的module转换为实现了Module接口的Adapter,同时保持原来的处理逻辑不变。

在webx体系中,Module承担了用户提交数据的接收、处理;请求的控制与转发;处理结果的展示等重要功能。Webx缺省定义了三种类型的Module:

  • action:主要用于处理用户提交的数据,以及请求的控制与转发;
  • screen:主要用于处理页面的主体内容;
  • control:主要用于处理页面的部分内容,特别是可重用的内容。

其中,screen和control可以与模板文件配合共同完成页面的展示,也可以脱离模板而独立输出页面。

除了action、screen和control,ModuleLoaderService也支持方便的定义其他类型的Module。

ModuleFactory接口根据特定的条件扫描并加载类,webx为该接口提供了两个实现:ClassModuleFactoryScriptModuleFactory。前者用于加载Java编写的module,而后者用于加载用动态语言(如groovy)编写的module。

ModuleAdapterFactory接口用于将加载到的module转换成可执行的ModuleDataBindingAdapterFactoryActionEventAdapterFactory是该接口的两个实现。DataBindingAdapterFactory对所有具有名为execute的方法的module(可以不实现Module接口,同时execute方法的参数也可以任意定义)进行适配,生成DataBindingAdapter;而ActionEventAdapterFactory则对类型为“action”的module进行适配,生成ActionEventAdapter。DataBindingAdapter和ActionEventAdapter都实现了Module接口。DataBindingAdapter只代理了原有module的名为execute的public方法,执行时候直接调用该方法;而ActionEventAdapter则代理了所有以do开头的public方法(例如doAdd()),执行时根据请求参数的值调用相应的方法。

 

<services:module-loader>是根据SpringExt机制定义的专门用于定义ModuleLoaderService的元素,其有两个属性:

  • cacheEnabled:是否缓存Module;如果使用缓存,则查找Module时先从缓存中查找,当缓存中不存在时才从ModuleFactory中查找;如果不使用缓存则直接从ModuleFactory中查找。生产中建议开启Module缓存以提高Module查找性能;
  • includeDefaultAdapters:是否使用webx默认实现的ModuleAdapterFactory,包括:DataBindingAdapterFactory、ActionEventAdapterFactory和Webx2ModuleAdapterFactory,如果将这个属性的值设为true,则默认会在moduleLoaderService中加载这几个AdapterFactory而不需要再额外的配置;

<services:module-loader>元素也可以包含子元素,其子元素可以分为两种类型:配置ModuleFactory的子元素和配置ModuleAdapterFactory的子元素。配置ModuleFactory的子元素有:

  • <ml-factories:class-modules>:配置查找classes生成Module的ClassModuleFactory;
  • <ml-factories:script-modules>:配置查找script生成Module的ScriptModuleFactory;
  • <ml-factories:factory >:ClassModuleFactory和ScriptModuleFactory是webx提供的ModuleFactory实现,也可以扩展自定义的ModuleFactory,然后采用<ml-factories:factory >元素配置,其属性与spring提供的<bean>元素相同;

配置ModuleAdapterFactory的子元素也有多个:

  • <ml-adapters:data-binding-adapter/>:配置DataBindingAdapterFactory;
  • <ml-adapters:action-event-adapter/>:配置ActionEventAdapterFactory;
  • <ml-adapters:adapter>:与ModuleFactory类似,也可以对ModuleAdapterFactory进行扩展实现自定义的ModuleAdapterFactory,<ml-adapters:adapter>用于配置自定义的ModuleAdapterFactory。

当设置<services:module-loader>的includeDefaultAdapters=" true"时,会自动为ModuleLoaderService加载DataBindingAdapterFactory、ActionEventAdapterFactory,所以可以不需要再用<ml-adapters:data-binding-adapter/>和<ml-adapters:action-event-adapter/>另外配置。

 

 

参考资料

http://code.taobao.org/p/webx/wiki/module_load_service/

http://www.atatech.org/articles/55937

流年素心 http://www.cnblogs.com/lddbupt/

0
0
查看评论

PetStore源码(Java必读的开源程序)

  • 2009-05-05 08:42
  • 7.46MB
  • 下载

<java EE 项目:petstore> 从一个简单项目看 java web 如何在本jsp页面上对用户输入的格式进行限制与验证

项目说明: 在我们写一些类似于登入注册页面,需要用户输入信息时,往往要对用户的输入信息的格式进行验证与限制。一般我们会将表单提交后在另一个Servlet或jsp页面上进行验证,但是一出错页面就会重新刷新,使得之前输入的信息丢失,这样用户体验就会很差。 现在的一些流行的网页,都是在输入未提交之前就...
  • STILLxjy
  • STILLxjy
  • 2017-06-28 10:21
  • 506

Petstore源码追踪记(3)-商业逻辑处理(五)

 (接上期)Web tier当使用者输入http://localhost:8080/petstore/customer.do,MainServlet接收到Request,转到doProcess()函数:private void doProcess(HttpServletRequest re...
  • jiangtao
  • jiangtao
  • 2003-01-31 15:44
  • 2763

petstore结构的解读摘要(一)

petstore:zip包中的安装程序使用了ant对其进行编译    编译petstore前需要修改/src/bulid.properties    编译方法和步骤参考http://java.sun.com/blueprints/code/...
  • uhcdivad
  • uhcdivad
  • 2005-04-03 17:57
  • 1796

webx--借用petstore快速入门

前言本博客记录来阿里实习的第一个任务–webx框架学习,会不断更新学习心得。配置对应环境,运行petstore通过官网给的命令行方法,来运行petstore petstore是java ee的经典学习案例,下载链接 如何运行呢? 参见官网给的指导:webx官网 git clone https://g...
  • zy416548283
  • zy416548283
  • 2015-06-29 13:13
  • 3313

spring-petsore spring官方最新demo

  • 2013-08-09 17:10
  • 182KB
  • 下载

.Net PetStore 和 Java PetShop 架构对比分析

  • 2009-10-10 04:46
  • 663KB
  • 下载

webx相关概念与具体处理流程

1.整体流程                            在web.xml中可以看到如下配置       ...
  • cpf2016
  • cpf2016
  • 2015-05-06 13:01
  • 2185

从头开始 - 从 petstore 示例开始学习 webx (1)

准备工作: 安装定制版的 Tomcat ,安装 IntelliJ IDEA IDE ,安装 maven 2 ,安装MySQL Server ,安装 Git; 从 Github clone 代码:https://github.com/webx/citrus-sample.git ...
  • hao741100265
  • hao741100265
  • 2015-01-04 19:29
  • 249

将WEBX petstore切换到mysql数据库

转自:http://www.baiyuxiong.com/?p=797 1、MYSQL建表petstore,导入数据petstore\dal\src\main\resources\petstore\dal\sql 2、DAL POM.XML添加MYSQL JAR包依赖 3、修改data-source...
  • hjwang1
  • hjwang1
  • 2016-10-20 16:27
  • 393
    个人资料
    • 访问:552840次
    • 积分:7230
    • 等级:
    • 排名:第3694名
    • 原创:75篇
    • 转载:538篇
    • 译文:1篇
    • 评论:91条
    最新评论