TomcatによるWebアプリケーション開発入門 Servlet入門(1) TomcatによるWebアプリケーション開発入門 大岩研究会 高橋純平 2003年5月15日
本日の目標 Webアプリケーションとは何か説明できる Webアプリケーションの単位で ファイルを管理できる ・CGIとServletの違いを説明できるようになる Webアプリケーションの単位で ファイルを管理できる ・web.xmlの設定をいじれるようになる Servletを使った基本的なプログラムが書 けるようなる
Webアプリにはコンセプトが無くてはならない コンセプトの無い掲示板はただの動的なページ ・ではどんなものがWebアプリなのか? 例:SFCの体育予約システム
Webアプリケーションの例 SFCの体育予約システムを見てみよう 体育予約システムではどんなことができるか ・ ログイン ・ ログイン ・ 予約の確認・取り消し ・ 予約する ・ どんな授業があるか閲覧する ・ 今までの履修の確認 これらは一つ一つは「機能」であって「Webアプリ」とは言えない。 すべての機能を合わせて、「体育の出欠状況を管理する」という コンセプトを満たしているので、全部で一つの「Webアプリ」と言える。 ではこのようなWebアプリはサーバー上でどのように動いているのだろうか
Webアプリを使うための環境 サーバー上では複数のWebアプリが動いている 実行 実行 実行 ではアプリケーションサーバーとはなんだろう? 体育予約 システム 生徒A 実行 ブラウザからHTTPリクエストを送る 英語履修 システム 生徒B 実行 レポート システム 生徒C アプリケーションサーバー ではアプリケーションサーバーとはなんだろう?
HTTPリクエスト/レスポンスを利用して アプリケーションサーバとは 別名をWebアプリケーションサーバと言う WebサーバをWebアプリケーションのために拡張したもの HTTPで通信する サーブレットなどのサーバサイドJavaの実行環境を実装している Webアプリを管理するために便利な機能を持つ 各Webアプリを一つのディレクトリで管理する 各Webアプリごとに決まりごとを設定できるなど・・・ Tomcatはアプリケーションサーバの一つである アプリケーションサーバ Tomcat クライアントとWebアプリが HTTPリクエスト/レスポンスを利用して 対話するときの仲介役になる
サーブレットとは main(){ _________ } doGet(){ _________ ________ } 実行 実行 サーバ側で動作するJavaのプログラム クライアント(ブラウザなど)からHTTPリクエストがくると実行される HTTPリクエストを受け取り何らかの処理をしてHTTPレスポンスで結果を返す 単独では動作せず、サーブレットを実行できる環境が必要 main(){ _________ } 普通のJavaプログラムの実行 doGet(){ _________ ________ } Servletプログラムの実行 アプリケーションサーバ HTTPリクエスト java HOGE 実行 実行 サーブレットはアプリケーションサーバが実行する
サーブレットのソース import java.io.*; import javax.servlet.*; import javax.servlet.http.*; public class HelloWorldServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // ContentTypeを設定 response.setContentType("text/html; charset=Shift_JIS"); // 出力用PrintWriterを取得 PrintWriter out = response.getWriter(); // 出力 out.println("<html>"); out.println("<head>"); out.println("<title>Hello World Servlet</title>"); out.println("</head>"); out.println("<body>"); out.println("Hello World"); out.println("</body>"); out.println("</html>"); } Servlet関係のクラスをインポートします GETでリクエストがあったときに実行する 処理を書きます HTMLを書き出すための準備 HTMLへの書き出し
Tomcatのサンプルサーブレットを実行してみる ②Webブラウザで http://localhost:8080/examples/servlet/HelloWorldExample と入力する するとこんなページが表示される
クライアントとサーブレットがHTTPリクエスト/レスポンスを利用して 対話するのを見る 同じサーブレットをGETリクエストで起動してみよう ①Tomcatを起動する ②DOSプロンプトを開く ③C:>telnet localhost 8080 と打って改行 ④GET /examples/servlet/HelloWorldExample HTTP/1.0 と打って改行2回 手順 するとこんなHTTPレスポンスがサーブレットから返ってくる HTTP/1.1 200 OK Content-Type: text/html Date: Wed, 08 May 2002 07:32:58 GMT Server: Apache Tomcat/4.0.1-b1 (HTTP/1.1 Connector) Connection: close <html> <body bgcolor=“white”> ・・・・ <h1>Hello World!</h1> </body> </html> ホストとの接続が切断されました。 クライアントからのリクエストに対して サーブレットが処理した結果を 送信してきたのが分かりましたか?
自分でWebアプリケーションを作る ①Webアプリ用のディレクトリの準備 ②WEB-INFディレクトリを作る ③web.xmlファイルを作る ④プログラム書く ⑤プログラムをコンパイルする ⑥クラスファイルを配置する では、上の手順にそってWebアプリを作成していきましょう
Webアプリの宣言 ・ TOMCAT_HOME/webapps/直下に新しいディレクトリを作る ・ TOMCAT_HOME/webapps/Webアプリ名 ・ Webアプリ名のつけ方に気をつけよう ・ このディレクトリがルートになる ・ http://localhost:8080/Webアプリ名/から このWebアプリにアクセスする TOMCAT_HOME/ webapps Webアプリ名
Webアプリケーションのファイル構成 Webアプリケーションのファイル構成 /Webアプリ名/WEB-INF/classes/ /WEB-INF/lib/ /WEB-INF /web.xml /index.html Webアプリケーションの呼び出し方法 (web.xmlで指定可) ・サーブレットの呼び出し http://ホスト名:ポート番号/webアプリ名/servlet/クラス名 例:http://localhost:8080/examples/servlet/HelloWorldServlet ・index.htmlの呼び出し http://ホスト名:ポート番号/webアプリ名/index.html
プログラムの配置 ・ TOMCAT_HOME/webapps/Webアプリ名以下にWEB-INFディレクトリを作成する ・ その中にコンパイルしたクラスを配置するclassesディレクトリを作る ・クラスファイルを格納するディレクトリ。Web アプリケーションを実行する際にはここがクラスパスに自動的に設定される。作成したサーブレットはここに置く必要がある。 ・ libディレクトリを作る(今回は触れない) Webアプリ名 WEB-INF classes lib
CGIでWebアプリを作ると 例 CGIとサーバサイドJavaでWebアプリを2つ作ってみた・・・何が違うだろう? ファイルの関連性が /public_html taikuLogin.html ファイルの関連性が わかりづらいので 管理が大変 例 englishLogin.html /cgi taiikuLogin.cgi 2個目を作ると・・・ englishLogin.cgi 数多くのファイルが関連するWebアプリの扱いが大変! Webアプリという概念がない CGIは動的なページを作るにとどまる技術
セーブレットでWebアプリを作ると サーバサイドJavaでWebアプリを作る場合、1つのディレクトリに関連するファイルをすべて設置する。そしてそのディレクトリを1つのソフトウェアのように扱う 例 /Taiiku index.html /WEB-INF web.xml Webアプリごとに まとまっているので 管理がしやすい 2個目を作ると・・・ /English index.html /WEB-INF web.xml Webアプリを一つのディレクトリで管理する仕組みがある Webアプリという概念がある サーバサイドJavaはWebアプリを作るための技術
Webアプリの設定 ・ ディレクトリの準備ができたので、このWEBアプリケーションの設定ファイルで あるweb.xml をWEB-INF以下に作成する。 ・ web.xmlを使うとWebアプリごとに決まりごとを設定できる! ・ 具体的には以下のようなものが設定できる ①サーブレットの初期化パラメータ ②セッションコンフィグレーション ③サーブレット/JSPの定義 ④サーブレット/JSPのマッピング ⑤MIMEタイプのマッピング ⑥ウェルカムファイルリスト ⑦エラーページ ⑧セキュリティー ・ 今回設定するのはサーブレットの定義とマッピングです。 Webアプリ名 基本ファイル構成の出来上がり WEB-INF classes lib web.xml
web.xmlファイルを作る サーブレットマッピングとはあるURLにリクエストがあったときに、どのサーブレットを呼び出すか制御することです。 「http://localhost:8080/examples/greeting..html」というURLにリクエストがあったときに「HelloWorldServlet」を呼び出すには以下のように記述します。 <?xml version="1.0" encoding="ISO-8859-1"?> <!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd"> <web-app> <servlet> <servlet-name>HelloWorldServlet</servlet-name> <servlet-class>HelloWorldServlet</servlet-class> </servlet> <servlet-mapping> <url-pattern>/greeting.html</url-pattern> </servlet-mapping> </web-app> サーブレット名と クラスを関連つける サーブレット名と 呼び出すときの URLを関連つける
この設定により、WebアプリのファイルをTomcatのディレクトリ以下に置かなくても良くなる server.xmlファイルをいじる server.xmlをいじることでアプリケーションサーバーの設定もできる。 Tomcatディレクトリ以外のディレクトリに置いてあるWebアプリを実行可能にするには、server.xmlの中の<Host></Host>で挟まれている中にWebアプリの場所等を下記のように記述する。 <Host name="localhost" debug="0" appBase="webapps" unpackWARs="true" autoDeploy="true"> <Context path="/test" docBase="C:\programing\java\test" debug="0"/> </Host> 「pathで指定されたURLがクライアントから要求された際、docBaseで指定されたディレクトリをWebアプリケーションとして実行せよ」という設定になる 上記の追記により、「http://[サーバ名またはIPアドレス]:8080/test/」というURLが要求された場合、「 C:\programing\java\test 」ディレクトリの内容がWebアプリケーションとして実行可能になる。 この設定により、WebアプリのファイルをTomcatのディレクトリ以下に置かなくても良くなる
では実習課題 1.日付を表示するサーブレットを作ってさっきのやり方で簡単なWebアプリを作る ※TOMCAT_HOME/conf/web.xml の273行目と278行目のコメントアウトを消してください 2.自分のWebアプリにトップページを加えてください。上で作ったサーブレットをリンクで呼び出せるようにしてください。HTMLファイルの置き場所に気をつけてください。 3.作成したWebアプリのweb.xmlを修正し、 http://localhost:8080/date/clock.html にアクセスしたらTimeServletが実行されるようにする 上の三つの課題が終わった人は。。。 4.作成したWebアプリをTomcatのディレクトリ以外のディレクトリに 移し、server.xmlを書き換えてブラウザから実行できるように してください。