Web 開発では、転送とリダイレクトには大きな違いがあります。
直感的に言えば、転送では URL アドレスは変更されませんが、リダイレクトでは URL が変更されます。
これは単なる外観です。HttpServlet の要求オブジェクトと応答オブジェクトはカプセル化され、ユーザーが Web ページを要求したときにブラウザーから渡されたパラメーターに基づいてサーバーによって生成されます。ブラウザからリクエストが行われ、サーバーが応答を返すと、リクエストとレスポンスは寿命を迎えたことになります。
転送を使用する場合、ブラウザは 1 回のみリクエストしますが、サーバーでは複数のジャンプが発生する可能性があります。サーバー側の実行中に転送が発生した場合、サーバーは実行中のタスクを停止し、指定されたアドレスに転送するタスクを指定します。 リダイレクトを使用すると、ブラウザはサーバーに対して複数のリクエストを行います。コードがサーバー側で実行されるときにリダイレクトが発生すると、ブラウザーに別の URL にアクセスするように通知されます。ブラウザは、送信された URL からリソースを要求します。 コードの一部を見てください:<html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><title>login</title></head><body> <form action="myServlet" method="post"> name :<input type="text" name="username"/><br/> <input type="submit" value="submit"/> </form></body></html>
##
public class MyServlet extends HttpServlet { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String username = (String)request.getParameter("username"); request.setAttribute("welcome", "welcome!!!"); RequestDispatcher rd = request.getRequestDispatcher("welcome.jsp"); rd.forward(request,response); } }
<html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><title>welcome</title></head><body> <%=request.getParameter("username")%> <br/> <%=request.getAttribute("welcome") %></body></html>
これは、welcome.jsp のコードです。
送信結果は次のとおりです:
送信ボタンをクリックした後、ネットワーク要求プロセスを確認できます。
ブラウザがサーバーにリクエストを 1 つだけ送信したことがわかります。
次に、リダイレクトについて見てみましょう。
MyServlet のコードを変更した場合。
public class MyServlet extends HttpServlet { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String username = (String)request.getParameter("username"); request.setAttribute("welcome", "welcome!!!");// RequestDispatcher rd = request.getRequestDispatcher("welcome.jsp");// rd.forward(request,response); response.sendRedirect("welcome.jsp"); } }
結果は次のとおりであることがわかります:
そしてブラウザ アイテム サーバーは 2 つのリクエストを送信しました:
上から結果は、リダイレクト後、別のリクエストが開始されるため、ウェルカム ページのコンテンツがすべて null であることがわかります。転送は同じリクエストオブジェクトとレスポンスオブジェクトであるため、ブラウザからリクエストされたパラメータを取得できるだけでなく、リクエストに入れられた属性値も取得できます。
実際、コードからは、sendRedirect() メソッドが HttpServletResponse オブジェクトの応答メソッドであることがわかります。応答オブジェクトのメソッドが呼び出されるため、リクエスト全体が終了したことがわかります。そしてサーバー側アイテムクライアントは実行結果を返します。 getRequestDispatcher メソッドはリクエスト オブジェクトのメソッドで、リクエストがまだ行われているため、結果はブラウザにすぐには返されませんが、転送タスクは引き続き実行されることを示します。
forward メソッドで渡す場合でも、sendRedirect メソッドで渡す場合でも、注意が必要な点が 1 つあります。これは、この URL がサーブレット コンテナのルート、つまり localhost:8080 に対するリクエストであることを意味します。「\」で始まらない場合は、リクエスト アドレスが現在のリクエスト URL
を基準にしてアドレス指定されていることを示します。 。<html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><title>login</title></head><body> <!--这里改成了绝对地址 --> <form action="/myServlet" method="post"> name :<input type="text" name="username"/><br/> <input type="submit" value="submit"/> </form></body></html>
「\」で始まらないリクエスト アドレスは:
転送モデルは次のとおりです:
リダイレクト モデルは次のとおりです:
この記事では、Web ページの転送とリダイレクトなどについて説明します。関連コンテンツ php 中国語 Web サイトにご注意ください。
関連する推奨事項:単純な PHP MySQL ページング クラス
以上がWeb ページの転送とリダイレクトの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。