プログラムを書いていますが、問題が発生します。jspページを更新すると、システムが自動的にページ全体を再送信します。それを回避する方法がわかりません。誰かが私を助けてくれますか?
7 に答える
これが問題の説明です...
フォームの[送信]ボタンをクリックすると、フォームに入力されたすべてのデータを含むリクエストがWebサーバーに送信されます。URLだけでなくフォームデータもリクエストの一部であり、このリクエストはブラウザによって記憶されます。ユーザーが[更新]をクリックすると、ブラウザはリクエストを繰り返し、同じURLとフォームデータをWebサーバーに再度送信します。
ただし、フォームは、「form」タグの「method」属性に応じて、GETまたはPOSTの2つの異なる方法で送信できます。GETリクエストには副作用がないという規則があります。データをフェッチするだけで、データベースに変更を加えることはありません。一方、リクエストがデータを変更する場合は、常にPOSTリクエストを使用する必要があります。私が言ったように、これらは単なる慣例であり、技術的な違いはあまりありませんが、非常に重要な違いは、ブラウザがPOSTを繰り返そうとすると、ユーザーに警告することです。[更新]をクリックするとダイアログボックスが表示されます。これにより操作が繰り返される可能性があることをユーザーに警告し、ユーザーが本当に再送信することを確認します。GETリクエストを更新するときに、ブラウザはこの確認を表示しません。
@mkが疑うように、フォームはGETメソッドを使用していますか?その場合、POSTに変更するのが最も簡単な解決策です。これは、少なくとも、更新しようとするとユーザーに警告が表示されることを意味するためです。
しかし、より良い解決策は、@cletusによって提案されたPOST+ REDIRECT+GETイディオムです。これにより、データベース更新(POST)とビュー(GET)が2つの操作に分割されます。ブラウザで[更新]をクリックすると、GETが繰り返されるだけで、副作用はありません。
ここで必要なイディオムは次のいずれかです。
- 投稿 + リダイレクト + GET ; また
- AJAX フォームの送信。
POST+REDIRECT+GET は次のように機能します。
- フォーム送信は POST メソッドを使用します。
- JSP または (できれば) サーブレットが POST を受信すると、必要なことは何でも実行します (データの保存または更新など)。
- 次に、サーブレットまたは JSP は Location: HTTP ヘッダーを使用して、おそらく同じ URL にユーザーをリダイレクトします。
これの利点は、リロードをクリックしてもフォームが再送信されないことです。また、ブラウザの [戻る] ボタンをクリックしても、「もう一度送信しますか?」というメッセージは表示されません。ダイアログボックス。
これは、このJSP の例です。
AJAX 送信とは、従来の意味でフォームをサーバーに送信する代わりに、フォーム データを使用してサーバーに送信する AJAX 要求を作成することを意味します。その送信は、必要なことを行います。リロードをクリックすると、ページがリロードされます。AJAX リクエストを再送信しません。
次のスクリプトを使用して動作します。
<script>
if ( window.history.replaceState ) {
window.history.replaceState( null, null, window.location.href );
}
</script>
データの送信やその他の変更にGETを使用しないでください。代わりにPOSTを使用してください。あなたは読むためにあなたのフォームを変更したいと思うでしょう
<form action="test.jsp" method="get">
詳細については、 http://www.google.com/search?q = get+postを参照してください。
(あなたの質問も少し不明確です-ブラウザまたはコンテナ(Tomcatなど)で更新することを意味しますか?ページを再送信することを意味しますか?ページは送信されません、フォームは送信されます。どのシステムですか?私はあなたが何を推測したかつまり、何か他のことを意味している場合は、お知らせください。)
サーバー側で JSP を使用し、コントローラー サーブレットを使用してページの方向を制御している場合。ページ方向モードを転送からページ リダイレクトに変更するだけです。これにより、フォームの再送信を防ぐことができます。これはそれを理解するのに便利です
よろしく!
ここに解決策があります
@RequestMapping(value="masterrulescreation")
protected ModelAndView masterrules(HttpServletRequest request, HttpServletResponse response) throws Exception {
try {
if(request.getParameter("ruleCode")!=null && request.getParameter("ruleCode")!="") //check the primary key is not null ,if goes for submission
{
request.setCharacterEncoding("UTF-8");
String xxx=request.getParameter("xxx");
S
boolean result=object.method(xxx);
String message="";//reurning a messgae is sucess
if(result==true)
{
message="Data Saved successfully";
}
else
{
message="Error while saving data";
}
return (new ModelAndView(getMasterrulescreation(),"message",message));
}
else //if no value in primary key redirect fresh page
{
return (new ModelAndView(getMasterrulescreation()));
}
}
catch (Exception e) {
e.printStackTrace();
return null;
}
}