Form.action 値の転送の問題

WBOY
WBOYオリジナル
2016-08-31 08:41:452113ブラウズ

ブラウザのアドレスバーに URL を入力し、? を介してパラメータを渡してリソースをリクエストすると、? の後のパラメータは「クエリ文字列」と呼ばれ、バックグラウンド サーブレットの doGet() をトリガーします。ブラウザのアドレス バーは GET メソッドです。


パラメータの受け渡しに対するフォームのメソッド属性の影響を見てみましょう。

元のフォーム:








最初のケース:
上記フォームの action 属性が記述されていない場合、直接「Submit」ボタンをクリックすると、フォームの submit イベントがトリガーされます。この時点で、Firefox ブラウザのコンソールから確認できます:
メッセージ ヘッダーには次の重要な情報が含まれています: (1) リクエスト アドレスの後にパラメータを渡すための「?」が続きます (2) リクエスト メソッドは GET です。




パラメータ情報: クエリ文字列




フォームのメソッド属性を指定する場合:







2 番目のケース:
メッセージ ヘッダーには次の重要な情報が含まれます: (1) リクエストの背後アドレス パラメータは渡されません (2) リクエストメソッドは POST



パラメータ情報: フォームデータ




上記 2 つのメソッドの応答は、更新後に現在のページを表示することです。フォームには action 属性が指定されていないため、デフォルトの送信アドレスは現在のページです。

次に、action 属性を指定してサーブレットにアクセスし、method 属性について詳しく学習します。

TestServlet.java コア ソース コード:

@WebServlet("/servlet/TestServlet")
public class TestServlet extends HttpServlet {
private staticfinallongserialVersionUID = 1L;

protected void doGet(HttpServletRequest request, HttpServletResponse response) throwsサーブレット例外、IOException {
response.getWriter().print("doGet()");
}

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException、IOException {
response.getWriter().print(" doPost( )");
}

}


3 番目のケース: Method="get" action="/test/servlet/TestServlet"








4 番目のケース: Method="post" action="/test/servlet/TestServlet"




< ;

上記のメッセージ ヘッダーとパラメーターは最初のケースと同じですが、バックグラウンドは doPost() で応答します。





TestServlet.java パラメータを取得するコードを追加します:
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String param = request.getParameter("type");
response.getWriter() .print ("doGet() get type="+param);
}

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String param = request.getParameter("type");
response. getWriter( ).print("doPost() get type="+param);
}


5 番目のケース、method="get" は、アクションの後にパラメーター action = "/servlet/TestServlet?type=01" を渡します。 、同時にバックグラウンドサーブレットのパラメータを取得します

この時のブラウザのアドレスバー: http://localhost:8080/test/servlet/TestServlet?username=



バックグラウンドのdoGet()ではパラメータの型を取得できないことが分かります。
同時に「クエリ文字列」に型パラメータが追加されていないことが分かります






6 番目のケース、method="post" はアクションの後にパラメーター action = "/servlet/TestServlet?type=01" を渡し、同時にバックグラウンド サーブレットのパラメーターを取得します




バックグラウンドの doPost() がパラメーターの型を 取得できることがわかります。
同時に、パラメータ列は以前とは少し異なります:
「クエリ文字列」と「フォームデータ」の両方があります




したがって、上記は私たちに啓示を与えます。つまり、フォームのアクションの後にパラメーターを渡すときは、フォームのメソッド = "post" を手動で指定する必要があります。そうしないと、 ? の背後にあるパラメータ
誤解: 以前は、ブラウザのアドレス バーの URL を通じてパラメータを渡していましたが、?これを実現するには、最終的に doGet() メソッドを呼び出します。そのため、フォーム (デフォルトのメソッド = "get") のアクションを渡すことができると思いますか?高麗人参を伝えに来てください。


最後の理由: (個人的な要約) get メソッドでフォーム データを送信するとき、URL はフォーム データを「クエリ文字列」に組み立てて、アクションで指定された URL に送信するだけです。 URL は再編成後に失われるため、元の ? メソッドで渡されたパラメータは送信されません。

ただし、フォームがポストモードで送信されると、フォームデータと?以降のパラメータが別々に保存され、フォーム内のアクションで指定されたURLにまとめて送信されます。

(参考リソース) HTML フォーム: なぜアクションに get 値を含めることができないのですか?
http://stackoverflow.com/questions/3548795/html-form-why-action-cant-have-get-value-in -それ




声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。