複数のテキスト入力を含むフォームを含む JSP があります。
テキスト入力にいくつかのデータを入力できます。送信ボタンをクリックすると、予想どおり、サーブレットの doPost メソッドが呼び出されます。PRG 設計パターンに従って、doPost メソッドの最後で "sendRedirect" 呼び出しを使用して、たとえばユーザーが Web ページをリロードした場合に、フォームの 2 回目の送信を回避します。
この時点ですべて OK : フォームに入力されたデータが画面に表示されます。
しかし、もう一度送信ボタンを押すと、厄介な nullPointerExceptions が発生します。これは、サーブレットの doPost メソッドに渡される HttpServletRequest に、最初の送信で入力したデータが含まれていないためです。
この動作が発生する理由がわかりません。フォームにはデータが含まれていますが、2 回目は送信されません。
私のアプローチで何が間違っているのか説明してもらえますか?
[編集]セッション属性を使用して、別のアプローチを試みています。ここに私のコードの一部があります:
JSP (myJsp.jsp)
<form method="post" action="myServlet">
field: <input type="text" name="field" value="${sessionScope.bean.field}"><br>
<input type="submit" name="lastname">
</form>
サーブレット (myServlet.java)
private Bean myBean;
doPost(...){
doSthWithMyBean(myBean);
response.sendRedirect("myJsp.jsp");
}
doGet(...){
request.getSession().setAttribute("bean",myBean);
this.getServletContext()....("myJsp.jsp").forward(request, response);
//I forget the exact methods on the description above, but you see what I do : I forward the request and response to the same jsp
}
私が理解していること: - ページが初めて読み込まれると、doGet メソッドが呼び出されます。したがって、myBean はセッションの属性として設定されます。送信を押すと、doPost メソッドが呼び出されます。myBean はすでにセッションの属性として設定されているため、Bean 情報を自動的に取得することを期待しています (${sessionScope.bean.field} はフォームの値フィールドにあるため)。
=> この 2 番目のアプローチでは、最初のフォーム送信でも null ポインター例外で失敗しますが、その理由がわかりません。
セッション オブジェクトの代わりにリクエスト パラメータを使用するように戻した場合
value="${bean.field}
doPost メソッドの request.getParameter を介してパラメーターにアクセスします。フォームの最初の送信では機能しますが、2 回目の送信では、フォームに最初の送信の値が入力されていても、「field」という名前のリクエスト パラメータはありません。
私の話をすべて要約すると: - リクエストパラメータを使用する場合: 2回目の送信で「フィールド」という名前のリクエストパラメータがないのはなぜですか? - セッション属性を使用すると、最初のフォーム送信時に null になるのはなぜですか?