webx的页面结构
webx页面由三部分组成:
- layout 对应着templetas文件夹里的layout文件夹,负责页面的布局。
- screen 对应着templates文件夹里的screen文件夹,是页面的主体内容。
- control 对应着templates文件夹里的control文件夹,是页面的通用部分,可以被多个screen或layout引用,例如页面导航、页脚等

webx执行流程
webx的执行流程是由pipeline控制的,所以流程的定义就在pipeline配置中,下面是推荐的pipeline配置
<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根据target来判断执行哪一个流程。如果后缀为空或为vm、jsp时,则执行第一个流程,如果后缀是do则执行第二个流程。
如果用户输入一个地址http://localhost:8080的话,webx的执行流程如下:
1、<anaylzeURL>分析url,取得target
由于http://localhost:8080并不包含context path,所以分析得到的target为null,在这种情况下target会取默认值homepage,target并不是模板也不是类,只是一个抽象概念,在后面的步骤中会根据target映射到模板和module类。
2、<choose>分支
根据取得的target可以确定,符合条件extension="null,vm,asp",webs会执行这一流程
3、<performAction>执行action
webx里的action专门用来处理用户提交的表单,由于本次请求没有action参数,所以忽略了这一步骤
4、<performTemplateScreen>查找并执行screen
在这一步,会把target映射成screen的module类,映射的规则如下:如果target是xxx/yyy/zzz,那么webs会按照以下的顺序来screen模块:
screen.xxx.yyy.zzz
screen.xxx.yyy.Default
screen.xxx.Default
screen.Default
本次请求的target是homepage,所以会查找screen.homepage和screen.default两个模块类,如果找到就执行,如果找不到也没关系。
5、<renderTemplates>渲染模板
这一步又分两部分:将target映射成screen模板、将target映射成layout模板
假设target是xxx/yyy/zzz,则webs会查找screen模板/templetes/screen/xxx/yyy/zzz,如果没找到就会报404错误。找到screen模板后,webs会按以下顺序查找layout模板:
/templates/layout/xxx/yyy/zzz
/templates/layout/xxx/yyy/default
/templates/layout/xxx/default
/templates/layout/default
如果没找到layout模板,则直接渲染screen模板,如果找到了layout模板,则将渲染的screen模板嵌入到layout模板中。
6、<breakunlessTargetRedirect>内部重定向
如果设置了内部重定向,则模板渲染完成后会循环loop标签,如果没有定义重定向,则执行完成,退出循环。
至此,一个webx请求的执行流程完成了~