webx流程举例
2016-01-22 15:56
603 查看
(1)url解析<AnalyzeURLValve>
1.作用
根据规则将url转化为内部使用的target
2.解析规则确定
描述了请求后缀如何映射
注意:如果url只有ip+端口,即http://localhost:8081/,也就是访问主页,其对应的target在xml中可以配置,也就是:
3.过程(http://localhost:8081/user/account.htm为例)
1)由ServletUtil.getResourcePath()获取servlet path,即模块名称+后面的 得到user/account.htm
2)servlet path去掉名称得到后面的字符串,得到account.htm
3)转化为驼峰形式,因为account不用转,所以还是account.htm,但是如果是say_hi.htm这种形式,就会转化为sayHi.htm
4)根据指定的rule id来获得指定的rule
其中的rules表示之前定义的所有rule,其中的ruleType与xml中定义的id一一对应,比如当前进入该方法时传入的参数为:
然后通过rule的getMappedName方法,以及定义的映射规则(<mapping extension="htm" to="" />)就可以得到“/account”,这就是target
5)取得action,因为account.htm只是用来展示数据的,没有表单,所以action为空
6)同样的,actionEvent也为空
(2)pipeline执行<loop>
1.作用
根据target来确定要执行的pipeline
2.定义
3.过程
由上面分析可知,我们当前的target是/accout,没有后缀,所以要执行三个valve
1)首先执行PerformActionValve。但是我们的action为空,所以直接跳转到下一个valve
2)然后执行<performTemplateScreen>。
首先根据target来获得Screen的名称,得到Account
然后根据Account从Spring 的Factory中获取Action(Screen)实例
接着调用screen的execute方法执行screen
最后将调用下一个valve
3)最后执行<renderTemplate>
首先根据context、rundata对由target获得的模板进行渲染
然后根据target获得layout模板,并将screen对应模板中的内容放在content中,最后再对layout进行渲染
(3)注意
上面分析的是非表单的,所以没有Action
如果是表单的话,会先处理Action,然后如果需要跳转的话,会使用nav.redirectTo("").withTarget()进行重定向
1.作用
根据规则将url转化为内部使用的target
2.解析规则确定
<!-- External target name => Internal target name --> <extension-rule id="extension.input"> <!-- 默认后缀 --> <mapping extension="" to="" /> <!-- JSP --> <mapping extension="jhtml" to="" /> <mapping extension="jsp" to="" /> <mapping extension="jspx" to="" /> <mapping extension="php" to="" /> <!-- Velocity --> <mapping extension="htm" to="" /> <mapping extension="vhtml" to="" /> <mapping extension="vm" to="" /> </extension-rule> <!-- Internal target name => External target name --> <extension-rule id="extension.output"> <!-- 默认后缀 --> <mapping extension="" to="htm" /> <!-- JSP --> <mapping extension="jhtml" to="jhtml" /> <mapping extension="jsp" to="jhtml" /> <mapping extension="jspx" to="jhtml" /> <mapping extension="php" to="jhtml" /> <!-- Velocity --> <mapping extension="htm" to="htm" /> <mapping extension="vhtml" to="htm" /> <mapping extension="vm" to="htm" /> </extension-rule>
描述了请求后缀如何映射
注意:如果url只有ip+端口,即http://localhost:8081/,也就是访问主页,其对应的target在xml中可以配置,也就是:
<pl-valves:analyzeURL homepage="myHomepage" />其中的myHomepage是我们自定义的vm
3.过程(http://localhost:8081/user/account.htm为例)
1)由ServletUtil.getResourcePath()获取servlet path,即模块名称+后面的 得到user/account.htm
2)servlet path去掉名称得到后面的字符串,得到account.htm
3)转化为驼峰形式,因为account不用转,所以还是account.htm,但是如果是say_hi.htm这种形式,就会转化为sayHi.htm
4)根据指定的rule id来获得指定的rule
public String getMappedName(String ruleType, String name) { MappingRule rule = rules.get(ruleType); if (rule == null) { if (parent == null) { throw new MappingRuleNotFoundException("Failed to get mapping rule of \"" + ruleType + "\""); } else { return parent.getMappedName(ruleType, name); } } return rule.getMappedName(name); }
其中的rules表示之前定义的所有rule,其中的ruleType与xml中定义的id一一对应,比如当前进入该方法时传入的参数为:
target = mappingRuleService.getMappedName(EXTENSION_INPUT, pathInfo);其中的EXTENSION_INPUT为extension.input,那么返回的MappingRule就为对应的对象
然后通过rule的getMappedName方法,以及定义的映射规则(<mapping extension="htm" to="" />)就可以得到“/account”,这就是target
5)取得action,因为account.htm只是用来展示数据的,没有表单,所以action为空
6)同样的,actionEvent也为空
(2)pipeline执行<loop>
1.作用
根据target来确定要执行的pipeline
2.定义
<loop> <choose> <when> <!-- 执行带模板的screen,默认有layout。 --> <pl-conditions:target-extension-condition extension="null, vm, jsp, jspx" /> <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>注释已经说的很明白了,如果target结尾是null,vm,jsp,jspx,那么就执行<performAction> <performTemplateScreen> <renderTemplate>三个valve
3.过程
由上面分析可知,我们当前的target是/accout,没有后缀,所以要执行三个valve
1)首先执行PerformActionValve。但是我们的action为空,所以直接跳转到下一个valve
2)然后执行<performTemplateScreen>。
首先根据target来获得Screen的名称,得到Account
然后根据Account从Spring 的Factory中获取Action(Screen)实例
接着调用screen的execute方法执行screen
最后将调用下一个valve
3)最后执行<renderTemplate>
首先根据context、rundata对由target获得的模板进行渲染
然后根据target获得layout模板,并将screen对应模板中的内容放在content中,最后再对layout进行渲染
(3)注意
上面分析的是非表单的,所以没有Action
如果是表单的话,会先处理Action,然后如果需要跳转的话,会使用nav.redirectTo("").withTarget()进行重定向
相关文章推荐
- 【scikit-learn】网格搜索来进行高效的参数调优
- c#解析xml字符串 分析 EntityName 时出错
- 安装vb6 正在更新系统 无响应
- Maven实战(二)构建简单Maven项目
- 【转】不用程序mysql也可以查询今天、昨天、7天、近30天、本月、上一月的数据
- SQL Performance Analyzer
- R语言の云图
- as导入三方库
- Quartz 实现定时定时爬虫
- React-Native学习指南
- SeaJS之define函数
- cocos studio的事件绑定 Click Touch Event
- vb6学习心路
- Vim的IDE配置(详细教程)
- 微信access_token的获取开发示例
- json转换
- spring bean的scope属性
- Log4Net之初步了解
- 内存优化
- 卷积稀疏编码