この問題は本当にうんざりしており、そのためのベストプラクティスを見つけることができません。例の問題点に、私は明確にしてみましょう:カスタムクラスファイル内のJava WebのHttpServletRequest/Responseオブジェクトへのアクセス
私のような静的メソッドがあります:あなたは、私がリクエストとレスポンスオブジェクトにアクセスする必要が見ることができると私はHttpServletRequestを/レスポンスを渡したくないと
public class AppError {
public static void systemError(string errorMsg) { //Like "Can't connect to DB"
HttpServletRequest request = ?????????? "HOW TO ACCESS?";
request.setAttribute("Error", errorMsg);
request.getRequestDispatcher("/error.jsp").forward(request, response(????????));
}
}
をこれは、AppError.systemErrorが呼び出された場所を渡すことを意味し、ファイル、Cookie、ユーザー操作、データベース操作の読み取り/書き込みなど多くの場所です。
私は解決策が見つかったと思います。それはFilterと保存されたリクエストとレスポンスのオブジェクトで使用されますが、その後Filter.Destroy()メソッドを使用してThreadLocal変数を解放しますThreadLocal.remove()メソッドは、デバッグモードでテストしたときに呼び出されません。これは、スレッドが決して解放されないことを意味します。
ServletContextオブジェクト内の要求オブジェクトと応答オブジェクトにアクセスする方法が見つからないため、ServletContextListernerも解決策ではありません。私はServletContext.getRequest()のようなメソッドを期待しましたが、何もありません。
私はJSFも使用していますが、JSFの問題はFacesContextにもカスタムクラスではアクセスできません。またJSFはリスナーより遅くロードされているので、FacesContextを使用してリクエストおよび応答オブジェクトを取得すると、エラー・システムをリスナーで使用できません。
ここでベストプラクティスは何ですか?私はこれが明確な問題であることを意味し、私はこれを解決せずに進めることはできません。
Btw、エラーメソッドが例です。要求オブジェクトと応答オブジェクトにアクセスするために必要な場所があります。
:あなたのコンテナはコンテナ用のJavaの許可契約(JACC)をサポートしている場合は、次はあなただけでなく、現在の要求を取得しますアイデアArjan Tijmsは完全に問題を解決しました! – Seregwethrin