
前回の記事「 ダミー用のサーブレットの作成」で。 サーブレットの作成方法に関するチュートリアルを説明し、これがどのように機能するかを説明しようとしました。 この記事では、HTTP GETおよびPOSTリクエストを介してUIを操作する方法をサーブレットに教えます。
実際には、これらのリクエストの多くがありますが、実験の純度のために、主に2つだけを分析します。
- GET-サーブレットが呼び出されたときに取得されるアドレスバーを処理します。 たとえば、site.com / example?action = test&id = 10&admin = true
- POST-ダウンロードされたコンテンツ(画像、ファイル、行、オブジェクトデータ)を処理します。一般に、HTTP経由で送信できるすべてのものを処理します
Javaサーブレットでは、POSTおよびGETリクエストが対応するdoPost()メソッドを処理します。 およびdoGet()。
クエリ処理の原則を明確にするために、次のものを作成します。
- 名前、シリアル、およびIDを持つクラスBotの単純なオブジェクト
- オブジェクトデータを表示するページ
- オブジェクトのデータを変更するページ
- 対応するリクエストを処理するサーブレット
3つのフィールドと、ゲッター、セッター、およびオーバーロードされたtoString()を持つシングルトンクラスボットを作成します。
/** * - Bot. * . * * Created by promoscow on 26.07.17. */ public class Bot { private Integer id; private String name; private String serial; private static Bot ourInstance = new Bot(); public static Bot getInstance() { return ourInstance; } private Bot() { } public Bot(String name, String serial, Integer id) { this.name = name; this.serial = serial; this.id = id; } public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getSerial() { return serial; } public void setSerial(String serial) { this.serial = serial; } @Override public String toString() { return "Bot{" + "id=" + id + ", name='" + name + '\'' + ", serial=" + serial + '}'; } }
web.xml xmlドキュメントのサーブレットに注意してください。
<servlet> <servlet-name>botServlet</servlet-name> <servlet-class>web.BotServlet</servlet-class> <load-on-startup>0</load-on-startup> </servlet> <servlet-mapping> <servlet-name>botServlet</servlet-name> <url-pattern>/bot</url-pattern> </servlet-mapping>
このようなbot.jspページを作成します(今のところ、コピーしてから解析するだけです):
<%-- Created by IntelliJ IDEA. User: promoscow Date: 26.07.17 Time: 9:28 To change this template use File | Settings | File Templates. --%> <%@ page contentType="text/html;charset=UTF-8" language="java" %> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <html> <head> <title>Bot</title> </head> <body> <section> <h3>Bot info</h3> <jsp:useBean id="bot" scope="request" type="ru.javawebinar.topjava.model.Bot"/> <tr> <td>ID: ${bot.id} | Name: ${bot.name} | Serial number: ${bot.serial}</td> <td><a href="bot?action=update">Update</a></td> </tr> </section> </body> </html>
このページにはボットデータが表示されます。
行
<jsp:useBean id="bot" scope="request" type="ru.javawebinar.topjava.model.Bot"/>
引数「bot」を処理し、これがクラスBotのオブジェクトであることを明確にします。 $ {bot.name}などは、引数で受け取ったオブジェクトから取得する変数です(これはサーブレットにあります)。
更新リンクはアドレスボットにリダイレクトすることに注意してください?Action = updateにはGETリクエストのデータが含まれています。
また、変更されたボットデータ(update.jsp)を送信するページがあります。
<%-- Created by IntelliJ IDEA. User: promoscow Date: 01.08.17 Time: 13:43 To change this template use File | Settings | File Templates. --%> <%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>Update</title> </head> <body> <section> <jsp:useBean id="bot" scope="request" type="ru.javawebinar.topjava.model.Bot"/> <form method="post" action="bot?action=submit"> <dl> <dt>ID: </dt> <dd><input type="number" name="id" value="${bot.id}" placeholder="${bot.id}" /></dd> </dl> <dl> <dt>Name: </dt> <dd><input type="text" name="name" value="${bot.name}" placeholder="${bot.name}" /></dd> </dl> <dl> <dt>Serial number: </dt> <dd><input type="number" name="serial" value="${bot.serial}" placeholder="${bot.serial}" /></dd> </dl> <button type="submit">Save</button> </form> </section> </body> </html>
また、ボットデータを受け取り、それらをフィールドに挿入して変更し、変更したデータをPOSTリクエストで送信します。 フォームを送信すると、POST要求がトリガーされることに注意してください。
<form method="post" action="bot?action=submit">
method = "post"はフォームデータがPOSTに送られることを意味し、 action = "bot?action = submit"はフォームが送信された後、アドレスに移動することを意味しますbot?action = submit
明確にするために、1つのフォームフィールドを分析します。
<input type="number" name="id" value="${bot.id}" placeholder="${bot.id}" />
[保存]ボタンをクリックすると、入力されたすべてのデータがサーブレットのdoPost()メソッドに送信されます。 この行では、新しいIDを設定します。
フォーム属性の名前: "id"(name = "id")、渡す値はボットオブジェクトのidフィールド($ {bot.id})です。また、 "bot"属性で取得した既存の値をフィールドに追加します(プレースホルダー= "$ {bot.id})。
この記事の目的は、POSTおよびGETリクエストがどのように機能するかを説明することなので、通過する文字列のコードの意味を説明します。 ページの属性の詳細については、HTMLリファレンスをご覧ください。
それでは、ボットページへの唯一のリンクを含む最も原始的なindex.htmlページを追加しましょう。
<html> <head> <meta charset="UTF-8"> <title>Bot Test Servlet Page</title> </head> <body> <ul> <li><a href="bot">Bot</a></li> </ul> </body> </html>
jsp / htmlの処理は完了し、最終的に私のお気に入りのJavaコードに移ることができます。
BotServlet.java:
import model.Bot; import javax.servlet.ServletConfig; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; /** * Bot Servlet class. * * Created by promoscow on 26.07.17. */ public class BotServlet extends HttpServlet { private Bot bot; @Override public void init(ServletConfig config) throws ServletException { super.init(); bot = new Bot("Amigo", "228274635", 1); } @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { System.out.println("Enter doGet"); String action = request.getParameter("action"); request.setAttribute("bot", bot); switch (action == null ? "info" : action) { case "update": request.getRequestDispatcher("/update.jsp").forward(request, response); break; case "info": default: request.getRequestDispatcher("/bot.jsp").forward(request, response); break; } } @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { System.out.println("Enter doPost"); request.setCharacterEncoding("UTF-8"); String action = request.getParameter("action"); if ("submit".equals(action)) { bot.setId(Integer.parseInt(request.getParameter("id"))); bot.setName(request.getParameter("name")); bot.setSerial(request.getParameter("serial")); } request.setAttribute("bot", bot); request.getRequestDispatcher("/bot.jsp").forward(request, response); } }
サーブレットには、init()、doGet()、およびdoPost()の3つのメソッドが含まれています。
init()-サーブレットの最初の初期化時に呼び出され、その中に記述されたコードを一度実行します。 この例では、Botクラスのインスタンスが作成されます。
doGet()-GETリクエストを処理します。
doPost()-POSTリクエストを処理します。
次に、アプリケーション実行ロジックのチェーンを調べて、その仕組みを理解します。
そのため、プロジェクトをTomcatにアップロードします。 私たちの前には、孤独なリンク「ボット」があります。 押して
BotServletサーブレットに移動します。 doGet()メソッドは常に実行され(結局、アドレスバーは常にそこにあります)、doPost()メソッドはリクエストによってのみ実行されます(それは<form method = "post" ...
@Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // , doGet System.out.println("Enter doGet"); // . <i>"bot?action=update"</i> (bot.jsp, 20 ) -, &. action=update. () action, update String. String action = request.getParameter("action"); // , . . , bot "bot", jsp- request.setAttribute("bot", bot); switch (action == null ? "info" : action) { // update (action=update), /update.jsp, ( bot) case "update": request.getRequestDispatcher("/update.jsp").forward(request, response); break; // (action == null ? "info"), bot.jsp, ( ) case "info": default: request.getRequestDispatcher("/bot.jsp").forward(request, response); break; } }
ご覧のとおり、doGet()メソッドはアドレスバーで機能し、アドレスバーから属性を抽出して処理します。 doGet()メソッドのツールキットは素晴らしいです。たとえば、行に次のものが含まれている可能性がありますか?
index.htmlでは、リンクによるアドレスバーの属性の値が更新されるため、doGet()コードのこの部分を実行します。
request.setAttribute("bot", bot); request.getRequestDispatcher("/update.jsp").forward(request, response);
-ボットオブジェクトとキー「ボット」を持つ属性を追加し、すべてをページ/update.jspに送信します
update.jspページで、Botクラスのフィールドに対応するフォームに新しい値を追加し、アドレス「bot?Action = submit」にすべてを送信します。 私は繰り返します-この記事では、タスクはjsp / htmlタグを解析することではありません。これにはHTMLリファレンスがあります 。
そこで、「保存」ボタンをクリックします。 フォームにはmethod = "post" action = "bot?Action = submit"が含まれているため、フォームで受信したデータをdoPost()メソッドで処理します。 この方法では、受信データを処理し、アドレスバーの属性を取得できます。
@Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { System.out.println("Enter doPost"); // UTF-8 — , , ( , ) request.setCharacterEncoding("UTF-8"); // action Stiring, doGet() String action = request.getParameter("action"); // action=submit, , . , . , (, update.jsp name="id" value=${bot.id} id, bot.setId(Integer.parseInt(request.getParameter("id"))); if ("submit".equals(action)) { bot.setId(Integer.parseInt(request.getParameter("id"))); bot.setName(request.getParameter("name")); bot.setSerial(request.getParameter("serial")); } // bot /bot.jsp, request.setAttribute("bot", bot); request.getRequestDispatcher("/bot.jsp").forward(request, response); }
これが記事全体です。 対応するdoPost()およびdoGet()メソッドを使用して、サーブレットでPOSTおよびGETリクエストを実行しました。
この記事の目標は、JavaEE開発者がサーブレットでクエリがどのように機能するか、またJavaコードでこれらのクエリをどのようなロジックで構築するかによって理解を深めることです。
これは、サーブレットに関する私の2番目の記事であり、「 ダミー用のサーブレットの作成」で説明した最初のサーブレットの起動です。 ウォークスルー