webx学习(三)——Webx Turbine
Webx Turbine建立在Webx Framework的基础上,实现了页面渲染、布局、数据验证、数据提交等一系列工作。
Webx Turbine所遵循下面的设计理念包括:
页面驱动
约定胜于配置
页面布局:
其中:
Screen,代表页面的主体。
Layout,代表页面的布局。
Control,代表嵌在screen和layout中的页面片段
处理页面的基本流程:
Webx Turbine的处理流程被定义在pipeline中。Webx Framework没有规定Pipeline的内容,但Webx Turbine却定义了一系列valves。下面是一个Webx Turbine推荐的pipeline配置:
<services:pipeline xmlns= "http://www.alibaba.com/schema/services/pipeline/valves" >
<prepareForTurbine />
<setLoggingContext />
<analyzeURL homepage= "homepage" />
<checkCsrfToken />
<loop>
<choose>
<when>
<pl-conditions:target-extension-condition extension= "null, vm, jsp" />
<performAction />
<performTemplateScreen />
<renderTemplate />
</when>
<when>
<pl-conditions:target-extension-condition extension= "do" />
<performAction />
<performScreen />
</when>
<otherwise>
<exit />
</otherwise>
</choose>
<breakUnlessTargetRedirected />
</loop>
</services:pipeline>
|
当用户以:localhost:8080 来访问webx的时候,首先WebxFrameworkFilter接收请求,并一路到达pipeline
<analyzeURL> - 分析URL
分析URL的目的是取得target。由于用户访问的URL中并没有提供path信息,通常被理解为:用户想要访问“主页”。AnalyzeURL valve提供了一个可选的参数“homepage”,即是在这种情况下起作用 —— http://localhost:8081/对应的target为“homepage”。 需要注意的是,target不代表模板名,也不代表类名。Target只是一个抽象的概念 —— 当前页面需要达成的目标。Target可能被后续的valves解释成模板名、类名或者其它东西。 |
进入<choose> - 多重分支 很明显,“homepage”满足了第一个<when>所附带的条件:<target-extension-condition extension="null, vm, jsp">,意思是target的后缀不存在(null)或为“jsp”或为“vm”。 |
<performAction> - 执行action 和其它框架中的action概念不同,在Webx Turbine中,action是用来处理用户提交的表单的。 因为本次请求未提供action参数,所以跳过该步骤。 |
<performTemplateScreen> - 查找并执行screen。 这里要用到一个规则:target映射成screen module类名的规则。 假设target为xxx/yyy/zzz,那么Webx Turbine会依次查找下面的screen模块: screen.xxx.yyy.Zzz, screen.xxx.yyy.Default, screen.xxx.Default, screen.Default。 本次请求的target为homepage,因此它会尝试查找screen.Homepage和screen.Default这两个类。 |
<renderTemplate> - 渲染模板 这里用到两个规则:target映射成screen template,以及target映射成layout template。 假设target为xxx/yyy/zzz,那么Webx Turbine会查找下面的screen模板:/templates/screen/xxx/yyy/zzz。Screen模板如果未找到,就会报404 Not Found错误。 找到screen模板以后,Webx Turbine还会试着查找下面的layout模板: /templates/layout/xxx/yyy/zzz /templates/layout/xxx/yyy/default /templates/layout/xxx/default /templates/layout/default Layout模板如果找不到,就直接渲染screen模板;如果存在,则把渲染screen模板后的结果,嵌入到layout模板中。 |
<breakUnlessTargetRedirected> - 内部重定向 在screen和action中,可以进行“内部重定向”。内部重定向实质上就是由<breakUnlessTargetRedirected>实施的 —— 如果没有重定向标记,就退出;否则循环到<loop>标签。 和外部重定向不同,外部重定向是向浏览器返回一个302或303 response,其中包含Location header,浏览器看到这样的response以后,就会发出第二个请求。而内部重定向发生在pipeline内部,浏览器并不了解内部重定向。 |
接下来我们看一下petstore项目的pipeline.xml
<services:pipeline>
<!-- 初始化turbine rundata,并在pipelineContext中设置可能会用到的对象(如rundata、utils),以便valve取得。 -->
<pl-valves:prepareForTurbine />
<!-- 设置日志系统的上下文,支持把当前请求的详情打印在日志中。 -->
<pl-valves:setLoggingContext />
<!-- 分析URL,取得target。 -->
<pl-valves:analyzeURL homepage= "homepage" />
<!-- 检查csrf token,防止csrf攻击和重复提交。假如request和session中的token不匹配,则出错,或显示expired页面。 -->
<pl-valves:checkCsrfToken />
<!-- 检查页面的授权,如果当前用户无权访问该页面,则跳转到petstoreLogin页面 -->
<pl-valves:pageAuthorization callbackClass= "com.alibaba.sample.petstore.web.common.PetstoreUserAuth" />
<pl-valves:loop>
<pl-valves:choose>
<when>
<!-- 执行带模板的screen,默认有layout。 -->
<pl-conditions:target-extension-condition extension= "null" />
<pl-valves:performAction />
<pl-valves:performTemplateScreen />
<pl-valves:renderTemplate />
</when>
<when>
<!-- 执行不带模板的screen,无layout。 -->
<pl-conditions:target-extension-condition extension= "do" />
<pl-valves:performAction />
<pl-valves:performScreen />
</when>
<when>
<!-- 创建JSON,无模板,无layout。 -->
<pl-conditions:target-extension-condition extension= "json" />
<pl-valves:performScreen />
<pl-valves:renderResultAsJson />
</when>
<when>
<!-- 读取资源文件。 -->
<pl-conditions:path-condition name= "/petstore/images/(.+)" />
<pl-valves:getResource name= "/petstore/images/$1" />
</when>
<otherwise>
<!-- 将控制交还给servlet engine。 -->
<pl-valves:exit />
</otherwise>
</pl-valves:choose>
<!-- 假如rundata.setRedirectTarget()被设置,则循环,否则退出循环。 -->
<pl-valves:breakUnlessTargetRedirected />
</pl-valves:loop>
</services:pipeline>
|
依赖注入:
通过@Autowired annotation注入
public class LoginAction {
@Autowired
private UserManager userManager;
...
}
|
注入request、response和session对象
public class LoginAction {
@Autowired
private HttpServletRequest request;
@Autowired
private HttpServletResponse response;
@Autowired
private HttpSession session;
...
}
|
参数注入
转自本人内网空间:@璞尧
webx学习(三)——Webx Turbine相关推荐
- webx学习(二)——Webx Framework
Webx Framework负责完成一系列基础性的任务 Webx Framework的任务 初始化Spring容器 初始化日志系统 增强request/response/session的功能 提供pi ...
- webx学习(一)——初识webx
Webx是一个在阿里巴巴集团内部广泛使用的,层次化.模块化的一个Web框架. Webx是基于经典MVC设计模式的WEB框架,推崇页面驱动和约定胜于配置的理念. Webx是一个基于Spring的组件框架 ...
- 统计学习三要素 模型+策略+算法
统计学习方法都是由模型. 策略和算法构成的. 即统计学习方法由三要素构成, 可以简单地表示为:方法=模型+策略+算法 模型 统计学习首要考虑的问题是学习什么样的模型. 在监督学习过程中, 模型就是所要 ...
- 深度学习三巨头也成了大眼萌,这个一键转换动画电影形象的网站竟因「太火」而下线...
机器之心报道 作者:魔王.杜伟 想不想在动画电影中拥有自己的角色?这个网站一键满足你的需求,不过竟因流量太大成本过高而下线. 近期热映的电影<花木兰>总是让人回想起 1998 年上映的同名 ...
- 2020届 AAAI Fellow名单新鲜出炉!!!深度学习三巨头终于齐聚
点击上方"深度学习技术前沿",选择"星标"公众号 资源干货,第一时间送达 AAAI 是国际人工智能领域最权威的学术组织,Fellow 是该学会给予会员的最高荣誉 ...
- HTTP学习三:HTTPS
HTTP学习三:HTTPS 1 HTTP安全问题 HTTP1.0/1.1在网络中是明文传输的,因此会被黑客进行攻击. 1.1 窃取数据 因为HTTP1.0/1.1是明文的,黑客很容易获得用户的重要数据 ...
- python爬虫正则表达式实例-python爬虫学习三:python正则表达式
python爬虫学习三:python正则表达式 1.正则表达式基础 a.正则表达式的大致匹配过程: 1.依次拿出表达式和文本中的字符比较 2.如果每一个字符都能匹配,则匹配成功:一旦有匹配不成功的字符 ...
- TweenMax动画库学习(三)
目录 TweenMax动画库学习(一) TweenMax动画库学习(二) TweenMax动画库学习(三) ...
- 实至名归!ACM宣布深度学习三巨头共同获得图灵奖
昨日晚间,ACM(国际计算机学会)宣布,有"深度学习三巨头"之称的Yoshua Bengio.Yann LeCun.Geoffrey Hinton共同获得了2018年的图灵奖,这是 ...
- 【技术综述】图像与CNN发家简史,集齐深度学习三巨头
文章首发于微信公众号<有三AI> [技术综述]图像与CNN发家简史,集齐深度学习三巨头 没有一个经典的发现会是突然之间横空出世,它总是需要一些积淀. 提起卷积神经网络,我们总会从LeNet ...
最新文章
- python 自己写个调试工具
- JSOI2012-夏令营 Mar Maps
- STM32 基础系列教程 44 - FSMC_LCD
- 机器学习入门:机器学习概论
- Mysql 中的Text字段的范围
- 如何使用 C# 中的 Tuple
- 数据结构与算法--第一个只出现一次的字符
- 1059 C语言竞赛(PAT乙级 C++)
- 吐槽下CSDN编辑器
- # 检测中英输入法_奇怪的知识点增加了 手机输入法还能做更多
- 使用61850网关实现modbus和电力iec61850协议的转换
- 用python爬取了很多习题答案,mark一下
- mysql etimedout_NodeJS:MySQL有时会引发ETIMEDOUT错误
- 数据库复习-3.常用的概念模型
- 为什么人工智能工程师被戏称为“调参侠”?
- 在vue中使用marked解析markdown文件
- 在Ubuntu中以管理员身份用可视化的方式打开根目录文件夹
- 通过浏览器无法访问Hadoop管理页面
- 项目线上问题应急处理规范(不同公司流程规范不一样,仅供参考)
- 软件体系结构--《Software.architecture.perspectives.on.an.emerging.discipline》
热门文章
- php mysql.so 下载_Linux安装php-mysql提示需要:libmysqlclient.so.18()(64bit)的解决办法-Go语言中文社区...
- data fastboot 擦除_fastboot擦除恢复等待设备【专业修复数据】
- python中的参数函数_python中函数与参数的简介
- Pycharm 入门问题
- email邮件中 内嵌iframe_Python+Selenium执行结果,封装函数,用Python自动发送SMTP邮件...
- (计算机组成原理)第七章输入和输出系统-第二节2:外部设备之外存储器(磁盘的基本结构,磁盘阵列)
- 3-7:常见任务和主要工具之文本处理
- LeetCode 69 x 的平方根
- 小学生计算机辅助教学系统--练习加,减,乘,除法
- 防火墙和路由器的滑铁卢:NAT Slipstreaming攻击