4

私はJSFを使用しており、いくつかの処理を実行し、faces-config.xmlナビゲーションルールに応じてナビゲートする次のページを決定する変数「outcome」を設定するバッキングBeanメソッドがあります。

私がやりたいのは、次のページに移動したときにURL(バッキングBean内?)にパラメーターを追加することです。ただし、バッキングBeanメソッドがあるハンドラーには、HttpRequestオブジェクトへの参照はありません。これは古くからある既存のハンドラーなので、どうすればいいのか気になります。

request.setAttribute("name", value);

JSFで利用できる別のアプローチはありますか?どんな助けでも大歓迎です。


こんにちはBalusC、

以下で説明した内容を実装しようとしていますが、問題が発生しています。これは私が持っているものです:

StringBuffer url = ( (HttpServletRequest)FacesContext.getCurrentInstance().getExternalContext().getRequest()).getRequestURL();
    url.append( "?serialNumber=");
    url.append(regBean.getSerialNumber());
try{                     FacesContext.getCurrentInstance().getExternalContext().redirect(url.toString());
}catch (Exception ex){
    ex.printStackTrace();
}

例外は生成されませんが、「サーバーで不明なエラーが発生しました」という500Httpエラーが発生します。ログにはもう少し詳細が表示されますが、役立つには不十分です。

エラー[ライフサイクル]JSF1054:(フェーズID:INVOKE_APPLICATION 5、ビューID:/registration/productValidation.jsp)フェーズ実行中にスローされた例外:javax.faces.event.PhaseEvent [source = com.sun.faces.lifecycle.LifecycleImpl@591dae ] 11:19:12,186エラー[[Faces Servlet]]サーブレットFacesサーブレットのServlet.service()は、comでorg.apache.catalina.connector.ResponseFacade.sendRedirect(ResponseFacade.java:435)で例外java.lang.IllegalStateExceptionをスローしました.sun.faces.context.ExternalContextImpl.redirect(ExternalContextImpl.java:421)at com.sun.faces.application.NavigationHandlerImpl.handleNavigation(NavigationHandlerImpl.java:181)at com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl .java:130)at javax.faces.component.UICommand.broadcast(UICommand.java:387)atorg.ajax4jsf.component。AjaxViewRoot.processEvents(AjaxViewRoot.java:321)at org.ajax4jsf.component.AjaxViewRoot.broadcastEvents(AjaxViewRoot.java:296)at org.ajax4jsf.component.AjaxViewRoot.processPhase(AjaxViewRoot.java:253)atorg.ajax4jsf.component。 .AjaxViewRoot.processApplication(AjaxViewRoot.java:466)at com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:82)at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:100)82)com.sun.faces.lifecycle.Phase.doPhase(Phase.java:100)で82)com.sun.faces.lifecycle.Phase.doPhase(Phase.java:100)で

どんなアイデアでも大歓迎です。ありがとう!


わかりました、あなたのコメントに感謝します、私はいくつかのものを変えました、そして今私は持っています:

FacesContext.getCurrentInstance().getExternalContext().redirect("mypage.jsp?serialNumber=555555");

デバッグすると、mypage.htmでresourcebundle(プロパティファイル)からいくつかのヘッダーを表示しているため、リダイレクトが機能していることがわかります。ヘッダーを表示しようとすると、次の行でNullPointerが発生します。

FacesContext context = FacesContext.getCurrentInstance();

コンテキストがnullであるため、ログにはNullPointerエラーが表示されますが、ページのURLは正しいです。アドレスバーに http://..../mypage.jsp?serialNum=5555 と表示されています。ページの内容を表示するだけでは問題が発生しているようです。まだこれまでのところ近い;-(

4

2 に答える 2

5

ExternalContext#redirect()Beanアクションメソッドで自分で起動する必要があります。

public void submit() {
    String url = "page.jsp?name1=value1&name2=value2";
    FacesContext.getCurrentInstance().getExternalContext().redirect(url);
}

IDEバリデーターがvoidアクションメソッドについて急いでいる場合は、それを無視するか、メソッドブロックに宣言してメソッドブロックの最後にString置くことができます。return null;

後続のリクエストで特定のパラメータを一部のBeanに戻したい場合は、およびによって、faces-config.xmlでそれらを管理プロパティとして設定でき#{param.name1}ます#{param.name2}

とはいえ、リクエスト属性をリクエストパラメータと混同しないでください。リクエスト属性は、サーバー側でのみ現在のリクエストに関連付けられます。それらは決して次のリクエストに渡されません。そこで、リダイレクトURLに添付するか、応答ページのPOSTフォームに非表示のパラメーターとして含めることができる要求パラメーターを使用します。

HttpServletRequestさらに、 JSFでのハンドルをで取得できることを知っておくと便利な場合がありますExternalContext#getRequest()。ただし、JSFの内部から「生の」サーブレットAPIを取得することで、それほど遠くまで行かないようにする必要があります。JSFが提供する施設を可能な限り活用してください。

于 2009-12-31T20:04:08.943 に答える
1

view-paramJSF 2は、要素を介してナビゲーションハンドラーにパラメーターを追加しました。仕様から:

一致する<navigation-case>要素が見つかり、その<redirect/>要素がこれで指定された場合は、 ViewHandlergetRedirectURL()<navigation-case>呼び出し、現在のFacesContext要素内の要素内で指定された任意のname = valueパラメーターのペア、およびinclude-の値を渡します。要素のview-params属性(存在する場合)、false(存在しない場合)。このメソッドからの戻り値は、リダイレクトが発生するクライアントに送信される値です。現在のFacesContextでgetFlash()。setRedirect(true)を呼び出します。現在の応答でこのパスへのHTTPリダイレクトを実行し、<to-view-id><view-param><redirect />現在のリクエストのFacesContextインスタンスのresponseComplete() 。の内容が<to-view-id>値式の場合、最初にそれを評価してビューIDの値を取得します。

于 2010-01-01T18:37:37.850 に答える