3

新しい URL で複数の言語をサポートするために拡張したい Web アプリがあります。たとえば、www.example.com/home.do は英語のままですが、www.example.com/es/home.do はスペイン語です。私が最初に考えたのは、/es/home.do のような着信 URL を /home.do に書き換える (そしてリクエストにロケールを設定する) フィルターを作成することでした。これはうまくいきます。Filter は、getContextPath() をオーバーライドして言語を返す HttpServletRequestWrapper で ServletRequest をラップします。

class FakeContextRequest extends HttpServletRequestWrapper {

  private String context = "";
  FakeContextRequest(HttpServletRequest request, String context) {
    super(request);
    // snip some validation code
    this.context = request.getContextPath() + context;
  }
  @Override
  public String getContextPath() {
    return this.context;
  }
}

My Filter は、次のように適切なリクエストに転送します。

FakeContextRequest fr = new FakeContextRequest(request, lang);
fr.getRequestDispatcher(newResourceName).forward(fr, response);

私の問題は、次のサーブレットが適切に転送されないことです。次のサーブレット (通常は Struts ActionServlet) が JSP (多くの場合、Struts タイルを使用) に転送されます。JSPに到達すると、HttpServletRequestが数回ラップされ、問題のオブジェクトはコンテキストが空であると報告します(アプリケーションが実際にデプロイされるルートコンテキスト)。

コンテキストを書き直して、既に存在するすべてのコンテキスト対応コードが、記述された URL に言語を自動的に挿入できるようにしたいと考えています。これは可能ですか?

編集:ラップされた HttpServletRequest の代わりにラップされた HttpServletResponse を使用して問題を解決しました。response.encodeURL() メソッドで URL を書き換えます。

4

3 に答える 3

1

getContextPath()あなたの問題を解決するのにオーバーライドが十分かどうかはわかりません。Struts が裏で呼び出しServletContext.getContextPath()ている場合や、 を使用しているgetRequestURI()場合などはどうなるでしょうか。

于 2008-11-03T23:50:25.563 に答える
0

私の知る限り、これを行う従来の方法は、accept-language HTTP ヘッダーを使用することです。プレゼンテーション言語はプレゼンテーションの詳細であり、アプリケーションをナビゲートするための一連の URL で表す必要はありません。

于 2008-11-03T23:12:11.427 に答える
0

response.encodeURL() および友人で URL 書き換えを行うことで問題を解決しました。リクエスト オブジェクトはリクエスト チェーン全体でラップされて置き換えられますが、レスポンス オブジェクトは問題なく処理されているようです。これは非常に確実に機能します。

于 2008-11-13T20:10:28.023 に答える