`
JAVA海洋
  • 浏览: 599788 次
  • 性别: Icon_minigender_1
  • 来自: 太原
社区版块
存档分类
最新评论

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

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

Code:

<ccid_nobr></ccid_nobr>
<ccid_code></ccid_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:

<ccid_nobr></ccid_nobr>
<ccid_code></ccid_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:

<ccid_nobr></ccid_nobr>
<ccid_code></ccid_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:

<ccid_nobr></ccid_nobr>
<ccid_code></ccid_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:

<ccid_nobr></ccid_nobr>
<ccid_code></ccid_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:

<ccid_nobr></ccid_nobr>
<ccid_code></ccid_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:

<ccid_nobr></ccid_nobr>
<ccid_code></ccid_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:

<ccid_nobr></ccid_nobr>
<ccid_code></ccid_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:

<ccid_nobr></ccid_nobr>
<ccid_code></ccid_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:

<ccid_nobr></ccid_nobr>
<ccid_code></ccid_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:

<ccid_nobr></ccid_nobr>
<ccid_code></ccid_code><h:commandButton 
id="submit" 
action="sayHello" 
value="Submit" />


action属性值将被用作一个输出(outcome)。这里是另一种方式:

Code:

<ccid_nobr></ccid_nobr>
<ccid_code></ccid_code><h:commandButton id="submit" 
action="#{GetNameBean.helloAction}"
value="Submit" />


这意味着将调用GetNameBean的helloAction方法,该方法运行的结果将成为一个outcome。注意helloAction必须是一个返回值为字符串的public方法。

上面两种不同action属性值的写法区别在考虑到配置文件中的一个标签时将比较重要,这个标签便是 from-action 标签,我们前面还未提及。请参考下面代码:

Code:

<ccid_nobr></ccid_nobr>
<ccid_code></ccid_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 外两者具有相同的优先级。

Review

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

Code:

<ccid_nobr></ccid_nobr>
<ccid_code></ccid_code><h:commandButton id="submit" 
action="#{GetNameBean.helloAction}"
value="Submit" />


而JSF配置文件则包含了一下内容:

Code:

<ccid_nobr></ccid_nobr>
<ccid_code></ccid_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还是/b.jsp的哪个页面,如果在GetNameBean.helloAction返回值为sayHello的情况下又如何呢? 留给大家作为思考吧!
分享到:
评论
1 楼 guji528 2012-06-05  
写的很详细

相关推荐

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

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

    JAVA上百实例源码以及开源项目源代码

     Java波浪文字,一个利用Java处理字符的实例,可以设置运动方向参数,显示文本的字符数组,高速文本颜色,显示字体的 FontMetrics对象,得到Graphics实例,得到Image实例,填充颜色数组数据,初始化颜色数组。...

    JAVA上百实例源码以及开源项目

     Java波浪文字,一个利用Java处理字符的实例,可以设置运动方向参数,显示文本的字符数组,高速文本颜色,显示字体的 FontMetrics对象,得到Graphics实例,得到Image实例,填充颜色数组数据,初始化颜色数组。...

    J2EE应用开发详解

    142 9.2 一个简单的JSF应用 142 9.2.1 JSF应用程序开发步骤 143 9.2.2 用户登录实例 143 9.3 JSF应用程序架构 147 9.3.1 JSF请求处理生命周期 147 9.3.2 JSF事件驱动模型 148 9.3.3 JSF导航模型 149 9.4 JSF的组成 ...

    JAVA程序开发大全---上半部分

    本书内容主要来自作者多年的软件开发和教学、培训经验,通过实例由浅入深地介绍MyEclipse的基本应用,是一本强调实践技能的实用性指导图书。 本书内容丰富、技术全面、案例实用,而且所有的实例都以MyEclipse工程的...

    java开源包10

    parboiled 是一个纯Java库提供了一种轻量级,易于使用,功能强大和优雅的PEG(解析表达式语法)分析设施。你定义的Java源代码的语法规则,直接,没有必要专门编写和维护,外部语法文件。同时保持蒸提供全面的支持,...

    java开源包8

    parboiled 是一个纯Java库提供了一种轻量级,易于使用,功能强大和优雅的PEG(解析表达式语法)分析设施。你定义的Java源代码的语法规则,直接,没有必要专门编写和维护,外部语法文件。同时保持蒸提供全面的支持,...

    java开源包1

    parboiled 是一个纯Java库提供了一种轻量级,易于使用,功能强大和优雅的PEG(解析表达式语法)分析设施。你定义的Java源代码的语法规则,直接,没有必要专门编写和维护,外部语法文件。同时保持蒸提供全面的支持,...

    java开源包2

    parboiled 是一个纯Java库提供了一种轻量级,易于使用,功能强大和优雅的PEG(解析表达式语法)分析设施。你定义的Java源代码的语法规则,直接,没有必要专门编写和维护,外部语法文件。同时保持蒸提供全面的支持,...

    java开源包3

    parboiled 是一个纯Java库提供了一种轻量级,易于使用,功能强大和优雅的PEG(解析表达式语法)分析设施。你定义的Java源代码的语法规则,直接,没有必要专门编写和维护,外部语法文件。同时保持蒸提供全面的支持,...

    java开源包6

    parboiled 是一个纯Java库提供了一种轻量级,易于使用,功能强大和优雅的PEG(解析表达式语法)分析设施。你定义的Java源代码的语法规则,直接,没有必要专门编写和维护,外部语法文件。同时保持蒸提供全面的支持,...

    java开源包5

    parboiled 是一个纯Java库提供了一种轻量级,易于使用,功能强大和优雅的PEG(解析表达式语法)分析设施。你定义的Java源代码的语法规则,直接,没有必要专门编写和维护,外部语法文件。同时保持蒸提供全面的支持,...

    java开源包7

    parboiled 是一个纯Java库提供了一种轻量级,易于使用,功能强大和优雅的PEG(解析表达式语法)分析设施。你定义的Java源代码的语法规则,直接,没有必要专门编写和维护,外部语法文件。同时保持蒸提供全面的支持,...

    java开源包9

    parboiled 是一个纯Java库提供了一种轻量级,易于使用,功能强大和优雅的PEG(解析表达式语法)分析设施。你定义的Java源代码的语法规则,直接,没有必要专门编写和维护,外部语法文件。同时保持蒸提供全面的支持,...

    java开源包11

    parboiled 是一个纯Java库提供了一种轻量级,易于使用,功能强大和优雅的PEG(解析表达式语法)分析设施。你定义的Java源代码的语法规则,直接,没有必要专门编写和维护,外部语法文件。同时保持蒸提供全面的支持,...

    java开源包101

    parboiled 是一个纯Java库提供了一种轻量级,易于使用,功能强大和优雅的PEG(解析表达式语法)分析设施。你定义的Java源代码的语法规则,直接,没有必要专门编写和维护,外部语法文件。同时保持蒸提供全面的支持,...

    java开源包4

    parboiled 是一个纯Java库提供了一种轻量级,易于使用,功能强大和优雅的PEG(解析表达式语法)分析设施。你定义的Java源代码的语法规则,直接,没有必要专门编写和维护,外部语法文件。同时保持蒸提供全面的支持,...

    Hibernate实战(第2版 中文高清版)

     9.4.2 使用脱管的实体实例   9.5 在EJB组件中使用Java Persistence   9.5.1 注入EntityManager   9.5.2 查找EntityManager   9.5.3 访问EntityManagerFactory   9.6 小结   第10章 事务和并发   ...

    iuhyiuhkjh908u0980

    PrettyFaces优雅的解决了这个问题,包括诸如功能:网页装载行动,无缝的跟faces的导航整合,动态视图的ID分配和管理参数分析,无需配置,兼容其他JSF框架。P ... by zly06 2009-09-09 回复 (0) 相关博客 ant模板 ...

Global site tag (gtag.js) - Google Analytics