記事を理解するために必要な知識:あなたはすでにJava Core についてほぼ理解していて、 JavaEE テクノロジとWeb プログラミングについて検討したいと考えています。現在、この記事に近いトピックを扱う Java Collections クエストを学習していることが最も合理的です。
この資料は、私の記事「IntelliJ Idea Enterprise で最も単純な Web プロジェクトを作成する」の論理的な続きです。この記事では、実用的な Web プロジェクト テンプレートを作成する方法を説明しました。今回は、 Java Servlet APIとJavaServer Pages APIを使用して、シンプルだが非常に魅力的な Web アプリケーションを作成する方法を説明します。 アプリケーションには、次の 2 つのリンクのあるホームページがあります。
さぁ、始めよう。まず、POMファイルを用意します。/versionエントリの後、/projectの前のどこかに、次のコードを挿入します。
サーブレットから JSP ファイルに制御を渡しましょう。メソッドのコードを次のように変更します。

- ユーザーを追加するためのページへのリンク。
- ユーザーのリストへのリンク。
将来のアプリケーションの構造について少し
私たちのホームページ (/) は、ヘッダーと 2 つのリンク/ボタンを備えた 最も一般的な静的HTMLページになります。- 新しいユーザーを追加します ( / addに移動します)。
- ユーザーのリストを表示します ( / 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> <!-- button holder -->
<button onclick="location.href='/list'">List users<//button>
<button onclick="location.href='/add'">Add user<//button>
</div>
</div>
</body>
</html>
ここでは複雑なことは何もありません。titleタグには、ページのタイトルを示します。ページ本文には、headerとcontentという 2 つの主要な div があります。コンテンツdiv には、ボタンのホルダーが含まれています。クリックするだけで対応するアドレスに移動できるボタンが 2 つあります。プロジェクトを実行して、現在の様子を確認できます。ボタンをクリックすると、404 エラー ページが表示されます、対応するページがまだ存在していないためです。しかし、ボタンが機能していることはわかります。これは最も普遍的なアプローチではないことに注意してください。ブラウザで JavaScript がオフになっている場合、これらのボタンは機能しません。ただし、JavaScript を無効にする人はいないと仮定します。:) もちろん、単純なリンクでも十分ですが、私はボタンの方が好きです。好みに応じて行うことができます。私の例には多くのdiv が含まれるという事実については心配しないでください。後でスタイルを追加すると、すべてがより美しく見えるようになります。:)
結果をレンダリングするための JSP ファイルを作成する
同じWebディレクトリに、 JSP ファイルを追加するフォルダーを作成します。私はそれを「ビュー」と呼びましたが、ここでも即興演奏が可能です。このフォルダーに 2 つの JSP ファイルを作成します。- add.jsp — ユーザーを追加するためのページ。
- list.jsp — ユーザーのリストを表示するページ。
2 つのサーブレットを作成する
サーブレットは、 Tomcat が送信したリクエストを受信して処理します。src/main/javaフォルダーに、ソース コードを配置するアプリパッケージを作成します。他のパッケージもそこに移動します。したがって、これらのパッケージが相互に作成されないようにするために、アプリパッケージ内にクラスを作成します(後で削除します)。次に、アプリパッケージ内に 3 つの異なるパッケージを作成します。- エンティティ— エンティティ (ユーザー オブジェクトを記述するクラス) がここに配置されます。
- モデル— これが私たちのモデルの場所です (これについては少し後で説明します)。
- サーブレット— ここがサーブレットの行き先です。
- AddServlet — / addに送信されたリクエストを処理します。
- ListServlet — / listに送信されたリクエストを処理します。
Maven で依存関係を接続する
Tomcat 9 .* は、 Servlet 4.0およびJavaServer Pages 2.3の仕様を実装しています。これは、Tomcat 9 の公式ドキュメントの最初の段落の 2 行目に記載されている内容です。これは、私と同じように、このバージョンのTomcat を使用している場合、作成して実行するコードはこれらのバージョンを使用することを意味します。しかし、これらの仕様をプロジェクトに含めて、それらを使用するコードが少なくとも正常にコンパイルできるようにしたいと考えています。これを行うには、それらをプロジェクトにロードする必要があります。ここでMaven が助けになります。
一般的なルールは次のとおりです: Maven を使用して何かをプロジェクトに接続する必要がある場合:
|
<dependencies>
</dependencies>
これは、これらのタグ内に必要な依存関係をリストすることを示すために行われます。次に、 mvnrepository.comにアクセスします。上部に検索フィールドがあります。まず、「servlet」を検索します。最初の結果は 7,000 回以上使用されており、私たちにとっては適切なものです。バージョン4.0 ( Tomcat 9用) が必要であることに注意してください。)。古い実装には他のバージョンが適切な場合があります。かなり新しいバージョンなので、あまり使い道はありません。しかし、私たちにはそれが必要なのです。ページが開き、さまざまなパッケージ マネージャーのこの依存関係のコードを取得したり、単にダウンロードしたりできます。ただし、Maven を使用して接続したいので、[Maven] タブでコードを選択します。コピーして、POM ファイルの依存関係セクションに貼り付けます。IDEAの右下隅に自動インポートを有効にするかどうかを尋ねる通知が表示された場合は、同意して続行します。誤って拒否した場合は、「設定」に移動し、自動インポートを手動でオンにします:設定 (Ctrl + Alt + S) -> ビルド、実行、デプロイ -> Maven -> インポート。とこのプロジェクトの 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>cc.codegym.info.fatfaggy</groupId>
<artifactId>my-super-project</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<maven.compile.source>1.8</maven.compile.source>
<maven.compile.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>
サーブレットを実際のサーブレットにします
現時点では、作成したサーブレットのペアは実際には通常のクラスです。それらには何の機能もありません。ただし、サーブレット 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>
ご覧のとおり、servlet-name はどちらの場合も同じです。その結果、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 ファイルです。これには動的コンテンツがないため、 /からのリクエストに対して別のサーブレットを作成する必要はありません。このサーブレットは、2 つのボタンを描画するために、いくつかのJSP (これも作成する必要があります) に実行を転送するだけです。これは必要ありません。静的なページが最適です。Tomcat はリクエストを受信すると、そのアドレスのリクエストを処理できるサーブレットが 1 つあるかどうかを確認し、このアドレスに準備済みの HTML ファイルが実際にすでに含まれていることを確認します。、それは提供されます。アプリケーションを再度実行し (サーバーを再起動するか、再度デプロイするか、お好みで)、ホームページがレンダリングされ、何も壊れていないこと、ボタンをクリックすると遷移が発生することを確認します (ただし、やはりエラーが発生します)。ちなみに、以前は 404 エラーが発生していましたが、現在は 405 エラーが発生しています。これは、マッピングは機能し、サーブレットは見つかったが、リクエストを処理する適切なメソッドがなかったことを意味します。
余談ですが、「内部では」何が起こっているのでしょうか?
おそらく、アプリケーションが Tomcat でどのように動作するかについてはすでに考えたことがあるでしょう。そこでは何が起こるのでしょうか?main() メソッドはどこにあるのでしょうか? ブラウザで localhost:8080 に移動すると、ブラウザは HTTP プロトコルを使用してこのアドレスにリクエストを送信します。リクエストにはさまざまな種類があり、最も一般的なのは GET と POST であることはすでにご存知かと思います。それぞれの要求に答える必要があります。GET リクエストでは、すぐに使用できる HTML コードの応答がブラウザに返されることが期待されます。その後、ブラウザはコードをすべての美しい文字、ボタン、フォームに置き換えます。POST リクエストは、いくつかの情報も運ぶため、もう少し興味深いものになります。たとえば、Web サイトの登録フォームまたはサインイン フォームに資格情報を入力し、[送信] をクリックするとします。これにより、個人情報を含む POST リクエストがサーバーに送信されます。サーバーはこの情報を受信して処理し、何らかの応答 (たとえば、プロフィールを含む HTML ページ) を返します。これらの主な違いは、GET リクエストはサーバーからデータを取得するためにのみ使用されるのに対し、POST リクエストは何らかの情報を運ぶ (サーバー上のデータは変更される可能性がある) ことです。たとえば、写真をサーバーにアップロードすると、その写真は POST リクエストで送信され、サーバーはそれをデータベースに追加します。つまり、変更が発生します。さて、Tomcat の話に戻ります。クライアントからリクエストを受信すると、アドレスを調べます。そのアドレスへのリクエストを処理するのに適切なサーブレット (またはすぐに返すことができる利用可能なリソース) があるかどうかを確認します。返すものが見つからない場合は、その場合、HTML ページではなく 404 エラーが返されます。ただし、そのアドレスに「存在する」適切なサーブレットが見つかった場合は、リクエストのタイプ (GET、POST、またはその他) を調べ、このタイプのクエリを処理できるメソッドがあるかどうかをサーブレットに尋ねます。サーブレットがこの型の処理方法がわからないと言う場合、Tomcat は405 コードを返します。そして、これはまさに私たちのプロジェクトで起こったことです。ただし、適切なサーブレットが見つかり、それに適切なメソッドがある場合、Tomcat はサーブレット オブジェクトを作成し、新しいスレッドで開始します。(これにより、Tomcat は独自に実行できるようになります)、Tomcat は独自の作業を続行し、リクエストの受信と送信を行います。さらに、Tomcat はさらに 2 つのオブジェクト、HttpServletRequest (略して「リクエスト」と呼びます) と 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("GET method from AddServlet");
}
ListServlet でも同様のことを行い、サーバーを再起動します。ご覧のとおり、すべてが機能します。ボタンをクリックすると、PrintWriter で「書いた」テキストを含むページが表示されます。ただし、応答を含むページを生成するために準備した JSP ファイルは使用されていません。それは単純に、死刑が執行されないからです。サーブレットは応答自体を作成して実行を終了し、クライアントに応答する準備ができていることを Tomcat に通知します。Tomcat は応答を受け取ってクライアントに送り返すだけです。
- リクエスト オブジェクトからリクエスト ディスパッチャー オブジェクトを取得し、制御を移したい 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 ページに渡され、レンダリングが開始されます。それは今のところすべてです。この記事の次の部分では、アプリケーションの機能に取り組みます。
GO TO FULL VERSION