初心者向けのJavaウェブアプリケーションチュートリアル
JavaのWebアプリケーションは、動的なウェブサイトを作成するために使用されます。Javaは、ServletとJSPを通じてWebアプリケーションへのサポートを提供します。静的なHTMLページでウェブサイトを作成することはできますが、情報を動的にする場合は、ウェブアプリケーションが必要です。
Javaのウェブアプリケーション
この記事の目的は、Webアプリケーションの異なるコンポーネントの基本的な詳細と、ServletとJSPを使用して最初のJava Webアプリケーションを作成する方法について提供することです。
-
- ウェブサーバーとクライアント
-
- HTMLとHTTP
-
- URLの理解
-
- なぜServletとJSPが必要なのか?
-
- ServletとJSPを使った最初のウェブアプリケーション
-
- ウェブコンテナ
-
- ウェブアプリケーションのディレクトリ構造
- デプロイメント記述子
ウェブサーバーとクライアント
ウェブサーバーは、クライアントのリクエストを処理し、その応答をクライアントに送信するソフトウェアです。例えば、Apacheは最も広く使われているウェブサーバーの一つです。ウェブサーバーは物理的なマシン上で動作し、特定のポートでクライアントのリクエストを待ち受けます。ウェブクライアントは、サーバーとの通信を支援するソフトウェアです。Firefox、Google Chrome、Safariなどが最も広く使われているウェブクライアントの例です。私たちがサーバーに何かを要求すると(URL経由で)、ウェブクライアントはリクエストを作成し、サーバーに送信し、サーバーの応答を解析してユーザーに表示します。
HTMLとHTTP
ウェブサーバーとウェブクライアントは2つ別々のソフトウェアですので、通信のためには共通の言語が必要です。HTMLはサーバーとクライアントの間で使われる共通の言語であり、HyperText Markup Languageの略です。ウェブサーバーとクライアントは共通の通信プロトコルが必要であり、HTTP(HyperText Transfer Protocol)がサーバーとクライアントの間での通信プロトコルです。HTTPはTCP/IP通信プロトコルの上で動作します。HTTPリクエストの重要な部分に以下のものがあります:
- HTTP Method – action to be performed, usually GET, POST, PUT etc.
- URL – Page to access
- Form Parameters – similar to arguments in a java method, for example user,password details from login page.
サンプルのHTTPリクエスト:
GET /FirstServletProject/jsps/hello.jsp HTTP/1.1
Host: localhost:8080
Cache-Control: no-cache
HTTPレスポンスの重要な要素には、以下のものがあります。
- Status Code – an integer to indicate whether the request was success or not. Some of the well known status codes are 200 for success, 404 for Not Found and 403 for Access Forbidden.
- Content Type – text, html, image, pdf etc. Also known as MIME type
- Content – actual data that is rendered by client and shown to user.
サンプルのHTTPレスポンス:
200 OK
Date: Wed, 07 Aug 2013 19:55:50 GMT
Server: Apache-Coyote/1.1
Content-Length: 309
Content-Type: text/html;charset=US-ASCII
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "https://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
<title>Hello</title>
</head>
<body>
<h2>Hi There!</h2>
<br>
<h3>Date=Wed Aug 07 12:57:55 PDT 2013
</h3>
</body>
</html>
MIMEタイプまたはコンテンツタイプ:上記のサンプルHTTP応答ヘッダーを見ると、「Content-Type」というタグが含まれています。これはMIMEタイプとも呼ばれ、サーバーはこれをクライアントに送信して、送信するデータの種類を知らせます。これにより、クライアントはデータをユーザーに表示する際に役立ちます。最もよく使用されるMIMEタイプには、text/html、text/xml、application/xmlなどがあります。
URLを理解する
URLはUniversal Resource Locatorの頭文字であり、サーバーとリソースの場所を特定するために使用されます。ウェブ上のすべてのリソースには独自のアドレスがあります。以下にURLの一部を例と共に見てみましょう。https://localhost:8080/FirstServletProject/jsps/hello.jsp https:// – これはURLの最初の部分であり、サーバーとクライアント間の通信に使用される通信プロトコルを指定します。localhost – サーバーのユニークなアドレスであり、ほとんどの場合、ホスト名を一意のIPアドレスにマップするものです。複数のホスト名が同じIPアドレスを指す場合もありますが、ウェブサーバーの仮想ホストが特定のサーバーインスタンスにリクエストを送信します。8080 – サーバーがリッスンしているポート番号であり、オプションです。URLで指定しない場合、リクエストはプロトコルのデフォルトポートに送信されます。ポート番号0から1023までは、よく知られたサービス用に予約されたポートです。たとえば、HTTPの80、HTTPSの443、FTPの21などです。FirstServletProject/jsps/hello.jsp – サーバーから要求されたリソースです。静的なHTML、PDF、JSP、サーブレット、PHPなどが含まれます。
なぜ私たちはServletとJSPが必要なのですか?
ウェブサーバは静的なコンテンツのHTMLページに適していますが、動的なコンテンツを生成したり、データをデータベースに保存する方法を知りません。そのため、動的なコンテンツを生成するために別のツールが必要です。PHP、Python、Ruby on Rails、Java Servlets、JSPなど、いくつかのプログラミング言語があります。Java ServletとJSPは、動的な応答とデータの永続化のサポートを提供することによって、ウェブサーバの機能を拡張するためのサーバーサイドの技術です。
JavaのWeb開発
最初のWebアプリケーションはServletとJSPを使用したものです。
最初のサーブレットアプリケーションを作成するために、「Eclipse IDE for Java EE Developers」を使用します。サーブレットはサーバーサイドの技術であるため、ServletテクノロジーをサポートするWebコンテナが必要です。そのため、Apache Tomcatサーバーを使用します。設定は非常に簡単で、その部分は自分で行ってください。開発の簡便さのために、TomcatをEclipseで設定することができます。これにより、アプリケーションのデプロイと実行が容易になります。Eclipseの設定で「Server Runtime Environments」を選択し、Tomcatサーバーのバージョンを選択します。私の場合はTomcat 7です。Apache Tomcatのディレクトリ場所とJRE情報を提供してランタイム環境を追加してください。それから「Servers」ビューに移動し、上記で追加したランタイム環境を指すように以下の画像のように新しいサーバーを作成してください。注:もし「Servers」タブが表示されていない場合は、Window > Show View > Servers を選択してEclipseウィンドウで表示されるようにしてください。サーバーが正常に動作していることを確認するために、サーバーの停止と開始を試してみてください。既にターミナルからサーバーを起動している場合は、ターミナルから停止し、その後Eclipseから起動してください。そうしないと正常に動作しません。これで、サーブレットを作成し、Tomcatサーバーで実行するための準備が整いました。File > New > Dynamic Web Project を選択し、以下の画像のようにランタイムを先ほど追加したサーバーに設定し、モジュールのバージョンを3.0にしてServlet 3.0の仕様を使用してサーブレットを作成します。プロジェクトを作成するにはFinishボタンを直接クリックするか、他のオプションを確認するためにNextボタンをクリックすることもできます。次に、File > New > Servlet を選択し、以下の画像を使用して最初のサーブレットを作成します。再度、Finishボタンをクリックしても良いですし、Nextボタンを使用して他のオプションを確認することもできます。Finishボタンをクリックすると、サーブレットのスケルトンコードが生成されますので、異なるメソッドやインポートを入力する必要はありません。これにより時間を節約できます。doGet()メソッドに動的データのHTMLコードを追加し、HTTP GETリクエストに対して呼び出されるようにします。最初のサーブレットは以下のようになります。
package com.scdev.first;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Date;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebInitParam;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* Servlet implementation class FirstServlet
*/
@WebServlet(description = "My First Servlet", urlPatterns = { "/FirstServlet" , "/FirstServlet.do"}, initParams = {@WebInitParam(name="id",value="1"),@WebInitParam(name="name",value="scdev")})
public class FirstServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
public static final String HTML_START="<html><body>";
public static final String HTML_END="</body></html>";
/**
* @see HttpServlet#HttpServlet()
*/
public FirstServlet() {
super();
// TODO Auto-generated constructor stub
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
PrintWriter out = response.getWriter();
Date date = new Date();
out.println(HTML_START + "<h2>Hi There!</h2><br/><h3>Date="+date +"</h3>"+HTML_END);
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
}
}
Servlet 3より前は、Webアプリケーションのデプロイ記述子にURLパターン情報を提供する必要がありましたが、servlet 3.0ではJavaのアノテーションが使用され、理解しやすくエラーの可能性が少なくなりました。ただし、サーブレットエディタウィンドウの[実行]メニューから[サーバーで実行]オプションを選択し、以下の画像を使用します。[完了]をクリックすると、ブラウザがEclipseで開き、次のHTMLページが表示されます。日付が動的に変わり続けるため、リフレッシュして確認することができます。Eclipseの外でも他のブラウザで開くことができます。したがって、サーブレットはHTMLを生成してレスポンスで送信するために使用されます。doGet()の実装を見ると、実際にはHTMLドキュメントを作成し、それをレスポンスのPrintWriterオブジェクトに書き込んで必要な場所に動的な情報を追加しています。これは初めてのスタートですが、レスポンスが非常に大きく、多くの動的なデータを含んでいる場合、エラーが発生しやすく読みやすく保守が困難です。これがJSPの導入の主な理由です。JSPもサーバーサイドの技術であり、必要な場所に動的なコンテンツを追加するための追加機能を持ったHTMLのようなものです。JSPは表示に適しているため、HTMLのように記述しやすいです。以下は、上記のサーブレットと同じことを行う最初のJSPプログラムです。
<%@page import="java.util.Date"%>
<%@ page language="java" contentType="text/html; charset=US-ASCII"
pageEncoding="US-ASCII"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "https://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
<title>Hello</title>
</head>
<body>
<h2>Hi There!</h2>
<br>
<h3>Date=<%= new Date() %>
</h3>
</body>
</html>
もし私たちが上記のJSPを実行すると、以下のイメージのような出力が得られます。Eclipseでは、最終的なプロジェクトの階層は以下のイメージのようになります。
FirstServletプロジェクトをダウンロードしてください。
「ダウンロードサーブレットのハローワールドのサンプルプロジェクトをダウンロードしてください。」
将来の投稿では、ServletとJSPについてさらに詳しく見ていきますが、この投稿を結論付ける前に、Javaウェブアプリケーションのいくつかの側面をよく理解しておく必要があります。
ウェブコンテナ
TomcatはWebコンテナです。クライアントからウェブサーバーへのリクエストがあると、Tomcatはそのリクエストをウェブコンテナに渡し、ウェブコンテナは適切なリソース(サーブレットまたはJSP)を見つけて、そのリソースからのレスポンスを利用してレスポンスを生成し、ウェブサーバーに提供します。それからウェブサーバーがクライアントにレスポンスを送り返します。ウェブコンテナがリクエストを受け取ると、もしサーブレットの場合は、コンテナは2つのオブジェクトであるHTTPServletRequestとHTTPServletResponseを作成します。そしてURLに基づいて適切なサーブレットを見つけ、リクエストのためにスレッドを作成します。そして、サーブレットのservice()メソッドを呼び出し、HTTPメソッドに基づいてdoGet()またはdoPost()メソッドを呼び出します。サーブレットのメソッドは動的なページを生成し、それをレスポンスに書き込みます。サーブレットのスレッドが完了すると、コンテナはレスポンスをHTTPレスポンスに変換してクライアントに送り返します。ウェブコンテナが行う重要な作業の一部は次のとおりです。
- Communication Support – Container provides easy way of communication between web server and the servlets and JSPs. Because of the container, we don’t need to build a server socket to listen for any request from the webserver, parse the request and generate a response. All these important and complex tasks are done by container and all we need to focus is on our business logic for our applications.
- Lifecycle and Resource Management – Container takes care of managing the life cycle of servlet. The container takes care of loading the servlets into memory, initializing servlets, invoking servlet methods and destroying them. The container also provides utility like JNDI for resource pooling and management.
- Multithreading Support – Container creates a new thread for every request to the servlet and when it’s processed the thread dies. So servlets are not initialized for each request and save time and memory.
- JSP Support – JSPs doesn’t look like normal java classes and web container provides support for JSP. Every JSP in the application is compiled by container and converted to Servlet and then container manages them like other servlets.
- Miscellaneous Task – Web container manages the resource pool, does memory optimizations, run garbage collector, provides security configurations, support for multiple applications, hot deployment and several other tasks behind the scene that makes our life easier.
ウェブアプリケーションのディレクトリ構造
Javaウェブアプリケーションは、Web Archive(WAR)としてパッケージ化され、定義された構造を持っています。上記の動的ウェブプロジェクトをWARファイルとしてエクスポートして解凍し、階層を確認することができます。以下のイメージのようなものになります。
配置記述子 (ハンセイ・キジュツシ)
web.xmlファイルは、ウェブアプリケーションのデプロイ記述子であり、サーブレット(3.0より前)、ウェルカムページ、セキュリティ設定、セッションタイムアウト設定などのマッピングを含んでいます。これがJavaウェブアプリケーションのスタートアップチュートリアルのすべてです。将来の投稿では、ServletとJSPについてもさらに探求します。更新:このシリーズの次のチュートリアルはJava Servletsチュートリアルです。