JavaRush /Java Blog /Random-JA /サーブレットと JSP を使用した簡単な Web アプリケーションの作成 (パート 1)
Стас Пасинков
レベル 26
Киев

サーブレットと JSP を使用した簡単な Web アプリケーションの作成 (パート 1)

Random-JA グループに公開済み
記事を理解するために必要な知識のレベル:あなたはすでに Java Core を多かれ少なかれ理解しており、JavaEE テクノロジと Web プログラミングについて学びたいと考えています。これは、記事に近いトピックをカバーする Java Collections クエストを現在学習している場合に最も意味があります。 この資料は、私の記事「IntelliJ Idea Enterprise での単純な Web プロジェクトの作成」サーブレットと JSP を使用した簡単な Web アプリケーションの作成 (パート 1) - 1の論理的な続きです。その中で、実用的な Web プロジェクト テンプレートを作成する方法を説明しました。今回は、Java Servlet API と JavaServer Pages API テクノロジを使用して、シンプルだが美しい Web アプリケーションを作成する方法を説明します。アプリケーションには、次の 2 つのリンクのあるホームページがあります。
  • ユーザー追加ページへ。
  • ユーザー一覧表示ページへ。
私は今後も IntelliJ Idea Enterprise Edition、Apache Maven (いくつかの依存関係を含むだけ)、および Apache Tomcat を使用します。最後に、W3.CSSフレームワークを使用してアプリケーションを「装飾」します。現時点では、ここで開発する空のプロジェクトがすでにあると仮定します。そうでない場合は、最初の記事を読んで作成してください。ほんの数分しかかかりません:)

将来のアプリケーションの構造について少し

メイン ページ ( / ) は、ヘッダーと 2 つのリンク/ボタンを備えた最も一般的な静的 HTML ページになります。
  • 新しいユーザーを追加します ( /addに送信されます);
  • ユーザーのリストを表示します ( /listに送信します)。
Tomcat は、これらのアドレスへのリクエストをキャッチし、作成する 2 つのサーブレットの 1 つに送信します (マッピングはweb.xmlファイルに記述します)。そして、サーブレットはリクエストを処理し、データを準備し (ユーザーが追加された場合はデータを保存し)、制御を対応する JSP ファイルに転送します。これにより、すでに結果が「レンダリング」されます。最も一般的なリスト (List) にデータを保存します。

静的ホームページを作成してみよう

Web フォルダーにindex.jsp がある場合は、それを削除します。代わりに、このフォルダーに、 index.htmlという単純な HTML ファイルを作成します。
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>My super project!</title>
</head>
<body>
    <!-- header -->
    <div>
        <h1>Super app!<//h1>
    </div>

    <div>       <!-- content -->
        <div>    <!-- buttons holder -->
            <button onclick="location.href='/list'">List users<//button>
            <button onclick="location.href='/add'">Add user<//button>
        </div>
    </div>
</body>
</html>
ここでは複雑なことは何もありません。title にはページのタイトルを示します。ページの本文には、ヘッダー (ヘッダー) とコンテンツ (コンテンツ) の 2 つの主要な div があります。コンテンツにはボタンのホルダーがあり、実際にはクリックされると適切なアドレスに送信される 2 つのボタンがあります。プロジェクトを実行して、現在の様子を確認できます。ボタンをクリックすると、404 エラーが発生するページが開きます。これは、まだ用意されていないためです。しかし、これはボタンが機能することを示唆しています。これは最も普遍的なオプションではないことに注意してください。JavaScript を突然無効にすると、これらのボタンはブラウザーで使用できなくなるからです。ただし、誰も JavaScript を無効にしていないものと仮定します :)。単純なリンクを使用できることは明らかですが、私はボタンの方が好きです。自分の好きなことをするのが一番です。そして、私の例には多くのdivがあるという事実には注目しないでください。次に、それらをスタイルで埋めると、すべてがより美しく見えます:)。

結果をレンダリングするための jsp ファイルを作成する

同じWebディレクトリに、 jsp ファイルを置くフォルダーを作成します。私はそれをビューと呼んでいましたが、やはり即興演奏が可能です。このフォルダーに 2 つの jsp ファイルを作成します。
  • add.jsp — ユーザーを追加するためのページ。
  • list.jsp - ユーザーのリストを表示するページ。
適切なページ見出しを付けてみましょう。「新しいユーザーの追加」や「ユーザー リスト」のようなものですが、今はそのままにしておきます。

2 つのサーブレットを作成しましょう

サーブレットは、Tomcat から渡されるリクエストを受け入れて処理します。src/main/javaフォルダーに、ソースを含むアプリパッケージを作成します。そこにはさらにさまざまなパッケージがあります。したがって、これらのパッケージが相互に作成されないように、アプリパッケージ内にクラスを作成しましょう (その後、削除します)。次に、アプリパッケージ内に3 つの異なるパッケージ を作成しましょう。
  • エンティティ- ここにエンティティが配置されます (ユーザー オブジェクトを記述するクラス自体)。
  • モデル- 私たちのモデルがここにあります (これについては少し後ほど詳しく説明します)。
  • サーブレット- さて、これが私たちのサーブレットになります。
この後、そのクラスをアプリパッケージから安全に削除できます(もちろん、自分で作成した場合)。サーブレットパッケージ内に2 つのクラスを作成します。
  • AddServlet - /addで受信したリクエストを処理します。
  • ListServlet - /listで受信したリクエストを処理します。

Maven で依存関係を接続する

Tomcat バージョン 9.* は、Servlet バージョン 4.0 および JavaServer Pages バージョン 2.3 仕様を実装しています。これは、Tomcat 9 の公式ドキュメントの 2 行目の最初の段落に書かれています。これは、あなたが私と同じように、このバージョンの Tomcat を使用している場合、私たちが作成して送信して実行するコードは、指定されたバージョンを正確に使用することを意味します。しかし、これらの仕様をプロジェクトに含めて、それらを使用するコードが少なくとも正常にコンパイルできるようにしたいと考えています。このためには、それらをプロジェクトにロードする必要があります。ここで Maven が助けになります。

一般的なルールは次のとおりです: Maven を使用して何かをプロジェクトに接続する必要がある場合:

  • Maven リポジトリ Web サイトに移動します。
  • そこで必要なライブラリとバージョンを探してください。
  • pom.xml に挿入する必要がある依存関係コードを取得します。
  • 入れる!:)
それでは始めましょう。まずはpomファイルを用意しましょう。/versionの後、 /projectの前のどこかに、次のコードを挿入します。
<dependencies>

</dependencies>
したがって、これらのタグ内に必要な依存関係をリストすることを示しました。次に、 mvnrepository.comに移動します。上部に検索フィールドがあります。まず、検索にサーブレットを入力します。7,000 回以上の使用がある最初の結果が私たちに適しています。バージョン 4.0 が必要であることを思い出します (Tomcat 9 の場合。他のバージョンの場合は、古い実装が適している可能性があります)。これはかなり新しいバージョンなので、あまり用途はありませんが、必要なものです。ページが開き、さまざまなパッケージ マネージャーのこの依存関係のコードを取得でき、ダウンロードすることもできます。ただし、Maven を使用して接続したいので、[Maven] タブでコードを選択します。依存関係セクション内の pom ファイルにコピーして貼り付けます。IDEA の右下隅に自動インポートを有効にするかどうかを尋ねる通知が表示された場合は、同意したことになります。誤って拒否した場合は、「設定」に移動し、自動インポートを手動で有効にします:設定 (Ctrl + Alt + S) -> ビルド、実行、デプロイメント -> Maven -> インポートこれにより、このためのpom ファイルと IDEA 構成ファイル が保持されます。プロジェクトが同期されています。次に、同じ原理を使用して、JavaServer Pages バージョン 2.3 を検索して接続します (検索に「jsp」と入力します)。Maven についてはすでに説明したので、ソースが Java 8 構文に準拠しており、同じバージョンのバイトコードにコンパイルする必要があることをすぐに伝えましょう。これらすべての操作を行うと、pom.xmlは次のようになります。
<?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>ru.javarush.info.fatfaggy</groupId>
    <artifactId>my-super-project</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <maven.compiler.source>1.8</maven.compile.source>
        <maven.compiler.target>1.8</maven.compile.target>
    </properties>

    <dependencies>
        <!-- Servlet API 4.0 for tomcat 9 -->
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>4.0.0</version>
            <scope>provided</scope>
        </dependency>

        <!-- JavaServer Pages API 2.3 for tomcat 9 -->
        <dependency>
            <groupId>javax.servlet.jsp</groupId>
            <artifactId>javax.servlet.jsp-api</artifactId>
            <version>2.3.1</version>
            <scope>provided</scope>
        </dependency>
    </dependencies>

