JavaRush /Java Blog /Random-JA /パート 5. サーブレット、Java サーブレット API。簡単な Web アプリケーションを作成する

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

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

サーブレットとは

まず、サーブレットとは何なのか、そしてなぜサーブレットについてよく聞くのかを理解しましょう。 Java サーブレット API は、サーバー上で実装し、要求/応答スキームを使用してクライアントと連携するように設計された標準化された API です。 サーブレットは、クライアントからリクエストを受信し、それに応答を返すことができるクラスです。はい、Java のサーブレットはまさにクライアント/サーバー アーキテクチャを構築する要素です。覚えているかもしれませんが、このシリーズの記事の 1 つですでに説明しました。無理をせずに、すぐにコードを書いてみましょう。

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 アーカイブにアセンブルされたプロジェクト) を指定することだけです。[修正]ボタンをクリックして、 warexploded を選択できます。これは、プロジェクトが再構築された後、アーティファクトがサーブレット コンテナに自動的に配置されることを意味します。 パート 5. サーブレット、Java サーブレット API。 簡単な Web アプリケーションの作成 - 5

  5. アプリケーション コンテキストはデフォルトでservlets_war_explodedに設定されます。つまり、アプリケーションはhttp://localhost:8080/servlets_war_explodedでアクセスする必要があります。

    なぜ余分なテキストが必要なのでしょうか? 不要なものは取り除きましょう。現在、アプリケーションのアドレスは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 リクエストでパラメータを渡すには、パス変数が使用されます。つまり、リンク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");
   }
}

結論

最初の Web アプリケーションの準備が整いました。次の記事では、Intellij IDEA を使用せずにこれをデプロイする方法を学びます。GET リクエストのみを処理するアプリケーションを作成しました。残りの http メソッドは同じ方法で処理され、親クラスの対応するメソッドをオーバーライドします。このような単純なサーブレットを使用すると、複雑で機能豊富な Web アプリケーションを構築できます。もちろん、Spring のような大規模なフレームワークを使用すると、これを行うのがはるかに簡単になります。ただし、サーブレットのすべての機能をさらに詳しく知りたい場合は、公式仕様を読むことができます。 パート 6. サーブレット コンテナー パート 7. MVC (Model-View-Controller) パターンの概要 パート 8. spring-boot での小さなアプリケーションの作成
コメント
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION