こんにちは、みんな!Web 開発の基本概念としてのサーブレットに慣れ、それを使用する簡単なアプリケーションを作成できるようになります。 不要なアクションを避けるために、最初から開始することはありません。Hibernate に関する前回の記事からアプリケーションの作業を続けていきます。ただし、サーブレットに慣れ始めたばかりなので、Auto クラスに関連するすべてをアプリケーションから削除し、User クラスとそれに関連するアクションだけを残しました。プロジェクトは次のように構成されます。 ということで、サーブレットです!Wikipedia には次のように記載されています。「Java サーブレットは、サーバーの機能を拡張する Java ソフトウェア コンポーネントです。サーブレットはさまざまな種類のリクエストに応答できますが、最も一般的には Web サーバー上で Web アプリケーションをホストするための Web コンテナを実装するため、サーバーとして適格です。サイドサーブレットWeb API。」これはまさにその通りです。ここで初めて、「クライアント/サーバー アプリケーション アーキテクチャ」という概念に遭遇します。その核心は非常にシンプルです。クライアントは、HTTP リクエストを送信してサーバーにアクセスします。サーバーは必要なデータを生成し (たとえば、データベースから取得し)、それをクライアントに返します。最も単純な例は、特定のソーシャル ネットワークで [友達] ボタンをクリックすると、サーバーにリクエストが送信されます。サーバーはデータベース内の友人のリストを更新し、それをあなた (クライアント) に返します。HTTP リクエストのリストは非常に大きいため、これまでにHTTP リクエストに遭遇したことがない場合は、他の場所でそれらについて読むことをお勧めします。たとえば、次のようになります。ここで。 私たちの目的は次のとおりです。サーブレットを使用して CRUD アプリケーションを作成します。アプリケーションは、HTTP リクエストを処理するサーブレットを使用して、データベースからユーザーを作成、読み取り、更新、削除できる必要があります。Hibernate の記事にあるアプリケーションではすでにこれを行うことができましたが、これは Java コード、より正確には main() メソッドから直接制御されていました。今回、リクエストを送信するのはクライアント、つまりあなたです:) 最初に行う必要があるのは、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>com.itis4</groupId>
<artifactId>UsersDaoProject</artifactId>
<version>1.0-SNAPSHOT</version>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>2.6</version>
</plugin>
</plugins>
</build>
<dependencies>
<!-- PostgreSQL -->
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
<version>9.4.1212.jre7</version>
</dependency>
<!-- Hibernate 5.2.6 Final -->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>5.2.6.Final</version>
</dependency>
<dependency>
<groupId>jstl</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>4.3.4.RELEASE</version>
</dependency>
</dependencies>
</project>
3 つの依存関係を追加しました。
- javax.servlet-api ライブラリ自体
- JSTL タグ ライブラリ。クライアント側、つまり JSP ページを作成するために必要になります。
- Spring-WebMVC。春のクラスが 1 つ必要になりますが、それについては後ほど説明します。
- コンテナ内にサーブレットがない場合:
- サーブレット クラスはコンテナによってロードされます。
- コンテナはサーブレット クラスのインスタンスを作成します。
- コンテナは init() メソッドを呼び出します。このメソッドはサーブレットを初期化し、サーブレットがリクエストを処理できるようになる前に最初に呼び出されます。ライフサイクル全体を通じて、init() メソッドは 1 回だけ呼び出されます。
- クライアントのリクエストを処理します。各リクエストは独自の個別のスレッドで処理されます。コンテナはリクエストごとに service() メソッドを呼び出します。このメソッドは、受信リクエストのタイプを判別し、それを処理のために適切なメソッドに送信します。サーブレット開発者は、これらのメソッドの実装を提供する必要があります。実装されていないハンドラーに対するリクエストが到着した場合、親クラスのメソッドが呼び出され、通常は最終的にリクエスト側にエラーを返します。
- コンテナがサーブレットを削除する必要がある場合、コンテナは destroy() メソッドを呼び出し、サーブレットの動作を停止します。init() メソッドと同様に、このメソッドもサーブレット サイクル全体で 1 回呼び出されます。
package servlets;
import models.User;
import services.UserService;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.List;
public class UserSimpleServlet extends HttpServlet {
private UserService service = new UserService();
public void init(ServletConfig servletConfig) {
try {
super.init(servletConfig);
} catch (ServletException e) {
e.printStackTrace();
}
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
List<User> users = service.findAllUsers();
req.setAttribute("users", users);
RequestDispatcher dispatcher = req.getRequestDispatcher("/showUsers.jsp");
dispatcher.forward(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
String name = req.getParameter("name");
int age = Integer.parseInt(req.getParameter("age"));
User user = new User(name, age);
service.saveUser(user);
resp.sendRedirect("/users");
}
@Override
protected void doPut(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
int id = Integer.parseInt(req.getParameter("id"));
User user = service.findUser(id);
user.setName(req.getParameter("name"));
user.setAge(Integer.parseInt(req.getParameter("age")));
service.updateUser(user);
resp.sendRedirect("/users");
}
@Override
protected void doDelete(HttpServletRequest req, HttpServletResponse resp) throws IOException {
int id = Integer.parseInt(req.getParameter("id"));
service.deleteUser(service.findUser(id));
resp.sendRedirect("/users");
}
}
ご覧のとおり、これには上で説明した init() メソッドが含まれており、4 つの HTTP リクエストと同時に実行される 4 つのメソッド、doPost()、doGet()、doPut()、および doDelete() が実装されています。これらにより、ユーザーの作成、読み取り、更新、削除が可能になります。これらのメソッドは、javax.servlet.http.HttpServletRequest クラスと javax.servlet.http.HttpServletResponse クラスのインスタンスを入力として受け入れます。つまり、サーバーに送信されたリクエストとクライアントが受信した応答です。内部的には、メソッドは UserService クラスの関連メソッドを呼び出し、クライアントへの応答が生成されて /users URL にリダイレクトされます。たとえば、 doGet() メソッドでは、すべてのユーザーのリストを取得します。次に、RequestDispatcher オブジェクトを作成します。これにより、HTTP リクエストにオブジェクトを含めて、それを特定のリソース (たとえば、クライアント JSP ページ) にリダイレクトできます。doPut() メソッド (ユーザー データを更新する) では、HTTP リクエストを処理し、ID、名前、および年齢のパラメーターを抽出し、指定された ID を持つユーザーを検索し、リクエストに含まれる名前と年齢を割り当てて、戻り値を返します。 /users ページに移動します。ただし、これらすべてのメソッドが正しく機能するには、サーブレットを構成する必要があります。これを行うには、WEB-INF フォルダー内の web.xml ファイルを使用します。
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.1"
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">
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<servlet>
<servlet-name>UserSimpleServlet</servlet-name>
<servlet-class>servlets.UserSimpleServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>UserSimpleServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<filter>
<filter-name>hiddenHttpMethodFilter</filter-name>
<filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>hiddenHttpMethodFilter</filter-name>
<servlet-name>UserSimpleServlet</servlet-name>
</filter-mapping>
</web-app>
このファイル内のタグはすべて非常に直感的ですが、順番に見ていきましょう。<welcome-file-list> - JSP スタート ページが示されます。アプリケーションの起動時に最初に開かれます。この例では、これはindex.jspです。<servlet> - UserSimpleServlet クラスをサーブレットとして登録します。<servlet-mapping> - 非常に重要なタグです。サーブレットによって処理される URL を定義します。今回の場合はすべて URL なので、単純に「/」を示します。しかし、ユーザーとその車 (自動車) が関与するアプリケーションがある場合は、2 番目のサーブレット (SimpleAutoServlet) を作成できます。この場合、ユーザー サーブレットのマッピングは「/users」(つまりユーザーに関するリクエスト)、自動サーブレットのマッピングは「/autos」になります。そして最後に<フィルター>です。内部的には、組織のインスタンスを定義します。springframework.web.filter.HiddenHttpMethodFilter クラス。この記事は春に関するものではないので、詳しくは説明しません。これは追加機能としてのみアプリケーションに組み込まれているとだけ言っておきます。重要なのは、JSP ページを使用してクライアント側を作成するということです。データは、ユーザーのリストを含む表としてページに表示されます。JSP ページ内では、<form/> HTML タグが使用されます。ただし、<form/> からのデータの送信に使用できるのは HTTP GET リクエストと POST リクエストのみです。つまり、ユーザーの更新、削除、作成という 3 つの操作すべてで、POST リクエストのみを使用する必要があります。PUT リクエストと DELETE リクエストを使用するという選択肢はありません。原理的には、これはごく普通のことであり、実装は簡単ですが、HiddenHttpMethodFilter クラスを使用すると、これらを使用できるようになります。この上、読者は、アプリケーション内の操作の違いをより明確に理解できるようになります。最後に、クライアント側に進みましょう。これは 5 つの JSP ページで表されます。インデックス.jsp。
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Hello!</title>
</head>
<body>
If you want to start working with the user database,<br>
click the button below:
<form action = "users" method="get">
<input type="submit" value="Start working with database">
</form>
</body>
</html>
addUser.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Add new user</title>
</head>
<body>
<form action = "/users" method="post">
<input required type="text" name="name" placeholder="Name">
<input required type="text" name="age" placeholder="Age">
<input type="submit" value="Save">
</form>
</body>
</html>
deleteUser.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Delete user</title>
</head>
<body>
Are you sure you want to delete the user ${param.id}?
&lform action="/users/${param.id}" method="post">
<input type="hidden" name="id" value="${param.id}">
<input type="hidden" name="_method" value="delete">
<input type="submit" value="Delete">
</form>
</body>
</html>
showUsers.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
<title>User list</title>
</head>
<body>
<table border="2">
<tr>
<td>ID</td>
<td>Name</td>
<td>Age</td>
<td>Actions</td>
</tr>
<c:forEach items="${users}" var = "user">
<tr>
<td>${user.getId()}</td>
<td>${user.getName()}</td>
<td>${user.getAge()}</td>
<td>
<form action = "updateUser.jsp" method="post">
<input type="hidden" name="id" value="${user.getId()}">
<input type="hidden" name="name" value="${user.getName()}">
<input type="hidden" name="age" value="${user.getAge()}">
<input type="submit" value="Modify" style="float:left">
</form>
<form action="deleteUser.jsp" method="post">
<input type="hidden" name="id" value="${user.getId()}">
<input type="submit" value="Delete" style="float:left">
</form></td>
</tr>
</c:forEach>
</table>
<form action = "addUser.jsp">
<input type="submit" value="Add new user">
</form>
</body>
</html>
updateUser.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Modify user data</title>
</head>
<body>
Edit user
<form action="/users/${param.id}" method="post">
<input type="hidden" name = "id" value="${param.id}">
<input type="text" name="name" value="${param.name}" placeholder=${param.name}>
<input type="text" name="age" value="${param.age}" placeholder=${param.age}>
<input type="hidden" name="_method" value="put">
<input type="submit" value="Update">
</form>
</body>
</html>
JSP (JavaServer Page) ページには、テキスト (HTML、SVG、WML、または XML) としてフォーマットできる静的ソース データと、動的コンテンツの構築に使用される JSP 要素という 2 種類のテキストが含まれています。JSP ページとは何かを理解していただくために、非常に優れた記事の一節をコピーしました。「基本的に、初めて JSP がリクエストされると、JSP はサーブレットに変わり、サーブレットとして動作します。これを理解することは非常に重要です。JSPページは HTML ページとは異なります。初心者プログラマは、これが別のサーブレットであることを明確に理解する必要があります」 — それは、表示方法をプログラムする必要がないというだけです。単に描画するだけで済みます。そして、必要な場所にデータを追加するだけです。しかし、JSP ページは HTML を彷彿とさせるため、デザイナーは明らかにその方が簡単だと感じます。初心者に強く強調します。JSP ページはサーブレットです。すべてのデータの追加を含めて、サーバー上で生成されます。ここにすべてのデータが挿入されます。そしてブラウザでは、ユーザーは Java の兆候のない完成した HTML ページを取得します。」各ページには実行する必要のあるメソッドがあるため、JSP ページが実際にサーブレットであることを確信できます。たとえば、index .jsp は、[データベースの操作を開始する] ボタンをクリックすると、get メソッドが実行されることを示します (method = "get")。新しいユーザーの作成を担当する addUser.jsp ページが post メソッドを実行します。 (method = "post") 保存ボタンをクリックしたとき。JSP ページの残りの部分は通常の静的 HTML マークアップで構成されているため、これについては詳しく説明しません。これについては別の記事で取り上げますが、このトピックにはたくさんあります。インターネット上で話題になっています。アプリケーションを作成しました! 次に、実際に動作をテストする必要があります。これを行うには、前述の Apache Tomcat サーブレット コンテナが必要です。コンテナをダウンロードできます公式ウェブサイトから(私はバージョン8を使用しています)。次に、Tomcat を通じてアプリケーションを実行するための構成を IDEA で作成する必要があります。これを行うには、[構成の編集] タブを開き、 新しい構成を作成し、 [Tomcat Server Local] を選択します。「アプリケーションサーバー」タブで、Tomcat フォルダーへのパスを指定します 。 次に、「デプロイメント」タブに移動します。 ここでは、ローカル サーバー上でのアプリケーションのデプロイメントを構成します。「+」を押して、「Artifact」 -> YourProjectName:war を選択します (アプリケーションを war ファイルにビルドします)。 以上が要約です。「サーバー」ページでは、アプリケーションが http://localhost:8080/ で実行されることがわかります。構成を保存し、名前を付けます (構成を「Tommy」と呼びます)。次に、IDEA の Maven タブ (右側) で、war プラグインを使用してプロジェクトを war ファイルにビルドします (プラグイン -> war -> war: war)。 ビルドが完了したら、アプリケーションを実行して待ちます。成功!スタートページを公開しました。次に、「データベースの操作を開始する」ボタンをクリックします。Index.jsp は、サーバーによって処理される GET リクエストを生成します。サーバーは応答を生成し、既存のすべてのユーザーのリストの形式で返します (もちろん、データベースにユーザーが存在することが前提です)。そして、そこにあります!そこにそれがあるのです!Java サーブレットを使用して最初のアプリケーションを作成しました。 そんなに悪くなかったですよね?:) 宿題として、前の記事から車の機能を復元できます。。つまり、車用に別のサーブレットと JSP ページを作成し、ユーザーの車をリストする方法、ユーザーに新しい車を追加する方法、編集および削除する方法をアプリケーションに教えます。PS サーブレットと JavaServer Pages はかなり古いテクノロジーです。インターネット上では、「こんな古いジャンク誰が必要なの?」といったコメントがよく見かけられます。答えは非常に簡単です。主に実際のプロジェクトに取り組む人々であり、そこではこれらのテクノロジを使用する多くのコードに遭遇する可能性が非常に高いです。また、それがどのように機能するかを理解していなくても、「古いジャンク」を新しいものに切り分けるのは楽しいです :) JSP とサーブレットのより徹底的な研究については、 「Head First Servlets and JSP」という本を参照してください。。この本は有名なスーパーブック「Head First Java」と同じ著者によって書かれており、多くの人はこの本が品質の保証であると考えるでしょう :) この記事がお役に立てば幸いです。ご清聴ありがとうございました。学習頑張ってください!
GO TO FULL VERSION