</project>

サーブレットを実際のサーブレットにする

この時点で、作成した 2 つのサーブレットは実際には単なる通常のクラスです。それらには何の機能もありません。ただし、サーブレット API をプロジェクトに接続したので、接続されている場合は、そこからクラスを使用できるようになります。サーブレットを「本物の」サーブレットにするには、単にHttpServletクラスからサーブレットを継承する必要があります。

マッピングまたはパーティショニング

ここで、 /addからのリクエストがAddServletサーブレットによって処理され、したがって/listからのリクエストがListServletサーブレットによって処理されるように、何らかの方法で Tomcat に伝えるとよいでしょう。このプロセスは マッピング と呼ばれます。これは、次の原則に従って web.xmlファイルで行われます。
  • まず、サーブレットを記述します (名前を付け、クラス自体へのパスを示します)。
  • 次に、このサーブレットを特定のアドレスにバインドします (指定したサーブレットの名前を示し、リクエストの送信元のアドレスをこのサーブレットに示します)。
サーブレットについて説明しましょう。
<servlet>
    <servlet-name>add</servlet-name>
    <servlet-class>app.servlets.AddServlet</servlet-class>
</servlet>
次に、それをアドレスにバインドします。
<servlet-mapping>
    <servlet-name>add</servlet-name>
    <url-pattern>/add</url-pattern>
</servlet-mapping>
ご覧のとおり、サーブレット名はどちらの場合も同じです。このおかげで、Tomcat は、リクエストが/addアドレスに届いた場合、それをapp.servlets.AddServletサーブレットに渡す必要があることを認識します。2 番目のサーブレットでも同じことを行います。その結果、web.xmlにはおよそ次の内容が含まれます。
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
         version="3.1">

    <!-- add servlet -->
    <servlet>
        <servlet-name>add</servlet-name>
        <servlet-class>app.servlets.AddServlet</servlet-class>
    </servlet>

    <servlet-mapping>
        <servlet-name>add</servlet-name>
        <url-pattern>/add</url-pattern>
    </servlet-mapping>

    <!-- list servlet -->
    <servlet>
        <servlet-name>list</servlet-name>
        <servlet-class>app.servlets.ListServlet</servlet-class>
    </servlet>

    <servlet-mapping>
        <servlet-name>list</servlet-name>
        <url-pattern>/list</url-pattern>
    </servlet-mapping>
