JSF中使用自定義Navigation
過去的一段時(shí)間,一直有人拿 JSF的Navigation 當(dāng)靶子,批評(píng) JSF,其實(shí)細(xì)心的人會(huì)發(fā)現(xiàn),在 Java 世界,這樣的批評(píng)常常是很片面的,幾乎所有成熟的應(yīng)用框架,在除了實(shí)現(xiàn)某些默認(rèn)的功能外,還保留一些擴(kuò)展的接口,提供了相當(dāng)?shù)臄U(kuò)展性,比如說 struts, spring 等很多的 web framework 都提供了很多擴(kuò)展的接口,當(dāng)然,JSF 也一樣。JSF的Navigation 中,我們一個(gè) page 都有一個(gè) from-view-id ,它的每個(gè) navigation 出口 to-view-id 都必須定義,所以在不同的 from-view-id 中會(huì)有一些重復(fù)的 to-view-id,并且每當(dāng)有一個(gè)新的 navigation 路徑,我們都必須配置這個(gè)路徑,才能夠在 action 中正確的轉(zhuǎn)向我們這個(gè)路徑。很多情況下,這樣的方式用起來都不是很爽,我們需要有一些簡(jiǎn)單的方式,我們?cè)?action 事件中,直接 return 一個(gè) page 的 path 就會(huì)直接 forward 到這個(gè) page ,在用的時(shí)候會(huì)方便一些,有沒有辦法去做到呢?
答案是肯定的。
在 JSF 的 Specification 中 7.4 中對(duì)JSF的Naviation 已經(jīng)有很明確的規(guī)定了,在 JSF API 中,提供了 NavigationHandler 這樣一個(gè)抽象類。
abstract void handleNavigation(FacesContext context, java.lang.String fromAction, java.lang.String outcome)
我們只要實(shí)現(xiàn)這樣的抽象方法,就可以實(shí)現(xiàn)一個(gè)自己定制的 Navigation 實(shí)現(xiàn),當(dāng)然我們現(xiàn)在用的只是一個(gè) Default 的實(shí)現(xiàn)了,如果你希望按照你自己的想法去 Navigation 你的 Application,那么很簡(jiǎn)單,你只要實(shí)現(xiàn)你自己的 handleNavigation 方法就可以了。
接著,需要在 face-config.xml 的 application 部分加入一些配置:
試試看,在你的應(yīng)用中,是不是已經(jīng)按照你的 Navigation 在走了呢.我們一個(gè)參考的實(shí)現(xiàn),我把相關(guān)的代碼附在本文后面,大家可以參考并很容易把它應(yīng)用到你自己的應(yīng)用中去了。
【編輯推薦】