`
iloveflower
  • 浏览: 80361 次
社区版块
存档分类
最新评论
  • iloveflower: 呵呵。好好学习。。。。。。。。。。。。
    java 读书
  • Eric.Yan: 看了一点,不过是电子版的……你这一说到提醒我了,还要继续学习哈 ...
    java 读书

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的情况下又如何呢? 
分享到:
评论

相关推荐

    JavaServer Faces 2.0完全参考手册(JSF2.0中文版) 1/2

    按照JSF导航模型声明一个页面,包括新的“隐式导航”功能。使用用户界面组件模型和JSF事件模型,包括支持可添加书签的页面以及POST、REDIRECT、GET模式。使用为模型数据验证设立的新的JSR-303bean验证标准。创建可以...

    JSF实战——一本经典JSF教材

    - **导航组件**:探讨了如何利用JSF的导航机制实现页面之间的跳转。 **第5章:输入组件与数据表格组件** - **输入验证**:讨论了JSF中如何对用户输入进行验证,确保数据的有效性。 - **数据表格**:介绍了如何使用...

    JSF的第一个程序

    - 在项目中创建一个名为`faces-config.xml`的配置文件,定义JSF的组件和导航规则。 - 创建一个JSF页面,例如`index.xhtml`,这是一个HTML和XML的混合文件,其中包含JSF组件。 **3. 编写JSF程序** JSF程序通常由以下...

    常用手册 JSF及Myfaces帮助.CHM

    7. **导航规则**:JSF的导航规则决定了用户操作后的页面跳转,可以通过配置文件或在代码中动态控制。 8. **MyFaces特有功能**:MyFaces提供了许多额外的功能,比如MyFaces CODI(Composite Component and ...

    JavaServer Faces 2.0完全参考手册(JSF2.0中文版).part1

    按照JSF导航模型声明一个页面,包括新的“隐式导航”功能。使用用户界面组件模型和JSF事件模型,包括支持可添加书签的页面以及POST、REDIRECT、GET模式。使用为模型数据验证设立的新的JSR-303bean验证标准。创建可以...

    JSF IN ACTION 源代码

    2. **LICENSE-APACHE-2.txt, LICENSE-JSF-RI.txt, LICENSE-APACHE.txt**:这些都是许可文件,分别对应Apache软件基金会的Apache 2.0许可证和JSF运行时的许可信息。Apache 2.0许可证允许自由地使用、修改和分发代码,...

    JSF实现,里边有很多JSF工程用到的Jar包

    MyFaces是Apache软件基金会的一个项目,它提供了JSF规范的实现。JSF的核心库(Core)是框架的基础部分,包含了处理请求、渲染响应、管理组件和事件处理的关键组件。版本1.2.9表明这是MyFaces Core的一个稳定版本,...

    jsf 1.2 myfaces1.2.7 richfaces3.3.1 facelets1.2 所有的最新包

    **MyFaces 1.2.7** 是JSF的一个开源实现,由Apache软件基金会维护。这个版本修复了许多已知的bug,提高了性能,并且提供了与JSF 1.2规范的兼容性。MyFaces强调了灵活性和模块化,使得开发者可以根据需求选择和配置...

    JSF入门配置[参照].pdf

    - 在此示例中,配置了一个导航规则,当从`/pages/index.jsp`页面出发,如果用户触发了`login`事件,就会跳转到`/pages/welcome.jsp`页面。 - 另外,定义了一个名为`user`的Managed Bean,它的类是`org.mike.beans....

    MVC模式JSF与Struts的异同.txt

    - **配置文件**:JSF使用`faces-config.xml`文件来定义页面导航规则、管理bean等配置信息。 #### 三、JSF与Struts的主要区别 ##### 1. 架构差异 - **Struts架构**:依赖于Servlet容器,使用Action作为控制器,...

    Asterion for JSF-开源

    快速JSF Web开发,每页具有单个Backing bean,并且直接进行干净的导航。 2015年3月20日:发布了2.0.2版,并在Tomcat,JBoss和Weblogic上进行了测试。 包含了用Ant生成的简单Tomcat示例代码。 Asterion for JSF是JSF ...

    JavaServer Faces 2.0 The Complete Reference.pdf

    - **Neil Griffin**:代表Liferay参加JSR 314(即JSF 2.0)专家小组,并拥有15年的专业软件工程经验。作为Liferay项目的贡献者,Neil负责与ICEsoft合作确保ICEfaces能够在Liferay Portal中正常集成。他还共同创立了...

    JavaServer Faces 2.0, The Complete Reference PDF原版高清

    Neil Griffin代表Liferay参与JSR314(即JSF 2.0)专家小组,拥有15年的软件工程专业经验。他是PortletFaces项目的联合创始人,该项目旨在简化JSF portlet的开发。Neil还为Liferay和ICEsoft撰写培训课程,为实施JSF和...

    Myfaces Orchestra Framework 1.4

    MyFaces是Apache软件基金会下的一个项目,提供了一个开源实现的JSF API和组件库。Orchestra则是MyFaces项目中的一个子项目,它主要关注于企业级应用中的复杂交互和协作问题。 MyFaces Orchestra Framework 1.4 版本...

    mojarra-2.0.0-EDR1-binary.zip

    - **错误修复**:针对JSF 2.0规范中的已知问题进行了修复,提高软件的稳定性和可靠性。 - **新API的初步实现**:可能包含了JSF 2.0新特性的一些初步实现,为开发者提供了预览和测试的机会。 **使用和学习指南** ...

    myfaces-core-1.2.2-bin

    MyFaces是Apache软件基金会开发的一个开源JavaServer Faces (JSF)实现项目,它提供了一整套用于构建Web应用程序的组件库和服务。标题"myfaces-core-1.2.2-bin"指的是MyFaces核心库的1.2.2版本的二进制发行版。这个...

    Apache MyFaces Core.zip

    Apache MyFaces Core是一个开源的JavaServer Faces (JSF)实现,它是Apache软件基金会的一个项目,主要专注于提供Web应用程序开发框架。这个压缩包“Apache MyFaces Core.zip”很可能包含了MyFaces库的核心组件,允许...

    J2EE软件工程师内部培训资料

    - **JSF页面导航**:介绍如何在JSF应用中实现页面之间的导航。 - **JSF简单工作流程及简单开发步骤**:提供一个简单的JSF应用开发示例。 - **ManagedBean**:解释ManagedBean的作用及其生命周期管理方式。 - **JSP...

    Java EE 6 tutorial 配套example代码

    示例代码可能涵盖从基本的组件使用到复杂的表单处理和导航。 4. **EJB(Enterprise JavaBeans)**:EJB 3.1引入了轻量级会话bean和实体bean,降低了使用门槛。例子可能包括如何创建和部署EJB,以及它们如何与JPA...

    beginning jboss seam

    Seam扩展了JSF的功能,提供了一种更直观的方式来处理表单提交、导航和页面逻辑。同时,Seam还支持Faceslets,这是一种用于构建JSF视图的XML语法,使得界面设计更加清晰。 对于持久层,Seam与JPA的集成简化了数据...

Global site tag (gtag.js) - Google Analytics