新しい 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 を書き換えます。