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的情况下又如何呢? 留给大家作为思考吧!
分享到:
相关推荐
本教程将深入探讨如何设置JSF导航文件,并通过实例解析其工作原理。 首先,我们需要了解导航文件的结构。一个典型的JSF导航文件通常以`.faces-config.xml`为扩展名,位于项目的`WEB-INF`目录下。这个文件包含了多个...
9. **导航和错误处理**:JSF允许通过定义导航规则控制请求后的页面跳转。此外,它还提供了处理错误和异常的机制。 10. **Ajax支持**:JSF 2.0引入了Partial State Saving和f:ajax标签,使开发者能够实现部分刷新,...
**JSF(JavaServer Faces)入门实例教程** JavaServer Faces(JSF)是Java平台上的一个用于构建Web应用程序的UI框架。它简化了用户界面组件的创建和管理,提供了MVC(模型-视图-控制器)架构,使得开发人员可以更...
**JSF(JavaServer Faces)** 是一个Java平台上的用户界面框架,主要用于构建Web应用程序。...通过学习JSF实例,特别是像ptrack这样的实践项目,开发者能够快速上手并精通JSF,从而更高效地构建企业级的Java Web应用。
JSF 2.0 实例分析** 文档《JSF2.0系列简介.doc》可能详细介绍了JSF 2.0的基础知识和实践指导,而压缩包中提供的源代码可能是为了演示如何在实际项目中使用JSF 2.0。这些示例可能涵盖了以下内容: - **创建基本的...
以下是对JSF入门实例的详细解析: 1. **JSFFive**: JSFFive可能是一个介绍JSF核心概念的例子,如视图(View)、控制器(Controller)和模型(Model)。在JSF中,视图通常由JSP页面组成,控制器由JSF的事件处理...
通过分析和运行这些示例,你可以了解JSF组件如何工作,以及如何将它们与Managed Beans连接起来传递数据。 在实际开发中,了解**JSF的EL(Expression Language)** 和**JSF的Faces Context** 也非常重要。EL是一种...
**JSF(JavaServer Faces)应用实例解析** JavaServer Faces(JSF)是Java平台上的一个用于构建用户界面的组件模型框架,它简化了Web应用程序的开发,特别是处理用户交互和业务逻辑集成的部分。JSF的核心概念是组件...
这个小实例"Jsf的可以部署直接运行的小实例"是为了帮助开发者快速理解和上手JSF框架。 首先,我们来了解一下JSF的基本架构。JSF由一系列组件、事件、渲染器和生命周期阶段组成。它遵循MVC(模型-视图-控制器)设计...
【Spring+Hibernate+JSF实例】是一个综合性的项目,展示了如何在Java开发环境中整合这三个关键技术。Spring是一个开源的Java框架,主要关注于依赖注入(Dependency Injection)和面向切面编程(Aspect-Oriented ...
通过分析这个实例,你可以深入理解JSF如何处理用户交互、管理组件状态、执行业务逻辑以及与后端数据库交互。这对于提高你的Java Web开发技能,尤其是JSF技术栈的理解,将大有裨益。实践是最好的老师,动手运行这个...
- **静态导航实例**:通过创建Bean文件、设置配置文件和绘制页面文件,展示了如何使用JSF实现简单的导航功能。 - **动态导航实例**:进一步介绍了如何根据用户的输入动态地改变页面的显示内容,这通常涉及到更复杂...
以下将详细解析这个实例所涉及的关键知识点: 1. **JSF框架**:JSF是Java EE的一部分,提供了一套标准的UI组件和事件处理机制。开发者可以使用这些组件构建Web页面,同时,JSF会处理用户交互,更新模型数据,以及...
这份"jsf核心编程源码"资源显然是一个关于JSF深入学习的实例教程,包含有"corejsf2-examples-part1"这个子文件夹,很可能里面是JSF 2.x版本的一些基础到进阶的示例代码。 JSF的核心概念包括以下几个方面: 1. **...
1. **配置 JSF**:首先,设置 JSF 的环境,包括配置 faces-config.xml 文件,定义视图、导航规则和 Managed Beans。 2. **集成 Spring**:通过在 JSF 的 Managed Beans 中注入 Spring 的 Bean,可以利用 Spring 的...
本实例是针对JSF初学者设计的,包含PDF文档解说和源码,旨在帮助学习者快速掌握JSF的基本用法。 **PDF文档解说** "JSF KickStart Tutorial" 提供了关于JSF的基础知识和实践指导,可能是用简单的英文编写的,使得非...
实例解析** "JSF入门.pdf"中提供了详细的实例,涵盖从创建第一个JSF项目到实现复杂功能的全过程,通过实践加深对JSF的理解。 总的来说,JSF基础教程将引导初学者逐步了解并掌握JSF的核心概念、组件使用、MVC模式...
通过上述分析,我们可以看到JSF框架不仅提供了一个强大且灵活的平台来构建动态Web应用程序,而且还支持一系列高级特性,如事件处理、导航控制、数据验证等。对于希望构建功能丰富、用户友好的Web应用的开发者来说,...
**JSF(JavaServer Faces)**是Java平台上用于构建用户界面的一种框架,它简化了Web应用程序的开发,尤其是处理表单提交、数据验证和页面导航等任务。在本实例"JSF实例学习--比萨(pizza)订购系统"中,我们将深入...