亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

重定向和導航/前進有什么區別,什么時候使用什么?

重定向和導航/前進有什么區別,什么時候使用什么?

重定向和導航/前進有什么區別,什么時候使用什么?JSF中的導航有什么區別?FacesContext context = FacesContext.getCurrentInstance();context.getApplication().getNavigationHandler(). handleNavigation(context, null, url);重定向HttpServletResponse response = (HttpServletResponse) FacesContext.getCurrentInstance().getExternalContext(). getResponse();response.sendRedirect(url);以及如何決定什么時候使用什么?導航的問題是頁面URL不會更改,除非faces-redirect=true添加到導航URL的查詢字符串中。然而,在我的案例中faces-redirect=true如果我想重定向到非JSF頁面(就像普通的HTML頁面),就會拋出錯誤。另一種選擇是BalusC建議在JSF2.0重定向錯誤
查看完整描述

1 回答

?
www說

TA貢獻1775條經驗 獲得超8個贊

首先,“重定向”一詞在web開發世界中是指向客戶機發送一個空HTTP響應的動作,只需要一個Location其中包含新URL的標頭,客戶端必須在該URL上發送全新的GET請求。所以基本上:

  • 客戶端發送HTTP請求到

    somepage.xhtml.

  • 服務器將HTTP響應發送回

    Location: newpage.xhtml

    標頭
  • 客戶端發送HTTP請求到

    newpage.xhtml

    (這反映在瀏覽器地址欄中!)
  • 服務器發送HTTP響應,內容為

    newpage.xhtml.

您可以使用WebBrowser的內置/addonDeveloper工具集來跟蹤它。在Chrome/IE9/Firebug中按F12并檢查“網絡”部分來查看它。

JSF導航處理程序不發送重定向。相反,它使用目標頁面的內容作為HTTP響應。

  • 客戶端發送HTTP請求到

    somepage.xhtml.

  • 服務器發送HTTP響應,內容為

    newpage.xhtml.

但是,由于最初的HTTP請求是somepage.xhtml,瀏覽器地址欄中的URL保持不變。如果您熟悉BASIC Servlet API,那么您應該明白,這與RequestDispatcher#forward().


關于是否拉著.HttpServletResponse在JSF引擎下調用sendRedirect()這是正確的用法;不,這不是正確的用法。你的服務器日志會被弄得亂七八糟的IllegalStateException因為這樣您就不會告訴JSF您已經接管了響應處理的控制,因此JSF不應該做它的默認響應處理工作。實際上你應該執行FacesContext#responseComplete()之后。

而且,每次您需要從javax.servlet.*在JSF工件中包(如托管bean),您應該完全停止編寫代碼,如果您真的以正確的方式做事,應該三思而后問自己,對于您想要達到的目標,是否已經有了“標準JSF方法”,和/或任務是否真的屬于JSF管理bean(也就是有些情況下,簡單的JSF方法)Servlet過濾器會是個更好的地方)。

在JSF中執行重定向的正確方法是使用faces-redirect=true操作結果中的查詢字符串:

public String submit() {
    // ...
    return "/newpage.xhtml?faces-redirect=true";}

或使用ExternalContext#redirect()當您不在動作方法(如Ajax或預發布監聽器方法)中時:

public void listener() throws IOException {
    // ...
    ExternalContext ec = FacesContext.getCurrentInstance().getExternalContext();
    ec.redirect(ec.getRequestContextPath() + "/newpage.xhtml");}

(是的,你不需要把try-catch繞著它IOException,就讓這個例外過去吧throws,服務器容器將處理它)

或使用NavigationHandler#handleNavigation()在特定情況下,如果您使用XML導航案例和/或帶有內置監聽器的自定義導航處理程序:

public void listener() {
    // ...
    FacesContext fc = FacesContext.getCurrentInstance();
    NavigationHandler nh = fc.getApplication().getNavigationHandler();
    nh.handleNavigation(fc, null, "/newpage.xhtml?faces-redirect=true");}

至于導航處理程序為什么不能處理“普通HTML”文件,這只是因為導航處理程序只能處理JSF視圖,而不能處理其他文件。你應該用ExternalContext#redirect()然后。

另見:


查看完整回答
反對 回復 2019-07-10
  • 1 回答
  • 0 關注
  • 545 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號