webx3的总体架构以及特性、快速入门配置

Webx3-介绍和开发实战

Webx2 特点
    Webx2 架构比较复杂
    两套容器混合 – Service容器&Spring容器
    跨容器注入难度大
    Xml 配置较为复杂
    开发较为复杂,难度较大
    简化架构
    简化Web 容器, 去掉 Service 容器
    敏捷开发
    减少机械和粘合代码
    降低开发复杂度
    简化容器Xml配置
    兼容性
    对网站向后兼容,改良式升级
    中文站,国际站,淘宝



二、Webx3总体架构

WEBX 3.0简介
What’s New?

主流化
基于Java5,框架本身支持Generic、Annotations
基于Spring框架
基于POJO/依赖注入编程
增强特性
基于XML Schema的配置文件
使Spring配置文件易读、易写
以组件的思维来扩展系统
生产模式/开发模式
保留Webx2中的优点
页面驱动
先建模板、再建程序
模板中“按需”取得工具对象(pull tools)
约定胜于配置
基于规则展示页面
screen/layout/control

比较:
Spring context成为一等公民,取消Service框架
Context结构完全同Spring MVC,两层结构,大为简化
子容器中的bean可取得root context中的对象
在Spring context中创建webx2 service context adapters,完全兼容webx2
取消Singleton Service Context,以root context取代其职责。
Adapter将所有对Singleton Service Context的调用全部转向root context。


Webx3架构变化总揽



三、Webx3 快速入门
Webx3 核心开发概念

1  Model 
    基本类型:String,int,long
    复合类型: JavaBean
    集合类型: List, Array
2. View
    模板 Velocity
    Layout
3. Controller
    Screen/Action/Ctronol
    映射规则同 Webx2.x



代码篇:

1. 绑定环境变量
    void doGetRundata(TurbineRunData rundata)
    void doGetNavigator(Navigator nav)
    void doGetContext(Context context)
    void doGetRequestContext(RequestContext requestContext)
2.绑定Query参数
  基本类型及数组
  JavaBean及数组
    void doGetInt(@Param("aaa") int i)
    void doGetIntDefault(@Param(name = "aaa", defaultValue = "123") Integer i)
    void doGetIntArray(@Param("aaa") int[] i)
    void doGetIntegerArrayDefault(@Param(name = "aaa", defaultValues = { "123", "456" }) Integer[] i)
    void doGetIntegerList(@Param("aaa") List<Integer> i)
3.绑定FromService
    基本类型及数组
    JavaBean及数组
    校验失败是否不进入
    3.1 Form
        void doGetFormDefaultAnnotation(@FormData Form form)
        void doGetFormDontSkipAction(@FormData(skipIfInvalid = false) Form form)
    3.2 Group
        void doGetGroup(@FormGroup("myGroup1") Group group)
        void doGetGroupInstanceBean(@FormGroup(name = "myGroup1", instanceKey = "aaa") MyData data)
        void doGetGroupsBeansDontSkipAction(@FormGroups(name = “myGroup1”,skipIfInvalid = false),  Collection<MyData> data)
    3.3 Field
        void doGetField(@FormField(name = "field1", group = "myGroup1") Field field) 





四、Webx3 架构新特性
配置篇
统一Spring容器

    只用 Spring 配置文件
     webx.xml
     pipeline.xml
     webx-*.xml
     uris.xml
    …
组件
    WebxContextLoaderListener
    装载/WEB-INF/webx.xml, /WEB-INF/webx-*.xml
    WebxFrameworkFilter
    拦截request,以便被webx容器处理
    LogConfiguratorListener
    初始化日志系统
服务Bean
    services:resource-loading
    services:request-contexts
    services:mapping-rules
    services:template
    services:pull
    services:data-resolver
    services:pipeline
    services:uris
Webx3 配置文件对比

Webx3 服务配置
1 RequestContext

<!-- 设置request/response/session。 -->
<services:request-contexts 
    xmlns="http://www.alibaba.com/schema/services/request-contexts">
        <buffered />
        <lazy-commit />
        <parser />
        <set-locale defaultLocale="zh_CN" defaultCharset="UTF-8" />
        <session>
            <id>
                <cookie path="/" maxAge="0" httpOnly="true" />
            </id>
            <stores>
                <session-stores:cookie-store id="temporaryCookie">
                    <session-stores:cookie name="tmp" />
                </session-stores:cookie-store>
            </stores>
            <store-mappings>
                <match name="*" store="temporaryCookie" />
            </store-mappings>
        </session>
</services:request-contexts>
2 PipeLine.xml
<services:pipeline xmlns=http://www.alibaba.com/schema/services/pipeline/valves>
        <!-- 初始化turbine rundata,并在pipelineContext中设置可能会用到的对象(如rundata、utils),以便valve取得。 -->
        <prepareForTurbine />
        <!-- 预备webx所需的对象。 -->
        <prepareForWebx2 />
        <setLoggingContext />
        <!-- 分析URL,取得target。 -->
        <analyzeURL homepage="homepage" />
        <checkCsrfToken />
         <loop>
               … Valve 
         </loop>
    </services:pipeline>
