CodeGym /Java Blog /ランダム /パート 5. サーブレットと Java サーブレット API。簡単な Web アプリケーションを作成する
John Squirrels
レベル 41
San Francisco

パート 5. サーブレットと Java サーブレット API。簡単な Web アプリケーションを作成する

ランダム グループに公開済み
この資料は「エンタープライズ開発入門」シリーズの一部です。以前の記事: パート 5. サーブレットと Java サーブレット API。 簡単な Web アプリケーションの作成 - 1コンソールにテキストを表示する Java アプリケーションの作成方法はすでに知っていますが、最初の Web アプリケーションの作成方法はまだよくわかりませんか? いいですね、快適にしてください。この記事では、サーブレットについて理解し、JAR ファイルを送信したり、Java のダウンロードを強制したりせずに、友人に自慢できるアプリケーションを作成します。簡単なWeb アプリケーションを書いてみましょう。Web 開発で使用されるアプローチにまだ慣れていない場合は、「エンタープライズ開発入門」シリーズの最初の記事を読むことから始めることをお勧めします。

サーブレットとは何ですか?

まず、サーブレットとは何なのか、またサーブレットについて頻繁に耳にする理由を理解しましょう。Javaサーブレット API は、サーバー上に実装されることを目的とした標準化された API です。要求応答スキームに従ってクライアントと対話します。サーブレットは、クライアントからリクエストを受信し、クライアントに応答を返すことができるクラスです。実際、サーブレットはまさに Java でクライアント/サーバー アーキテクチャを作成するために使用する構成要素です。このアーキテクチャについては、このシリーズの別の記事ですでに説明したことを覚えているかもしれません。無理をするつもりはありません。すぐにコードを書いてみましょう。

Webアプリケーションを作成するために必要なもの

Java サーブレットを操作する際の利便性を最大限に高めるには、IntelliJ IDEA Ultimate Edition が必要です。これは有料製品ですが、30 日間の試用版をアクティブ化することも、常に無料の早期アクセス バージョンを使用することもできます。また、アプリケーションのサーバーである Apache Tomcat もインストールします。Tomcat はサーブレット コンテナです。受信したリクエストを処理し、アプリケーションに渡します。ここから Tomcat をダウンロードします。

最初の Web アプリケーションを作成しましょう

すべての準備ができたら、Maven プロジェクトを作成します。Maven に詳しくない場合は、前の記事を参照してください。さぁ、始めよう!
  1. 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();
       }
    }
    
  2. アプリケーションを実行するには、Tomcat 構成を作成する必要があります。

    パート 5. サーブレットと Java サーブレット API。 簡単な Web アプリケーションの作成 - 2パート 5. サーブレットと Java サーブレット API。 簡単な Web アプリケーションの作成 - 3

  3. 次に、使用する Tomcat のバージョンと、サーバーと通信するための URL とポートを指定します。次のようなものがあるはずです:

    パート 5. サーブレットと Java サーブレット API。 簡単な Web アプリケーションの作成 - 4
  4. ここで必要なのは、コンテナーにデプロイされるアーティファクト (JAR アーカイブ内の組み立てられたプロジェクト) を指定することだけです。「Fix」ボタンをクリックして「warexploded」を選択できます。これは、プロジェクトが再構築された後、アーティファクトが自動的にサーブレットコンテナに配置されることを意味します。 パート 5. サーブレットと Java サーブレット API。 簡単な Web アプリケーションの作成 - 5

  5. アプリケーション コンテキストのデフォルト値はservlets_war_explodedです。これは、 http://localhost:8080/servlets_war_explodedでアプリケーションにアクセスすることを意味します。

    なぜ余分なテキストが必要なのでしょうか? 不要なものは削除しましょう。これで、Web アプリケーションのアドレスはhttp://localhost:8080になりました。

    パート 5. サーブレットと Java サーブレット API。 簡単な Web アプリケーションの作成 - 6
  6. 「OK」をクリックします。これでアプリケーションを起動できることがわかります。

    パート 5. サーブレットと Java サーブレット API。 簡単な Web アプリケーションの作成 - 7

    ブラウザでアプリケーションを開くと、404 エラーが表示されるはずです。アドレスhttp://localhost:8080/には「/」にマップするサーブレットが必要ですが、唯一のサーブレットは「/hello」にマップするため、これは理にかなっています。

  7. http://localhost:8080/helloでアクセスできます。これを実行すると、期待どおりの答え、つまり文字列「Hello」が得られます。

すべてが機能している場合は、コードを分析しましょう。通常のクラスから HTTP サーブレットを作成するには、HttpServlet クラスを継承する必要があります。クラス宣言の上に@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");
   }
}

まとめ

最初の Web アプリケーションが完了しました。次の記事では、IntelliJ IDEA を使用せずにデプロイする方法を学びます。GET リクエストのみを処理するアプリケーションを作成しました。残りの HTTP メソッドは、親クラスの対応するメソッドをオーバーライドすることによって、同様の方法で処理されます。このような単純なサーブレットを使用して、洗練された多用途の Web アプリケーションを構築できます。もちろん、Spring などの大きなフレームワークを使用すると、これがはるかに簡単になります。しかし、サーブレットのすべての機能を本当に詳しく知りたい場合は、公式仕様を読むことができます。 パート 6. サーブレット コンテナー パート 7. MVC (Model-View-Controller) パターンの紹介
コメント
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION