webx

    最近换工作  要用到webx;也看了几天的代码 ;了解了个大概;写写自己的见解。

webx 是阿里巴巴内部广泛使用的框架,是建立在java servlet api 的基础上的WEB框架。用webx搭建的应用可以运行在任何一个标准的web应用服务器上面:Tomcat,jetty,jboss,weblogic......

特点:

1:层次化

2:基于经典的MVC设计模式的WEB框架,推崇页面驱动约定胜于配置的理念

3:可以被其他的组件扩展,也可以扩展其他组件,总体上是一个集成框架,集成啦mybatis,velocity,spring等框架

Module与Templates交互

在webx中重要的概念有Module和templates;先解释一下这两个名字
一:webx3作为一个MVC框架,Modeule组件承担控制器的职责,module负责接收客户输入的数据,执行业务逻辑,响应客户输出,以及数据校验,页面流程控制等。

Module


一:screen:为页面展示或者输出准备数据Model
二:Action负责接收form提交和数据的写入控制(执行java类中的execute方法)
三:control可嵌套的screen处理器,用于screen的组装
一:screen:
(1):职责:响应只读功能;执行Java类中的execute带参方法
publicclassViewProduct {
publicvoidexecute(@Param(name = "productId") String productId,Context context) {
ProductDO productDO = productAO.find(productId);
context.put("product", productDO); }
}
二:(1)职责:处理增加,删除,修改的职责;
(2):约束:通常有表单提交;并且使用FormService进行验证的功能必须使用action
publicclassProductAction {

/** * 新增产品 */

publicvoiddoCreate(@FormGroup(name = "productForm") ProductVO productVO) {

productAO.create(productVO);
}

/** * 修改产品 */
publicvoiddoUpdate(@FormGroup(name = "productForm") ProductVO productVO) {

productAO.update( productVO );
}
}
control:
职责:(1)嵌入基本的信息框
$control.setTemplate(“/product/viewProduct.vm”),注意加载的目录默认是从control目录开始的
(2):开发方式和screen类似,只不过是放在control目录下面
publicclassViewProduct {
publicvoidexecute(@Param(name = "productId") String productId,Context context) {
ProductDO productDO = productAO.find(productId);
context.put("product", productDO); }
}

Templates

作用:temnplates对应于mvc中的view模块。用于页面的渲染,这里使用了velocity模板引擎来处理动态数据和静态页面;templates也分为三种:layout,screen,control
screen:页面展示的静态资源,动态数据由module下的screen对象传入,使用模板引擎进行渲染
control:用于可重用的screen,具体使用$control.setTemplate("home/viewproduct.vm");
layout:用于页面布局





  


vm:前端的模板页面

1:layout:页面的总体布局

2:control:页面的一些片段;如BANNER,版本信息,

3:screen:是页面的主体内容;screen中的页面的名字,package和要绑定的数据(java类)要一致;即:约定大于配置;

当在浏览器上输入的url(即页面的地址;实际上就进去啦对应的相同名字的Java类啦)

下面是webx里面渲染模板的一些配置

   
   


   
   
       
       
       
       
   



   
   
       
           
       

   



Service Framework

Service Framework在系统中处于极为重要的地位。Service Framework正是为了解决Singleton/Configuration/Lifecycle这三个问题而设计的。Service Framework管理着一系统被称作Service的功能模块。Service是一个可重用、可扩展的独立模块。整个系统正是搭建在这一个个相对独立的Service的基础之上。

当Jboss容器启动时,会去加载War应用的xml文件,依次是web.xml -> webx-default.xml -> webx.xml -> biz-factory.xml -> war-biz-services.xml -> biz-manager.xml(等)

WebX是建立在Service Framework之上的,每个car都是一个独立的service容器,互不干扰,每个car的WEB-INF/webx.xml就是service配置文件

Service的生命期:

当servlet启动时(load-on-startup),所有定义在webx.xml中的services被初始化

当servlet关闭时,所有定义在webx.xml中的services被清除


PipelineService

Pipeline的工作原理

当一个HTTP请求到达的时候,Webx Framework取得特定pipeline激活它并开始执行. 一个pipeline是由一个或多个阀门(Valve)组成的,如下图所示

Valve是pipeline的主要组成部分,一个管道可以有多个Valve,每个Valve中还可以包含一个或多个Valves。

通常,pipeline会顺序触发所有的valves,但也可以让pipeline循环或选择地执行valves。

常见的value有

TryCatchFinallyValve

SetLoggingContextValve,有助于我们在Log4j日志文件中发现错误根源

SetLocaleValve,设置地域信息和字符集编码

AnalyzeURLValve,处理url映射,例如将*.htm文件转化为*.vm的target渲染模板文件

ChooseValve,类似if-else,其功能是实现分支。当when中条件满足,则执行该分支内容,否则如果有otherwise则执行之。

PerformActionValve && PerformScreenTemplateValve && PerformScreenValve

RedirectTargetValve&&SetErrorPageValve,进行内部重定向和设置错误处理页面。

#set($url = "$app1Link.setTarget('simple/download.do').addQueryData('filename', 'blob')")


<ahref="$url">$urla>











            


你可能感兴趣的:(webx)