分享
 
 
 

[翻译]JSF导航文件设置示例

王朝java/jsp·作者佚名  2006-01-09
窄屏简体版  字體: |||超大  

转载请注明原作者、译者以及出处。

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的情况下又如何呢?

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有