過去的一段時間,一直有人拿 JSF 的 Navigation 當靶子,批評 JSF,其實細心的人會發現,在 Java 世界,這樣的批評常常是很片面的,幾乎所有成熟的應用框架,在除了實現某些默認的功能外,還保留一些擴展的接口,提供了相當的擴展性,比如說 struts, spring 等很多的 web framework 都提供了很多擴展的接口,當然,JSF 也一樣。JSF 的 Navigation 中,我們一個 page 都有一個 from-view-id ,它的每個 navigation 出口 to-view-id 都必須定義,所以在不同的 from-view-id 中會有一些重復的 to-view-id,并且每當有一個新的 navigation 路徑,我們都必須配置這個路徑,才能夠在 action 中正確的轉向我們這個路徑。很多情況下,這樣的方式用起來都不是很爽,我們需要有一些簡單的方式,我們在 action 事件中,直接 return 一個 page 的 path 就會直接 forward 到這個 page ,在用的時候會方便一些,有沒有辦法去做到呢?
答案是肯定的。
在 JSF 的 Specification 中 7.4 中對 Naviation 已經有很明確的規定了,在 JSF API 中,提供了 NavigationHandler 這樣一個抽象類。
abstract void handleNavigation(FacesContext context, java.lang.String fromAction, java.lang.String outcome)
我們只要實現這樣的抽象方法,就可以實現一個自己定制的 Navigation 實現,當然我們現在用的只是一個 Default 的實現了,如果你希望按照你自己的想法去 Navigation 你的 Application,那么很簡單,你只要實現你自己的 handleNavigation 方法就可以了。
接著,需要在 face-config.xml 的 application 部分加入一些配置:
<application>
<navigation-handler>
your navigation handle implement
</navigation-handler>
</application>
試試看,在你的應用中,是不是已經按照你的 Navigation 在走了呢?
在 http://www.thearcmind.com/confluence/display/SpribernateSF/Spring+JSF+contribution+Round+2+NavigationHandlerSupport%2C+PrefixSuffixNavigationHandler 這篇文檔中,給了我們一個參考的實現,它提供了兩種方式來實現它的導航,我把相關的代碼附在本文后面,大家可以參考并很容易把它應用到你自己的應用中去了。 http://www.tkk7.com/Files/steady/navigation.rar
posted on 2006-05-29 08:52
steady 閱讀(2442)
評論(2) 編輯 收藏 所屬分類:
JSF & Myfaces