</web-app>
ちなみに、ここ ( / ) ではメイン ページのマークアップは作成しませんでした。実際のところ、この場合はそれが必要ありません。私たちのホームページは、2 つのボタンを表示するだけの単純なHTML ファイルです。動的コンテンツがないため、アドレス/からのリクエストが送信される別のサーブレットを作成することは意味がありません。このサーブレットは、実行を何らかのJSPに転送する以外は何も行いません(これも実行する必要があります)。作成されます)、ボタンが 2 つあれば描画されます。これは必要ありません。静的リソースで十分です。Tomcat はリクエストを受信すると、そのようなアドレスでリクエストを処理できるサーブレットが 1 つも存在しないことを確認し、このアドレスに既製のHTML ファイルが実際に存在することを確認し、それを正常に送信します。 。アプリケーションを再度実行し (サーバーを再起動するか、必要に応じて再デプロイします)、メイン ページがレンダリングされ、何も壊れていないことを確認します。ボタンをクリックすると遷移が発生しますが、現時点ではエラーも発生します。書かれた。ちなみに、以前は 404 エラーが発生していましたが、現在は 405 エラーが発生しています。これは、マッピングは機能し、サーブレットは見つかりましたが、リクエストを処理する適切なメソッドがなかったことを意味します。すべてが正しく行われたにもかかわらず、この段階でまだ 404 エラーが発生する場合は、アイデア内のデプロイメント構成を修正する必要がある可能性があります。これを行うには、[設定の編集] (スタート ボタンの近くの上部) に移動し、ウィンドウの右側にある [展開] タブに移動し、アプリケーション コンテキストで単に / と表示されていることを確認する必要があります。

叙情的な余談ですが、「内部で」何が起こっているのでしょうか?

