您的位置:首页 > 其它

webx流程举例

2016-01-22 15:56 603 查看
(1)url解析<AnalyzeURLValve>

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()进行重定向
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: