Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 261|回复: 0

[jsf学习]JSF导航文件设置示例

[复制链接]
  • TA的每日心情
    开心
    2021-3-12 23:18
  • 签到天数: 2 天

    [LV.1]初来乍到

    发表于 2014-10-10 01:52:03 | 显示全部楼层 |阅读模式
    JSF导航文件设置示例
      

      
      
       
         
         JSF Navigation by Examples  JSF导航文件设置示例  作者: Sergey Smirnov 翻译:fei  原文见 http://forum.exadel.com/viewtopic.php?t=579
         
         
         

    The JavaSErver Faces (JSF)的Navigation框架提供了一些导航规则,可以使您在设计网站应用程序时定义view(大部分是JSP页面)之间的页面导航。这些规则和 其他一些设置一起定义在JSF配置文件中。该文件的名称一般是 faces-config.xml 。不过完全可以把这个文件名改成其他名字,甚至可以用多个配置文件来存放相关的JSF配置信息,只要在web.xml文件中进行类似下面的设置:

          
            
            Code:
            
            
            <context-param>
      <param-name>javax.faces.CONFIG_FILES</param-name>
      <param-value>/WEB-INF/faces-config.xml,/WEB-INF/faces-beans.xml</param-value>
    </context-param>  
            
          

    一个简单的例子
    一个导航规则的构成其实很简单,让我们来看第一个例子:

          
            
            Code:
            
            
            <navigation-rule>
      <from-view-id>/pages/inputname.jsp</from-view-id>

      <navigation-case>
        <from-outcome>sayHello</from-outcome>
        <to-view-id>/pages/greeting.jsp</to-view-id>
      </navigation-case>

      <navigation-case>
       <from-outcome>sayGoodbye</from-outcome>
       <to-view-id>/pages/goodbye.jsp</to-view-id>
      </navigation-case>

    </navigation-rule>  
            
             
             
             

             
            
          
    这段代码规定了名为 /pages/inputname.jsp view的两个输出(outcomes), sayHello 和 sayGoodbye ,它们分别同特定的页面相关联。

    设置一个默认的输出事件(Outcome Case)
    基本结构很简单,但是可以在这个基础在进行很多变化。请看下一段代码:

          
            
            Code:
            
            
            <navigation-rule>
      <from-view-id>/pages/inputname.jsp</from-view-id>
      <navigation-case>
       <from-outcome>sayHello</from-outcome>
       <to-view-id>/pages/greeting.jsp</to-view-id>
      </navigation-case>
      <navigation-case>
        <to-view-id>/pages/goodbye.jsp</to-view-id>
      </navigation-case>
    </navigation-rule>  
            
           该段代码同上面的代码非常类似,不同的是在第二个 navigation-case 中缺少了 from-outcome 元素。这意味着所有除 sayHello 之外的outcome都将进入 /pages/goodbye.jsp 页面。

    利用模式
    JSF的navigation模型允许我们利用模式(patterns)。这些模式有一个以星号“*”结尾的字符串组成。参见下例:

          
            
            Code:
            
            
            <navigation-rule>
      <from-view-id>/pages/*</from-view-id>
      <navigation-case>
         <from-outcome>menu</from-outcome>
         <to-view-id>/menu/main_main.jsp</to-view-id>
      </navigation-case>
      <navigation-case>
        <from-outcome>info</from-outcome>
        <to-view-id>/menu/info.HTML</to-view-id>
      </navigation-case>
    </navigation-rule>  
            
           这段导航规则适用于类似 /pages/exit.jsp 之类的任何以 /pages/ 为起始URL的页面。注意星号一定要放在最后。例如一个类似 / pages/*.jsp 的模式是无效的。

    Resolving More Than One Matching Rule
    现在我们来细察一下JSF导航模型中该如何处理多个规则。具体见下面例子:

          
            
            Code:
            
            
            <navigation-rule>
      <from-view-id>/pages/*</from-view-id>
      <navigation-case>
       <from-outcome>info</from-outcome>
       <to-view-id>/menu/generalHelp.html</to-view-id>
      </navigation-case>
    </navigation-rule>

    <navigation-rule>
      <from-view-id>/pages/login.jsp</from-view-id>
      <navigation-case>
        <from-outcome>info</from-outcome>
        <to-view-id>/menu/loginHelp.html</to-view-id>
      </navigation-case>
    </navigation-rule>  
            
          
    该例中,第二个导航规则,而不是前一个,将对 /pages/login.jsp 生效,尽管该页面也匹配第一个规则中的模式 /pages/* 。这说明对于一个特定的 from-outcome ,匹配更为具体的规则将生效。

    "Global" Outcomes
    假设现在我们需要一个globalHelp输出(outcome) 可以使得从任何页面转到帮助页面 /help/index.html 。要实现该效果,可以利用下面两个声明中的任何一个:

          
            
            Code:
            
            
            <navigation-rule>
      <from-view-id>*</from-view-id>
      <navigation-case>
         <from-outcome>globalhelp</from-outcome>
         <to-view-id>/menu/generalHelp.html</to-view-id>
      </navigation-case>
    </navigation-rule>
    <navigation-rule>
      <navigation-case>
         <from-outcome>globalhelp</from-outcome>
         <to-view-id>/menu/generalHelp.html</to-view-id>
      </navigation-case>
    </navigation-rule>  
            
          
    第一段代码在标签 from-view-id 中使用了星号,而第二断代码甚至根本没有用from-view-id标签。两者都可以达到相同的效果。不过需注意的是,一个空的from-view-id元素是没有任何效果的,例如:

          
            
            Code:
            
            
            <navigation-rule>
      <from-view-id></from-view-id>
      <navigation-case>
        <from-outcome>globalhelp</from-outcome>
        <to-view-id>/menu/generalHelp.html</to-view-id>
      </navigation-case>
    </navigation-rule>  
            
          

    规则的冲突
    这是个有趣的问题。如果有两个相同的 from-view-id ,其包含from-outcome也相同,只是指向不同的页面。来看看下一个例子:

          
            
            Code:
            
            
            <navigation-rule>
      <from-view-id>*</from-view-id>
      <navigation-case>
        <from-outcome>globalhelp</from-outcome>
        <to-view-id>/menu/generalHelp.html</to-view-id>
      </navigation-case>
    </navigation-rule>

    <navigation-rule>
      <from-view-id>*</from-view-id>
      <navigation-case>
        <from-outcome>globalhelp</from-outcome>
        <to-view-id>/pages/goaway.html</to-view-id>
      </navigation-case>
    </navigation-rule>  
            
           这种情况下,最后一个规则将生效。同时还需注意本文前面提到可以将JSF配置信息置于多个文件中的情况。从而产生冲突的规则可能位于不同的配置文件,此时应根据 web.xml 文件中的JSF配置文件列表,在含冲突规则的配置文件中最后加载的文件中的相关规则将会生效。

    将一个导航规则分开为几部分
    这是同一种效果的不同实现方式。试比较下面两段代码:

          
            
            Code:
            
            
            <navigation-rule>
      <from-view-id>/pages/inputname.jsp</from-view-id>
      <navigation-case>
         <from-outcome>sayHello</from-outcome>
         <to-view-id>/pages/greeting.jsp</to-view-id>
      </navigation-case>
      <navigation-case>
         <from-outcome>sayGoodbye</from-outcome>
         <to-view-id>/pages/goodbye.jsp</to-view-id>
      </navigation-case>
    </navigation-rule>  
            
          


          
            
            Code:
            
            
            <navigation-rule>
       <from-view-id>/pages/inputname.jsp</from-view-id>
       <navigation-case>
          <from-outcome>sayHello</from-outcome>
          <to-view-id>/pages/greeting.jsp</to-view-id>
       </navigation-case>
    <navigation-rule>
    ...
    ...
    <navigation-rule>
      <from-view-id>/pages/inputname.jsp</from-view-id>
      <navigation-case>
         <from-outcome>sayGoodbye</from-outcome>
         <to-view-id>/pages/goodbye.jsp</to-view-id>
      </navigation-case>  
            
          
    运行时两者效果相同。不过,第二段代码显示规则声明可以任意分开后放在配置文件的不同位置,甚至是不同的配置文件中。你可以根据自己的需要选择不同的方式。

    在action中使用导航规则
    现在,该看看如何将前面所学内容应用于程序中了。下面便是一个JSP页面可能包含的代码:

          
            
            Code:
            
            
            <h:commandButton id="submit" action="sayHello" value="Submit" />  
            
          
    action属性值将被用作一个输出(outcome)。这里是另一种方式:

          
            
            Code:
            
            
            <h:commandButton id="submit" action="#{GetNameBean.helloAction}" value="Submit" />  
            
          
    这意味着将调用GetNameBean的helloAction方法,该方法运行的结果将成为一个outcome。注意helloAction必须是一个返回值为字符串的public方法。
    上面两种不同action属性值的写法区别在考虑到配置文件中的一个标签时将比较重要,这个标签便是 from-action 标签,我们前面还未提及。请参考下面代码:

          
            
            Code:
            
            
             <navigation-rule>
      <from-view-id>/pages/inputname.jsp</from-view-id>
      <navigation-case>
         <from-outcome>sayHello</from-outcome>
         <to-view-id>/pages/anotherhello.jsp</to-view-id>
      </navigation-case>
      <navigation-case>
         <from-action>#{GetNameBean.helloAction}</from-action>
         <from-outcome>sayHello</from-outcome>
         <to-view-id>/pages/hello.jsp</to-view-id>
      </navigation-case>
    </navigation-rule>  
            
          
    在这段代码中,两个navigation cases均含有相同的 from-view-id 以及 from-outcome 元素,不过第二个navigation case包含一个from-action元素。如果 sayHello 这个outcome是通过 GetNameBean.helloAction 产生的话,第二个navigation case将生效,不过其原因仅仅是除 from-outcome 外两者具有相同的优先级(原文: If the sayHello outcome is determined by GetNameBean.helloAction , the second navigation case will take effect, but only because otherwise both cases had equal precedence .)

    Review
    为了检查您对本文的理解情况。请看下面例子,在 /pages/inputname.jsp 这页面中对commandButton有一下声明:

          
            
            Code:
            
            
            <h:commandButton id="submit" action="#{GetNameBean.helloAction}" value="Submit" />  
            
          
    而JSF配置文件则包含了一下内容:

          
            
            Code:
            
            
            <navigation-rule>
      <from-view-id>/pages/inputname.jsp</from-view-id>
      <navigation-case>
        <from-outcome>sayHello</from-outcome>
        <to-view-id>/a.jsp</to-view-id>
      </navigation-case>
    </navigation-rule>

    <navigation-rule>
      <from-view-id>/pages/*</from-view-id>
      <navigation-case>
         <from-action>#{GetNameBean.helloAction}</from-action>
         <from-outcome>sayHello</from-outcome>
         <to-view-id>/b.jsp</to-view-id>
      </navigation-case>
    </navigation-rule>  
            
          

    如果上面页面中的提交按钮被按下,到底跳到/a.jsp or /b.jsp的哪个页面,如果在GetNameBean.helloAction返回值为sayHello的情况下又如何呢?
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2025-2-26 17:49 , Processed in 0.299967 second(s), 36 queries .

    Powered by Discuz! X3.4

    © 2001-2017 Comsenz Inc.

    快速回复 返回顶部 返回列表