整个webx框架分成三个层次,webx turbine建立在webx framework的基础上,实现页面渲染、布局、数据验证、数据提交等一系列工作。
设计理念
- 页面驱动
- 约定胜于配置
页面驱动
创建一个web应用,一般会经历三个阶段:产品设计、用户界面设计、功能实现。分别由产品设计师、用户界面设计师和程序员协作完成。
页面驱动的意思是,在程序员介入以前,让界面设计师可以直接创建模板,并展示模板的效果。在webx turbine中,界面设计师可以通过pull tools工具来实现页面跳转、简单的表单验证、字符串操作等,这是因为pull tool服务预先准备了很多模板中可用的工具。
约定胜于配置
规则是预先定义的,工程师只需要按着规则来做事,就不需要额外的“配置”。
只需要将模板放在指定的目录、按照预定的方式命名module(也就是screen、action、control等),就不需要额外的配置。
- screen代表页面的主体。
- layout代表页面的布局。
- control代表嵌在screen和layout中的页面片段。
处理页面的基本流程
webx turbine的处理流程被定义在pipeline中,下面是一个推荐的pipline配置
<services:pipeline xmlns="http://www.alibaba.com/schema/services/pipeline/valves">
<!-- 初始化turbine rundata,并在pipelineContext中设置可能会用到的对象(如rundata、utils),以便valve取得。 -->
<prepareForTurbine />
<!-- 设置日志系统的上下文,支持把当前请求的详情打印在日志中。 -->
<setLoggingContext />
<!-- 分析URL,取得target。 -->
<analyzeURL homepage="homepage" />
<!-- 检查csrf token,防止csrf攻击和重复提交。假如request和session中的token不匹配,则出错,或显示expired页
面。 -->
<checkCsrfToken />
<loop>
<choose>
<when>
<!-- 执行带模板的screen,默认有layout。 -->
<pl-conditions:target-extension-condition extension="null, vm, jsp" />
<performAction />
<performTemplateScreen />
<renderTemplate />
</when>
<when>
<!-- 执行不带模板的screen,默认无layout。 -->
<pl-conditions:target-extension-condition extension="do" />
<performAction />
<performScreen />
</when>
<otherwise>
<!-- 将控制交还给servlet engine。 -->
<exit />
</otherwise>
</choose>
<!-- 假如rundata.setRedirectTarget()被设置,则循环,否则退出循环。 -->
<breakUnlessTargetRedirected />
</loop>
</services:pipeline>
webx framework的处理流程,从webxframeworkfilter接收请求,并且一路顺利到达pipeline,然后pipeline开始依次执行它的valves。
1.<analyzeURL>-分析URL
分析URL的目的是取得target,有一个可选的参数homepage,在用户访问的URL中没有提供path信息时,会被使用。
2.<choose>-多重分支
target-extension-condition extension="null, vm, jsp"的意思是target的后缀不存在(null)或为“jsp”或为“vm”。
3.<performAction>-执行action
和其它框架中的action概念不同,在webx turbine中,action是用来处理用户提交的表单的。
4.<performTemplateScreen>-查找并执行screen
假设target为xxx/yyy/zzz,那么webx turbine会依次查找下面的screen模块:
- screen.xxx.yyy.Zzz
- screen.xxx.yyy.Default
- screen.xxx.Default
- screen.Default
Screen类的功能,通常是读取数据库,然后把模板所需要的对象放到context中。
5.<renderTemplate>-渲染模板
这里会用到两个规则:target映射成screen template,以及target映射成layout template。
假设target为xxx/yyy/zzz,那么webx turbine会查找下面的screen模板:/templates/screen/xxx/yyy/zzz。如果未找到,就会报404 not found错误,找到screen模板以后,webx turbine还会试着查找下面的layout模板:
- /template/layout/xxx/yyy/zzz
- /template/layout/xxx/yyy/default
- /template/layout/xxx/default
- /template/layout/default
layout模板如果找不到,就直接渲染screen模板,如果存在,则把渲染screen模板后的结果,嵌入到layout模板中。layout模板和screnn模板中,都可以调用control,每个页面只有一个screen,却可以有任意多个controls。
6.<breadUnlessTargetRedirected>-内部重定向
在screen和action中,可以进行“内部重定向”,内部重定向实质上就是由<breakUnlessTargetRedirected>实施的,如果没有重定向标记,就退出;否则循环到<loop>标签。
和外部重定向不同,外部重定向是向浏览器返回一个302或303 response,其中包含Location header,浏览器看到这样的response以后,就会发出第二个请求。而内部重
定向发生在pipeline内部,浏览器并不了解内部重定向。
依赖注入
1.Spring原生注入手段
webx既然建立在spring基础上,当然支持spring原有的依赖流入。但需要注意,你只能注入相同scope或较大的scope的bean。
2.参数注入
有一些对象,是无法通过Spring的bean来注入,但webx turbine提供了一个可扩展的机制(DataResolver service)注入。
最后欢迎大家访问我的个人网站:1024s