Servlet 矢口 洋介 清水 麗雄
準備 Java フォルダに入ってから mkdir Servlet ln – s ~/public_html/Servlet. フォルダの移動 cd public_html/Servlet/WEB-INF/classes/*. ファイルのコピー cp ~buhii/public_html/Servlet/WEB-INF/classes/*.
作業する場所 classes フォルダ内に class ファイルが必要 なので、コンパイルは classes フォルダ内 で行うようにしてください。
Servlet サーブレットとは、サーバ側で実行 するためのプログラムです。 リクエストを受け取り、処理をし、 その結果を HTML で返すのが役割です。 import javax.servlet.*; import javax.servlet.http.*; を記述する必要があります。
サーブレットは HttpServlet クラスのサブクラスとして定義する。 public class Hello extends HttpServlet { HttpServlet オブジェクトの主要なメソッド doGet(req, res) doPost(req, res) init(config) 書いて ニャ!
doGet(req, res) サーブレットから一方向にブラウザへ送ります。 ブラウザを表示する時に呼び出されるメソッドです。 GET がリクエストとして渡された時に呼び出されるメソッド です。 ホームページを表示して欲しい、というリクエストを受け取ると、 サーバーはリクエストの URL を元にサーブレットを探し、その doGet() メソッドを呼び出します。 つまり、ホームページを表示する時に呼び 出されるメソッドです。 このメソッドの中に『リクエストの情報を 受け取り、ホームページとしての文字列を 返すか、 JSP を出力する』という処理を記 述するのですニャー。
doPost(req, res) ブラウザから入力を受け取り処理をして返します。 入力フォームに入力された情報を送信する、というリク エストを受け取ると、サーバーはリクエストの URL を元 にサーブレットを探し、その doPost() メソッドを呼び出 します。 つまり、入力フォームに入力された入力情報を送信するメソッ ドだニャー。
init(config) 初期化処理を行うメソッドです。 このメソッドは呼び出すのではなく、呼 び出されるメソッドです。
Hello.java の説明 ~ホームページに Hello World と表示するプログラム~ import java.io.*; import javax.servlet.*; import javax.servlet.http.*; public class Hello extends HttpServlet { public void doGet(HttpServletRequest req, HttpServletResponse res) throws IOException, ServletException { res.setContentType("text/html"); PrintWriter out = res.getWriter(); out.println(" "); out.println(" Hello World "); out.close(); } テキスト形式と指定してい る ファイル操作後にはクローズするのを忘れ ずに HttpServlet を必ず継承する こと Servlet の import 文 doGet を使ってホームページの表示
html ファイルでは out.println(“ ”); で が出力される out.println(“ HelloWorld ”); で Hello World が出力される html の中身 Hello World
実行 自分のユー ザ ID/servlet/Hello で実行してください。 Servlet フォルダにファイルを置いていますが、 s が小文字になることに注意してください。
Servlet では main() メソッドを使わな い 1 つのサーブレットには 1 つの URL が対応し て、その URL が Web ブラウザで実行された 際に、サーバーが該当するサーブレット の doGet() メソッドもしくは doPost() メソッ ドを呼び出しています。 つまり、サーブレットでは doGet() メ ソッド doPost() メソッド内で処理を行って、 Web ブラウザに HTML を出力するの ニャー。 main() メソッドは使わないニャー。
それでは演習1をやってみます 演習 1 Hello.java を改良し、 現在時刻 (new Date()) を表示する Clock.java を書け。
ヒント 現在時刻を表示するプログラ ム import java.util.*; public class clock{ public static void main(String argv[]){ System.out.println(new Date()); } 日付を格納するためのクラス Date クラスを利用するのに必要な import 文
Hello.java を少し変更するだけでできま す import java.io.*; import java.util.*; import javax.servlet.*; import javax.servlet.http.*; public class Clock extends HttpServlet { public void doGet(HttpServletRequest req, HttpServletResponse res) throws IOException, ServletException { res.setContentType("text/html"); PrintWriter out = res.getWriter(); out.println(" "); out.println(" " + new Date() + " "); out.close(); } Date クラスを利用するのに必要な import 文 日付を格納するクラ ス
データの入力 入力フォームを利用します。 入力フォームとは HTML の タグ内に タグなどによる、入力項目やボタンに よって表示される、ホームページの入力画面の ことです。 入力フォーム内の ボタンが 押されると、 POST のリクエストが送信され、入 力フォーム内の入力情報も送信されます。
入力フォームの種類 ラジオボタン。どれかひとつを選択させます。 テキストフィールド。文字を入力させます。 このボタンが押されると、 POST のリクエストが送 信され、入力フォーム内の情報も送信されます。
入力フォームの name と value name は属性です。他から参照する時に使 います。 value は値です。
Radio.java の説明 ~ラジオボタンで選んだ情報を表示するプログラム~ 3 import java.io.*; 4 import javax.servlet.*; 5 import javax.servlet.http.*; 6 7 public class Radio extends HttpServlet { 8 public void doPost(HttpServletRequest req, HttpServletResponse res) 9 throws IOException, ServletException { 10 res.setContentType("text/html"); 11 PrintWriter out = res.getWriter(); 12 out.println(""); 13 String vals[ ] = req.getParameterValues("choice"); 14 for(int i = 0; i < vals.length; ++i){ 15 out.println("names are " + vals[i] + ""); 16 } 17 out.println(""); 18 out.close(); 19 } 20 } 入力情報を受け取るので doPost を使う name が choice の value の文字配列を返している
radio.html が必要 radio.java だけでは動きません。 POST メソッドを用いた HTML ファイルを適 当な場所に置き、そこから action タグで呼 び出し先を指定してやる必要があります。
radio.html ~ form を用いた入力~ 優 良 可 不可 radio.java の doPost を実行させ る 呼び出し先の指定
実行 作成した radio.html を開く。
演習2をやってください 演習2 Radio.html と Radio.java を自分のディレクト リに実装し、 「 Udon 」「 Takoyaki 」 「 Yakitori 」「 Tonjiru 」の選択に変更せよ。 (ヒント Radio.java には手を加えなくても よい)
Eval.java ~文字列を入力するサーブレット~ import java.io.*; import javax.servlet.*; import javax.servlet.http.*; public class Eval extends HttpServlet { public void doPost(HttpServletRequest req, HttpServletResponse res) throws IOException, ServletException { res.setContentType("text/html"); PrintWriter out = res.getWriter(); out.println(""); String name[] = req.getParameterValues("myname"); String point[] = req.getParameterValues("point"); out.println(name[0] + " has " + point[0] + " point."); out.println(""); out.close(); } name が myname の value の文字列を返してい る name が point の value の 文字列を返している
演習3をやってください 演習3 Eval.java に該当する HTML ファイルを自分で 用意して、実行せよ。 (ヒント myname と point (12,13 行目 ) という 名前のテキストフィールドを作る)
値の保存と更新 状態を保存することも Servlet の役割です。
Conter.java ~リロードされるたびに、1つずつカウントするプロ グラム~ import java.io.*; import javax.servlet.*; import javax.servlet.http.*; public class Counter extends HttpServlet { private int count; public void init(ServletConfig conf) throws ServletException{ super.init(conf); count = 0; } public void doGet(HttpServletRequest req, HttpServletResponse res) throws IOException, ServletException { res.setContentType("text/html"); PrintWriter out = res.getWriter(); out.println(""); out.println("Count = " + (++count)); out.println(""); out.close(); } 初期化 リロードされる度に、 doGet が呼びださ れる count が増加する 現在値を保持するクラズ変 数
演習4をやってください 演習4 counter.java にリセットボタンをつけた counter2.java を作成 せよ。 (ヒント : doGet の本文中に、次のメッセージをブラウザに 送る文を追加する。 後はこのボタンが押されたときの処理を加えればよい。)
JSPの準備 フォルダの移動 cd public_html/Servlet/WEB-INF/JSP/*. ファイルのコピー cp ~ragusagi/public_html/Servlet/JSP/*.
JSP ( java server pages ) JSP は Servlet と同様に、ダイナミックな振 る舞いを行うサーバの技術です。 基本形式は HTML と同じですが、ファイル 中に java のプログラムを埋め込むことがで き、 読み込み時に、実行することができます。
Servlet と JSP の違い Servlet と JSP は本体とオブジェクトが対照的です。 Servlet 本体 →java プログラム オブジェクト →HTML を出力 JSP 本体 →HTML ソース オブジェクト →java プログラムを実行
java ソースの埋め込み方 :スクリプトレット ソースは評価されてその結果をテキストとして置き換えま す。 :式 ソースを実行します。簡易に出力する方法。 :宣言 ソース(の変数名や型などの)宣言します。 『「出力を行うメソッド」の外側』とみなされ、 フィールドやメソッドを記述できます。 header などにおきます。
java ソースの埋め込み方 :ディレクティブ JSPの特性を定義します。エンコード方式、 Content- type 、 クラスのインポート、タグライブラリの指定、外部ファイ ルの インクルード指定など。 :コメント JSP プログラム内のコメントを記述します。
評価と実行の違い ~さっきの時刻の例で説明~ 実行 の場合 HTML の中に、 をいれる だけ。 Date() を実行された結果が挿入されます。 評価 の場合 HTML の中に、 としなくてはいけない。行末のセミコロンにも注意してく ださい。 つまり 「 」は「 out.print( 変数 ); 」 へと置き換えられるということニャ。
Hello.jsp ~ Hello を表示する JSP ~ JSP Hello Hello 見出しタグに囲まれた Hello は大きく表示さ れる の形 なので、 out.println とセミコロンが 必要
実行 jsp ファイルを ~ 自分 /public_html/Servlet/JSP の下に置くだけです。 ※ ~/public_html/Servlet/JSP/ の下に置いたファイル が、 ~/JSP/ でアクセスできることに注意して ください。 コンパイルが不要で、必要最低限のところにだけ置 けばいいので、 Servlet よりも手軽です。
Servlet でできるものは JSP に変換で きる 先ほどのカウントのサーブレットは JSP で は次のように変換できます。
count.jsp <% int count; if(application.getAttribute("count") == null){ count = 0; }else{ count = (Integer)application.getAttribute("count")+1; } application.setAttribute("count", count); %> Count = ディレクディブの宣言 このソースがどういうものか指 定 から始まる カウントの読み込みと保存を行って いる。 application は JSP の 暗黙のオブジェクトのひと つ。 JSP 作成時に自動で作成されるオブジェ クト。 getAttribute(“count”) で count とい う名の オブジェクトを読み出している。 getAttribute で 読み出したオブジェクトは Object 形式になっているの で、 int 形式に cast しないといけ ない。 setAttribute は getAttribute の逆で値を保存するメ ソッド。 第1引数は名前。第2引 数はその値。 この場合は、 count という名前に ローカル変数の count を保存している。 一般的な HTML のソー ス。 これは というソー スの省略形で、 ローカル変数 count の値を表示させる。 は簡単に出力できる形。
宿題1 テキストから問7.5の問題 count2.jsp を作成せよ。 JSP フォルダに作成してください。
宿題2 テキストフィールドを2つ作り、2つの 数字を入力させ、ラジオボタンで四則演 算をさせる、 Shisoku.java と Shisoku.html を 作成せよ。 ( html ファイルから実行)
宿題3 あなたの名前と好きな人の名前を入力すると、 二人の相性が出力される、 Uranai.java と Uranai.html を作成せよ。 (相性の判断は二人の名前の文字数の差で判断さ せてください。 二人の文字数が同じ →saikou 二人の文字数の差が1文字 →futuu それ以外 →yokunai と出力してください)