<services:pipeline xmlns=http://www.alibaba.com/schema/services/pipeline/valves>
    ………
    <loop>
            <choose>
                <when>
<pl-conditions:target-extension-condition extension="null, vm, jsp" />
                    <performAction />
                    <performTemplateScreen />
                    <renderTemplate />
                </when>  
                <when>
                   <pl-co ditions:target-extension-condition extension="do" />
                    <performAction />
                    <performScreen />
                </when>
                <otherwise>
                    <!-- 将控制交还给servlet engine。 -->
                    <exit />
                </otherwise>
            </choose>
         <breakUnlessTargetRedirected />
        </loop>
    </services:pipeline>
3 ModuleLoader
<!-- 装载模块。 -->
    <services:module-loader>
        <ml-factories:class-modules>
            <ml-factories:search-packages type="$1"
                packages="com.alibaba.sample.petstore.web.admin.module.*"
                includeAbstractClasses="true" />
       </ml-factories:class-modules>
        <ml-adapters:webx2-module-adapter />
    </services:module-loader>
4 PullService
<services:pull xmlns="http://www.alibaba.com/schema/services/pull/tools">
        <!-- 全局tools。 -->
        <services:tools>
            <!-- Webx3 tools。 -->
            <utils />
            <rundata-tool />
            <csrfToken />
        </services:tools>
        <!-- 每个request都会创建一次的tools。 -->
        <services:tools scope="request">
            <!-- Webx3 tools。 -->
            <control-tool />
            <!-- Webx2 tools。 -->
            <webx2-tool id="form" class="com.alibaba.service.form.FormTool" />
            <webx2-tool id="uri" class="com.alibaba.service.uribroker.URIBrokerTool" />
        </services:tools>
        <!-- 每个request都会创建一次的tools,但components之间共享同一个实例。 -->
        <services:tools scope="request" shareWithComponents="true">
            <!-- Webx3 tools。 -->
            <page-tool />
        </services:tools>
    </services:pull>
5  MappingRule
<services:mapping-rules xmlns="http://www.alibaba.com/schema/services/mapping-rules">
       <direct-module-rule id="action" />
        <!-- Target name => Screen module name (*.do) -->
        <direct-module-rule id="screen.notemplate" />
        <!-- Target name => Screen module name (*.jsp, *.vm) -->
        <fallback-module-rule id="screen" moduleType="screen" />
        <!-- Target name => Screen template name -->
        <direct-template-rule id="screen.template" templatePrefix="screen" />
        <!-- Target name => Layout template name -->
        <fallback-template-rule id="layout.template" templatePrefix="layout" />
        <!-- Target name => Control module name (setControl method) -->
        <direct-module-rule id="control.notemplate" />
        <fallback-module-rule id="control" moduleType="control" />
        <direct-template-rule id="control.template" templatePrefix="control" />
    </services:mapping-rules>
6 DataResolver
<!-- 支持注入参数,可以在这里扩展自己的参数绑定器 -->
    <services:data-resolver xmlns="http://www.alibaba.com/schema/services/data-resolver/factories">
        <turbine-rundata-resolver />
        <parameter-resolver />
        <form-resolver />
    </services:data-resolver>
7 Form
<services:form>
        <services:group name="addProduct">
            <services:field name="productId" displayName="产品ID">
                <required-validator>
                    <message>必须填写${displayName}</message>
                </required-validator>
                <custom-error id="duplicatedProductId">
                    <message>产品ID和已有产品冲突</message>
                </custom-error>
            </services:field>
          services:field name="picture" displayName="产品图片">
                <required-validator>
                    <message>必须上传产品图片</message>
                </required-validator>
                <uploaded-file-validator
                    contentType="image/gif, image/jpeg, image/pjpeg, image/jpg, image/png">
                    <message>${displayName}不是合法的图片文件</message>
                </uploaded-file-validator>
                <uploaded-file-validator maxSize="100K">
                    <message>${displayName}不能超过${maxSize}字节</message>
                </uploaded-file-validator>
            </services:field>
        </services:group>
    </services:form>
8 Rewrite
<services:request-contexts id="rewrite" sort="false">
  <parser /> 
    <rewrite>
    <!-- 永久重定向,301   --> 
    <rule pattern="/test1/hello.htm">
    <substitution uri="/test1/new_hello.htm" flags="L,R=301" /> 
    </rule>
    <!-- 临时重定向,302,不保留参数   --> 
    <rule pattern="/test2/hello.htm">
    <substitution uri="/test2/new_hello.htm" flags="L,R" /> 
    </rule>
    <!-- 临时重定向,302,保留参数   --> 
    <rule pattern="/test2.4/hello.htm">
    <substitution uri="/test2.4/new_hello.htm" flags="L,R,QSA" /> 
    </rule>
