webx流程举例

(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()进行重定向



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值