私たちのアプリケーションが Tomcat でどのように動作するのか、すでに疑問に思ったことがあるでしょう? そこで何が起こっているのでしょうか?main()メソッドはどこにあるのでしょうか? ブラウザに「localhost:8080」と入力してこのアドレスに移動すると、ブラウザはhttpプロトコル経由でこのアドレスにリクエストを送信します。リクエストにはさまざまな「タイプ」があり、最も一般的なのはGETPOSTであることをすでにご存知かと思います。すべてのリクエストには答えが必要です。GET リクエストは、応答として既成のHTML コードが与えられることを期待しており、それがブラウザに返され、ブラウザはこのコードをあらゆる種類の文字、ボタン、フォームに美しく置き換えます。POST リクエストは、いくつかの情報も伴うため、もう少し興味深いものです。たとえば、ユーザー登録または認証フォームにデータを入力し、「送信」をクリックします。この時点で、あなたの個人情報を含むPOST リクエストがサーバーに送信されました。サーバーはこの情報を受け入れ、処理して、何らかの応答 (たとえば、プロフィールを含むHTML ページ) を返しました。それらの基本的な違いは、GET リクエストはサーバーからデータを受信することのみを目的としているのに対し、POST リクエストには何らかの情報が含まれており、サーバー上のデータが変更される可能性があることです (たとえば、写真をサーバーにアップロードすると、 POST リクエストに送られ、サーバーはそれをデータベースに追加します。つまり、何らかの変更が発生します。Tomcat に戻りましょう。クライアントから何らかのリクエストを受け取ると、アドレスを調べます。そのデータを次のように検索します。そのようなアドレスへのリクエストを処理する適切なサーブレット (またはすぐに返せる既製​​のリソース) があるかどうかを確認します。返すものが見つからない場合は、HTML ページではなく応答します。このアドレスに「存在する」適切なサーブレットが見つかった場合、受信したリクエストの種類 (GET、POST、またはその他) を確認し、サーブレットに次のメソッドがあるかどうかを尋ねます。サーブレットがこのタイプのリクエストを処理できないと判断した場合、Tomcat はコード 405 でクライアントに応答します。これがまさに私たちに起こったことです。しかし、適切なサーブレットが見つかり、それに適切なメソッドがある場合、Tomcat はこのサーブレットのオブジェクトを作成し、それを新しいスレッド ( thread ) で実行します。これにより、サーブレットは別のスレッドで動作できるようになり、Tomcat はさらに動作し続けます。それ自体、リクエストの受信と送信を行います。さらに、Tomcat はさらに 2 つのオブジェクトを作成します。1 つはHttpServletRequestタイプ(今後は簡単にリクエストと呼びます) で、もう 1 つはHttpServletResponseタイプです。(それを答えと呼びます)。最初のオブジェクトには、クライアントからのリクエストで受信したすべてのデータが配置されるため、すべてのデータをこのオブジェクトから取り出すことができます。さて、これらすべてを行った後、これら 2 つのオブジェクトを、別のスレッドで実行されているサーブレットの適切なメソッドに渡します。サーブレットは作業を終了し、クライアントに応答を送信する準備ができるとすぐに、Tomcat に対してフラグを立てて、「完了しました。すべての準備が整いました」と伝えます。Tomcat は応答を受け取り、クライアントに送信します。これにより、Tomcat は中断することなくリクエストを受け入れ、応答を送信できるようになり、すべての作業は別のスレッドで実行されるサーブレットによって実行されます。したがって、サーブレット コードを記述するときは、実行される作業を定義します。そして、そうです、 main()メソッドは Tomcat 自体の中にあると考えることができます(はい、Java で書かれています)。Tomcat を「開始」すると、main().

サーブレットで GET メソッドをキャッチし、単純な応答を送信します

現時点では、サーブレットには適切なメソッド (GET) がないため、Tomcat は 405 エラーを返します。サーブレットを継承する HttpServlet クラスは、さまざまなメソッドを定義しますメソッドのコードを設定するには、メソッドをオーバーライドするだけです。この場合、両方のサーブレットでdoGet()メソッドをオーバーライドする必要があります。
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

}
ご覧のとおり、このメソッドはreq (リクエスト) とresp (レスポンス) の 2 つのオブジェクトを受け入れます。これらは、Tomcat がこのサーブレットの適切なメソッドを呼び出すときに、Tomcat が作成して設定するオブジェクトそのものです。まず、最も単純な答えをしてみましょう。これを行うには、respオブジェクトを取得し、そこから応答の作成に使用できるPrintWriterオブジェクトを取得します。さて、これを使用して、単純な文字列を出力します。
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    PrintWriter writer = resp.getWriter();
    writer.println("Method GET from AddServlet");
}
ListServletサーブレット でも同様のことを行い、その後サーバーを再度起動します。ご覧のとおり、すべてが機能します。ボタンをクリックすると、PrintWriter で「記録」したテキストが表示されるページが開きます。回答を含むページを生成するために用意したJSP はまったく使用されないだけです。これは、単に処刑が彼らに届かないためです。サーバーレット自体は応答を生成して作業を終了し、クライアントへの応答の準備ができていることを Tomcat に通知します。Tomcat は単にこの応答を受け取り、クライアントに送り返します。サーブレットからJSP に制御を移します。 メソッドのコードを次のように変更してみましょう。
  • リクエスト オブジェクトからリクエスト マネージャー オブジェクトを取得し、そこに制御を移したいページのJSPアドレスを渡します。
  • 受信したオブジェクトを使用して、指定されたJSPページに制御を転送します。そこに、Tomcat から受信した要求オブジェクトと応答オブジェクトを忘れずに添付します。
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    RequestDispatcher requestDispatcher = req.getRequestDispatcher("views/add.jsp");
    requestDispatcher.forward(req, resp);
}
JSP ページ の本文(body タグ内) に、どのページが表示されているかを明確に確認できるように何かを記述することができます。その後、サーバーを再起動して確認します。メイン ページのボタンが押されると、ページが開きます。つまり、リクエストがサーブレットに送信され、その後、すでにレンダリングされている JSP ページに制御が移ります。それだけです。記事の次の部分では、アプリケーションの機能について説明します。

他に読むべきもの:

IntelliJ Idea Enterprise で単純な Web プロジェクトを作成します。写真付きでステップバイステップで


私のチャット
コメント
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION