JSF导航文件如何设置实例解析

lin阿靡

lin阿靡

2016-02-19 20:03

今天图老师小编给大家介绍下JSF导航文件如何设置实例解析,平时喜欢JSF导航文件如何设置实例解析的朋友赶紧收藏起来吧!记得点赞哦~

  The JavaServer Faces (JSF)的Navigation框架提供了一些导航规则,可以使您在设计网站应用程序时定义view(大部分是jsp页面)之间的页面导航。这些规则和 其他一些设置一起定义在JSF配置文件中。

  该文件的名称一般是 faces-config.XML 。不过完全可以把这个文件名改成其他名字,甚至可以用多个配置文件来存放相关的JSF配置信息,只要在web.xml文件中进行类似下面的设置:
  
  Code:

(本文来源于图老师网站,更多请访问http://m.tulaoshi.com/bianchengyuyan/)
 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:
  
  

(本文来源于图老师网站,更多请访问http://m.tulaoshi.com/bianchengyuyan/)
 navigation-rule 
  
  from-view-id
  
  /pages/inputname.jsp
  
  /from-view-id
  
  navigation-case
  
    from-outcomesayHello/from-outcome
  
    to-view-id
  
    /pages/greeting.jsp
  
    /to-view-id
  
  /navigation-case
  
  navigation-case
  
   from-outcomesayGoodbye/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-outcomesayHello/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-outcomemenu/from-outcome
  
  to-view-id/menu/main_main.jsp/to-view-id
  
  /navigation-case
  
  navigation-case
  
    from-outcomeinfo/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-outcomeinfo/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-outcomeinfo/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-outcomeglobalhelp/from-outcome
  
  to-view-id
  
  /menu/generalHelp.html
  
  /to-view-id
  
  /navigation-case
  
  /navigation-rule
  
  navigation-rule
  
  navigation-case
  
  from-outcomeglobalhelp/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
  
  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

  
  规则的冲突
  
  

  
  这是个有趣的问题。假如有两个相同的 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-outcomesayHello/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:
  
  
?xml:namespace prefix = h />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-outcomesayHello/from-outcome
  
  to-view-id
  
  /pages/anotherhello.jsp
  
  /to-view-id
  
  /navigation-case
  
  navigation-case
  
  from-action
  
  #{GetNameBean.helloAction}
  
  /from-action
  
  from-outcomesayHello/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 外两者具有相同的优先级。
  
  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-outcomesayHello/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-outcomesayHello/from-outcome
  
  to-view-id/b.jsp/to-view-id
  
  /navigation-case
  
  /navigation-rule
假如上面页面中的提交按钮被按下,到底跳到/a.jsp还是/b.jsp的哪个页面,假如在GetNameBean.helloAction返回值为sayHello的情况下又如何呢? 留给大家作为思考吧!
展开更多 50%)
分享

猜你喜欢

JSF导航文件如何设置实例解析

编程语言 网络编程
JSF导航文件如何设置实例解析

神州租车导航路线如何设置

租车 手机软件 应用软件
神州租车导航路线如何设置

s8lol主宰符文怎么配

英雄联盟 网络游戏
s8lol主宰符文怎么配

高德导航如何设置语音类别

手机软件 应用软件
高德导航如何设置语音类别

安卓如何进行手机导航设置

Android
安卓如何进行手机导航设置

lol偷钱流符文搭配推荐

英雄联盟 网络游戏
lol偷钱流符文搭配推荐

如何设置FlashFXP文件关联

电脑 文件
如何设置FlashFXP文件关联

WinRAR如何设置关联文件

电脑网络
WinRAR如何设置关联文件

lolAD刺客新符文搭配推荐

英雄联盟
lolAD刺客新符文搭配推荐

Excel中sumif函数用法

Excel中sumif函数用法

深入分析Java中webwork的文件上传机制

深入分析Java中webwork的文件上传机制
下拉加载更多内容 ↓