サーブレットとは
まず、サーブレットとは何なのか、そしてなぜサーブレットについてよく聞くのかを理解しましょう。 Java サーブレット API は、サーバー上で実装し、要求/応答スキームを使用してクライアントと連携するように設計された標準化された API です。 サーブレットは、クライアントからリクエストを受信し、それに応答を返すことができるクラスです。はい、Java のサーブレットはまさにクライアント/サーバー アーキテクチャを構築する要素です。覚えているかもしれませんが、このシリーズの記事の 1 つですでに説明しました。無理をせずに、すぐにコードを書いてみましょう。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 アーカイブにアセンブルされたプロジェクト) を指定することだけです。[修正]ボタンをクリックして、 warexploded を選択できます。これは、プロジェクトが再構築された後、アーティファクトがサーブレット コンテナに自動的に配置されることを意味します。
-
アプリケーション コンテキストはデフォルトでservlets_war_explodedに設定されます。つまり、アプリケーションはhttp://localhost:8080/servlets_war_explodedでアクセスする必要があります。
なぜ余分なテキストが必要なのでしょうか? 不要なものは取り除きましょう。現在、アプリケーションのアドレスはhttp://localhost:8080です。
-
「OK」をクリックします。アプリケーションを起動する機会があることがわかります。
これで、アプリケーションを起動すると、ブラウザが開き、404 エラーが表示されるはずです。これは論理的です。なぜなら、アドレスhttp://localhost:8080/には「/」マッピングを持つサーブレットが存在する必要があり、唯一のサーブレットが「/hello」マッピングを持つからです。
-
http://localhost:8080/helloでアクセスすると、期待どおりの応答 (文字列「Hello」) が返されます。
パラメータとセッションの操作
サーブレットを改良して、リクエスト パラメーターを処理し、セッションを操作できるようにしましょう。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 リクエストでパラメータを渡すには、パス変数が使用されます。つまり、リンクhttp://localhost:8080/hello?username=Pavelにアクセスする必要があります。http リクエストの詳細については、このシリーズの前の記事をご覧ください。これで、アプリケーションには最小限のロジックが追加されましたが、ルート パスの 404 エラーが少し面倒です。これを修正するには、別のサーブレットを作成し、最初のページ @WebServlet("/") にマップしましょう。このサーブレットの役割は、リクエストを「/hello」パスにリダイレクトすることです。これを行うには、転送またはリダイレクトを使用する 2 つの方法があります。おそらく、それらの違いは何かを理解する価値があります。 forward - リクエストの処理をサーバー上の別のサーブレットに委任します。クライアントは関与しません。これを行うには、新しいサーブレットの doGet() メソッドに次のコードを追加する必要があります。
getServletContext().getRequestDispatcher("/hello").forward(req, resp);
このコードでは、サーブレット コンテキストにアクセスし、そこから目的のサーブレットのリクエスト マネージャーを取得し、指定されたパラメーター (req、resp) で特定のリクエストを処理するように依頼します。 リダイレクト- リクエストを処理するために連絡する必要があるアドレスをクライアントに返します。ほとんどのブラウザは、送信されたリンクに自動的にアクセスします。リダイレクトを実装するには、次のコードを追加する必要があります。
resp.sendRedirect(req.getContextPath() + "/hello");
HttpServletResponse では、redirect() メソッドを呼び出し、クライアントが連絡する必要があるアドレスをそれに渡します。重要な詳細: http パラメーターも完全なリダイレクト パスの最後に追加する必要がありますが、これはあまり便利ではありません。この状況では、フォワードを使用することが望ましいですが、場合によってはリダイレクトを使用する方がよい場合もあります。両者の仕事の違いを理解すれば、選択を間違えることはありません。新しいサーブレットのコードは次のようになります。
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