Myfaces 和 Sun RI 表現出了兩種不同的頁面之間的導航方式,即:
1. Forwarding
2. Redirection
第一種方式并不是很好,問題在于 forwarding 將 request 轉交但是并沒有把新的URL通知給客戶端,這樣就會造成兩種問題:
1. 這樣看到的 URL 不一定是真實用到的 URL;
2. 刷新頁面的時候,讀取的是上一個頁面。
大部分傳統的 Web 應用的公司會首選使用 redirection 方法,但 redirection 效率有些低,因為它使用了兩次 request。
另外,當在 JSF 中使用 forwarding 技術,程序員大概就需要通過以下方法來傳遞參數:
1. 作為 f:param tag
2. 在 request 作用范圍設值
但這樣還會帶來以下的問題:
1. 在頁面之間傳遞參數通過以下兩種方式: request 參數、request 作用范圍值。最好采用一種統一的方式來處理這些參數,否則就很難處理從多個不同的地方訪問該頁面的情況。
2. redirection 的方法并沒有將這些 request 中的值傳遞到下個頁面。
因此(也是為了解決復雜的動態導航的問題),假定 redirection 是首選的導航方案,我們就需要實現一個自定義導航處理程序,并使其具備以下的能力:
1. 可以自定義 redirection 到任何一個頁面: 這樣我們就可以直接在 return 中直接寫一個我們想要導航的頁面作為返回值,緊接著,導航處理程序將會直接將頁面轉向到這個頁面,例如:
function String saveAction()
{
..
..
return "redirect:save_ok.jsp"
}
我們在返回時指定了一個前綴 "redirect:" 用以表明我們將要直接轉向一個頁面。這里我們將只能使用相對路徑。
當動態的 URL 參數傳入時:這樣允許在頁面間傳遞參數即便是用了 redirection 方式。
例如,為了從一個叫做 view.jsp 的頁面導航到一個 edit.jsp,并傳遞了參數 objectId,我們將可以通過以下方式來配置這樣的規則:
<navigation-rule>
<from-view-id>/view.jsp</from-view-id>
<navigation-case>
<from-outcome>edit</from-outcome>
<to-view-id>/view.jsp?objectId=#{view.objectId}</to-view-id>
<redirect />
</navigation-case>
</navigation-rule>
在 view.jsp 文件中,我們使用這樣的 command link 來導航: <h:commandLink value="Edit" action="edit" />
當然這只是一個設想,現在 JSF 還需要做很多事情才能進行正常的開發,這也只有通過慢慢的積累才能夠達到的。
posted on 2006-04-25 21:24
steady 閱讀(2572)
評論(1) 編輯 收藏 所屬分類:
JSF & Myfaces