0

複数のテキスト入力を含むフォームを含む 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 になるのはなぜですか?

4

2 に答える 2

0

#{...}EL式を使用すると機能します

于 2013-02-15T13:00:58.913 に答える
0

問題の解決策を見つけましたが、気に入りません。

  • 最初の送信では、リクエスト パラメータ マップにフォーム入力コンテンツが含まれます。したがって、request.getParameter(....) メソッドを介してそれらを取得し、request.getSession.setAttribute(.....) を使用してセッション属性に設定します。

  • 2 回目の送信では、リクエスト パラメータ マップにフォーム コンテンツが含まれていません (セッション属性から取得されたためにフォームに表示されていたとしても) request.getParameter の null 性をテストし、null の場合は無視します。セッション属性を更新しないでください。

それは動作しますが、私はそれがきれいだとは思いませんし、何かが欠けていると確信しているので、他のアイデアのためにこれを開いたままにします. ありがとう。

于 2013-02-04T21:08:57.753 に答える