目录
Webx里面有三个比较重要的概念,action,screen,control 8
Webx的三层模型
1. 表现层(Presentation Tier) —— 负责和WEB用户交互、或通过Web Service和外界应用交互。这一层是外界和内部商业逻辑交流的纽带。
2. 商业逻辑层(Business Tier) —— 实现了核心的商业逻辑。通过数据访问层存取数据源中数据。
3. 数据访问层(Data Access Tier)——和底层数据源交互,存取数据。也可以和公司内部的其它系统之间通信。
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,进行内部重定向和设置错误处理页面。
例如,在consign-web这个car的webx-default.xml配置文件中,有
,
这个servcie随着servlet的启动被初始化,pipelineService根据consign这个car的pipeline.xml文件的阀门 进行url映射,*.htm文件转化为*.vm的target渲染模板文件。
MappingService
MappingService定义了一组映射规则,下面这个是consign项目中的mappingService的url映射规则配置
URIBrokerService
Consign的URL配置文件
… …
http://${consign_appServer_host}
/
user
/
pick
… …
在模板中使用URIBroker(代理)的方法
例如,在velocity模板中,$userModule的值为http://wuliu.daily.taobao.net/user
在程序中使用URIBroker的方法
取得URIBrokerService:
URIBrokerService uriBrokerService = (URIBrokerService)getWebxComponent().getService(URIBrokerService.SERVICE_NAME);
取得指定名称的URIBroker:
URIBroker uriBroker = uriBrokerService.getURIBroker( "petstoreLoginLink", rundata);
渲染URL:String url = uriBroker.render();
RunData常用方法
取得HTTP request、response和session à rundata.getRequest() rundata.getResponse() rundata.getSession()
取得输出流(自动buffering)à rundata.getResponse().getWriter() rundata.getResponse().getOutputStream()
取得query参数 à undata.getParameters().getString("id") rundata.getParameters().getInt("quantity")
内部重定向 à rundata.setRedirectTarget("homepage.vm")
外部重定向 à rundata.setRedirectLocation("http://www.alibaba.com/")
设置content type和character encoding à rundata.setContentType("text/html") rundata.setCharacterEncoding("UTF-8")
存取request scope的参数à rundata.getAttribute(key) rundata.setAttribute(key, object)
Turbine风格的页面布局
Webx如何启动spring容器的
webx初始化时,根据web.xml文件中配置
org.springframework.web.context.ContextLoaderListener
去加载spring容器,另外在webx-default.xml文件中,配置了spring的bean工厂:
/webroot/WEB-INF/classes/biz/bean/biz-factory.xml
/webroot/WEB-INF/classes/biz/bean/uri-config.xml
Business Tier Framework
Business Tier Framework是一套基于Spring Framework ,以Use Case为中心的一套框架。它糅合了几种经典的JavaEE设计模式,使应用开发者在实现Use Case时,能够更专注于商业逻辑本身。
通过CommandDispatcher,你可以将不同的Command指派给不同的ApplicationObject来处理。通常一个Command就代表一个Use Case的请求。
Webx应用的打包方法
解决了三个问题
1. 大量内存的浪费。特别是当EAR中包含许多个WAR文件的时候。
2. 另人费解的ClassCastException异常。这是因为不同classloader所装载的类的实例是不能互换的。而不同的WAR文件却是共享同一个EAR class loader。因此在某些情况下(例如cache),一个WAR下的对象可能会跑到另一个WAR的程序中,从而导致错误。
3. 类的初始化问题。如果有一个被两个WAR所共享的类(位于EAR class loader),需要初始化。那么首先执行的WAR会抢先初始化该类,并用当前WAR的参数来初始化它。当第二个WAR被启动时,这个类的初始化状态有可能会发生错误。例如,在同一个EAR中同时运行两个使用Jakarta Turbine框架的WEB应用,就会发生这样的问题。org.apache.turbine.Turbine类会被第一个WEB应用初始化,而第二个WEB应用将失败。
Webx里面有三个比较重要的概念,action,screen,control
screen就相当于select查询,比如请求一个链接http://localhost:8080/test/get_user.vm,就会有GetUserScreen中的execute方法来获得用户信息,然后将其渲染到get_user.vm显示到页面。
示例代码:
action就相当于insert或update,比如注册页面,需要填写表单信息,然后点击注册按钮,请求http://localhost:8080/test/register.do,就会有UserAction中的doRegister方法来处理这些数据,插入到数据库表中。
示例代码:
webx执行的流程
当在浏览器里敲入http://wuliu.daily.taobao.net:80/user/my_test.htm时,在webx中发生了哪些事呢?
分析url
-
URL scheme:http:
-
Server name:wuliu.daily.taobao.net
-
Server port:80
-
Context path:/user
-
Servlet path:/my_test.htm
-
Target: /myTest.vm
-
user称为context path,服务器把这个请求交给user应用来接管
-
my_test.htm称为servlet path,在web.xml中把*.htm映射到webx controller servlet,webx controller servlet就接管了这个请求
-
webx controller servlet激活pipeline, 继而调用AnalyzeURLValue来分析 /my_test.htm是什么意思.根据默认规则,/my_test.htm被转换成/myTest.vm
-
根据traget查找screen模板:/screen/user/myTest.vm模板
-
根据target查找screen模块的类:
com.taobao.consign.web.module.screen.user.MyTest.java(找到该类)
com.taobao.consign.web.module.screen.user.Default.java
com.alibaba.turbine.module.screen.TemplateScreen(默认screen类) -
执行screen类,并渲染screen模板。如果还有layout布局,则执行第7、8步
-
渲染在layout模板中引用的control
渲染layout模板