サーブレットとは何ですか?
まず、サーブレットとは何なのか、またサーブレットについて頻繁に耳にする理由を理解しましょう。Javaサーブレット API は、サーバー上に実装されることを目的とした標準化された API です。要求応答スキームに従ってクライアントと対話します。サーブレットは、クライアントからリクエストを受信し、クライアントに応答を返すことができるクラスです。実際、サーブレットはまさに Java でクライアント/サーバー アーキテクチャを作成するために使用する構成要素です。このアーキテクチャについては、このシリーズの別の記事ですでに説明したことを覚えているかもしれません。無理をするつもりはありません。すぐにコードを書いてみましょう。Webアプリケーションを作成するために必要なもの
Java サーブレットを操作する際の利便性を最大限に高めるには、IntelliJ IDEA Ultimate Edition が必要です。これは有料製品ですが、30 日間の試用版をアクティブ化することも、常に無料の早期アクセス バージョンを使用することもできます。また、アプリケーションのサーバーである Apache Tomcat もインストールします。Tomcat はサーブレット コンテナです。受信したリクエストを処理し、アプリケーションに渡します。ここから Tomcat をダウンロードします。最初の Web アプリケーションを作成しましょう
すべての準備ができたら、Maven プロジェクトを作成します。Maven に詳しくない場合は、前の記事を参照してください。さぁ、始めよう!-
pom.xml で、javax.servlet-api 依存関係を追加し、WAR パッケージ化を指定します。
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>org.example</groupId> <artifactId>servlets</artifactId> <version>1.0-SNAPSHOT</version> <packaging>war</packaging> <dependencies> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>4.0.1</version> </dependency> </dependencies> </project>
単純なサーブレット クラス:
import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.io.PrintWriter; @WebServlet("/hello") public class MainServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { resp.setContentType("text/html"); PrintWriter printWriter = resp.getWriter(); printWriter.write("Hello!"); printWriter.close(); } }
-
アプリケーションを実行するには、Tomcat 構成を作成する必要があります。
-
次に、使用する Tomcat のバージョンと、サーバーと通信するための URL とポートを指定します。次のようなものがあるはずです:
-
ここで必要なのは、コンテナーにデプロイされるアーティファクト (JAR アーカイブ内の組み立てられたプロジェクト) を指定することだけです。「Fix」ボタンをクリックして「warexploded」を選択できます。これは、プロジェクトが再構築された後、アーティファクトが自動的にサーブレットコンテナに配置されることを意味します。
-
アプリケーション コンテキストのデフォルト値はservlets_war_explodedです。これは、 http://localhost:8080/servlets_war_explodedでアプリケーションにアクセスすることを意味します。
なぜ余分なテキストが必要なのでしょうか? 不要なものは削除しましょう。これで、Web アプリケーションのアドレスはhttp://localhost:8080になりました。
-
「OK」をクリックします。これでアプリケーションを起動できることがわかります。
ブラウザでアプリケーションを開くと、404 エラーが表示されるはずです。アドレスhttp://localhost:8080/には「/」にマップするサーブレットが必要ですが、唯一のサーブレットは「/hello」にマップするため、これは理にかなっています。
-
http://localhost:8080/helloでアクセスできます。これを実行すると、期待どおりの答え、つまり文字列「Hello」が得られます。
@WebServlet()
注釈を示します。ここで、サーブレットを特定のパス (「/hello」) にバインド (またはマップ) します。このアノテーションは Java Servlet API 3.0 でのみ登場したため、インターネットには XML ファイルを介してサーブレットのマッピングが行われる例が数多くあります。これはもう必要ありません。GET リクエストを処理するには、メソッドをオーバーライドしますdoGet()
。メソッドのパラメータ:HttpServletRequest
およびに注意してくださいHttpServletResponse
。オブジェクトHttpServletRequest
は、リクエストに関する必要な情報をすべて提供します。でHttpServletResponse
、応答を記述し、必要なヘッダーを設定します。
パラメータとセッションの操作
サーブレットを改良して、リクエスト パラメーターを処理し、セッションを操作できるようにしましょう。
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.io.PrintWriter;
@WebServlet("/hello")
public class MainServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
HttpSession session = req.getSession();
Integer visitCounter = (Integer) session.getAttribute("visitCounter");
if (visitCounter == null) {
visitCounter = 1;
} else {
visitCounter++;
}
session.setAttribute("visitCounter", visitCounter);
String username = req.getParameter("username");
resp.setContentType("text/html");
PrintWriter printWriter = resp.getWriter();
if (username == null) {
printWriter.write("Hello, Anonymous" + "<br>");
} else {
printWriter.write("Hello, " + username + "<br>");
}
printWriter.write("Page was visited " + visitCounter + " times.");
printWriter.close();
}
}
これで、サーブレットはセッションで動作し、visitCounter
ページがアクセスされるたびに の値が増加します。属性がまだ作成されていない場合visitCounter
(最初にページにアクセスしたとき)、メソッドはgetAttribute()
null を返すため、null をチェックする必要があります。リクエストパラメータについても同様です。ユーザーが username パラメーターを渡さない場合、その値は null になります。この場合、ユーザーを匿名の訪問者として迎えます。GET リクエストでパラメータを渡すには、クエリ文字列が使用されます。たとえば、次の URL を使用できます。http:// localhost:8080/hello? ユーザー名=ポール。HTTP リクエストの詳細については、前の記事をご覧ください。シリーズの中で。現在、アプリケーションには大したロジックがありませんが、ルート パスで 404 エラーが発生するのが少し面倒です。これを修正するには、別のサーブレットを作成し、それをスタート ページにマップします@WebServlet("/")
。このサーブレットの目的は、リクエストを「/hello」パスにリダイレクトすることです。これを行うには、「転送」または「リダイレクト」を使用する 2 つの方法があります。おそらく、それらの違いを理解することは価値があるでしょう。フォワードは、リクエストの処理をサーバー上の別のサーブレットに委任します。クライアントは関与しません。これを行うには、次のコードを新しいサーブレットの doGet() メソッドに追加します。
getServletContext().getRequestDispatcher("/hello").forward(req, resp);
このコードでは、サーブレット コンテキストにアクセスし、関連するサーブレットのリクエスト ディスパッチャーを取得し、指定された引数 (req、resp) を使用して特定のリクエストを処理するようにサーブレットに依頼します。リダイレクトは、クライアントがリクエストを処理するために使用する必要があるアドレスをクライアントに返します。ほとんどのブラウザは、返された URL に自動的に移動します。リダイレクトを実装するには、次のコードを追加する必要があります。
resp.sendRedirect(req.getContextPath() + "/hello");
redirect()
パラメータでメソッド を呼び出しHttpServletResponse
、クライアントが使用する必要があるアドレスを渡します。ここで重要な点を説明します。HTTP パラメータも完全なリダイレクト パスの最後に追加する必要がありますが、これはあまり便利ではありません。私たちの状況では、 を使用することが望ましいですforward
が、場合によっては を使用した方redirect
が良い場合もあります。仕組みの違いを理解していれば、間違った選択をすることはありません。新しいサーブレットのコードは次のようになります。
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/")
public class IndexServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// getServletContext().getRequestDispatcher("/hello").forward(req, resp);
resp.sendRedirect(req.getContextPath() + "/hello");
}
}
GO TO FULL VERSION