Webx2.0/2.5 应用基本迁移步骤
1.Webx2/2.5  Webx3迁移指南
2.按指南修改基础配置
3.对应用回归测试
4.修改,重复 步骤3 
5.发布应用
9 兼容2.0 Service

重要:
   对于中文站,国际站自己扩展的 Webx2.0 Service,可以按下面的方式移植:
<!-- Webx2兼容设置, 直接将旧配置copy过来即可 -->
    <services:webx2-instance-context xmlns="http://www.alibaba.com/schema/webx2-services">
        <services>
            <service name="PageAuthorizationService"
                class="com.alibaba.sample.petstore.DefaultPageAuthorizationService">
                <property name="access.descriptors">
                    <value>/petstore/${component}/access.xml</value>
                </property>
            </service>
        </services>
    </services:webx2-instance-context>
10 兼容2.0 Valve
重要:
   对于中文站,国际站自己扩展的 Webx2.0 PipeLine Valve,可以按下面的方式移植:
<!-- Webx2兼容设置, 直接将旧配置copy过来即可 -->
<beans:beans> 
<services:pipeline xmlns=“http://www.alibaba.com/schema/services/pipeline/valves”>         
    <webx2-valve class=
           “com.alibaba.sample.petstore.web.common.auth.PageAuthorizationValve”/>
   </services:pipeline>
</beans:beans>

Spring-schema的扩展


1. Spring定义了三种接口,用来将Schema所描述的XML文件转换成
    Spring beans
    Bean Definition Parser
    Bean Definition Decorator
    Bean Definition Decorator for Attribute
    NamespaceHandler
         将XML NS和上述parsers/decorators关联起来;
         Webx 3 实现了此接口,做成了一套及其灵活的schema扩展机制。
2   扩展点(配置点,Configuration Point)
       Webx3定义了一个顶级的扩展点:services,
       Namespace为:“http://www.alibaba.com/schema/services"。
3.  捐献(Contribution)
    对指定扩展点的扩展,例如:“Velocity Engine”
    每个Contribution必须对应一个schema。
    每个Contribution必须对应一个bean definition parser
4.  组件
     可以捐献给指定的扩展点


来自:http://hi.baidu.com/274084093/item/32577a15dbf0cf5bf0090e6b

该文档为官方webx框架文档,对webx进行了全面的讲解,非常实用,并附学习的Demo 为什么要用Webx而不是其它的开源框架? 现在有很多Java的Web框架可供选择,并且它们也都是免费的。例如: • Struts • Webwork • Tapestry • Spring MVC 以上框架都是非常优秀的。说实话,如果阿里巴巴网站在2001年开始,就有这么多可选择的话,无论选择哪一个都不会有问题。因为这些年来,所有的开源Web框架都在互相学习、并趋于相似。Webx也不例外,它吸收了其它框架的很多想法。因此,当你使用Webx的时候,你会觉得在很多方面,它和其它开源的框架非常类似。我并不是说所有的框架都一样好,而是说只要假以时日,所有的框架在发展过程中,必然会积聚好的方面,淘汰坏的方面,从而变得足够好。从这个角度看,的确没有特别明显的理由来选择Webx,但也没有明显的理由不选择Webx。 另一方面,由于每一种框架采用不同的设计,必然会有各自的优势。Webx也是如此 —— 它在某些方面有一些独到的设计,超越了同类框架。Webx有哪些优势呢? Webx的优势 成熟可靠性 这个优势主要是针对阿里巴巴及属下网站而言。因为Webx在阿里巴巴和淘宝用了很多年。对于这种超大访问量的电子商务网站,Webx经受了考验,被证明是成熟可靠的。 开放和扩展性 • 对Spring的直接支持 —— Spring是当今主流的轻量级框架。Webx 3.0和Spring MVC一样, 完全建立在Spring框架之上,故可运用Spring的所有特性。 • 扩展性 —— Webx 3.0对Spring做了扩展,使Spring Bean不再是“bean”,而是升级成“组件”。一个组件可以扩展另一个组件,也可以被其它组件扩展。这种机制造就了Webx的非常好的扩展性,且比未经扩展的Spring更易使用。 • 开放性 —— Webx被设计成多个层次,层次间的分界线很清晰。每个层次都足够开放和易于扩展。你可以使用全部的Webx,也可以仅仅使用到Webx的任何一个层次。 引言 ............................................................................................................................... ix 1. 阅读向导 ............................................................................................................. ix 2. Webx是什么? .................................................................................................... ix 3. Webx的历史 ....................................................................................................... ix 4. 为什么要用Webx而不是其它的开源框架? ............................................................. x 5. Webx的优势 ........................................................................................................ x 5.1. 成熟可靠性 ................................................................................................ x 5.2. 开放和扩展性 ............................................................................................. x 6. Webx还缺少什么? .............................................................................................. x 部分 I. Webx框架概览 ......................................................................
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值