Transcript 矢口・清水
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.*;
Servletのimport文
doGetを使ってホームページの表示
HttpServletを必ず継承すること
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("<html> <body>");
out.println("<h1> Hello World </h1> </body></html>");
ファイル操作後にはクローズするのを忘れずに
out.close();
}
}
htmlファイルでは
out.println(“<html> <body>”);で
<html><body>が出力される
out.println(“<h1>HelloWorld</h1></body></html>”);で
<h1> Hello World </h1></body></html>が出力される
htmlの中身
<html><body>
<h1> Hello World </h1></body></html>
実行
http://noisy.cs.dm.u-tokai.ac.jp/~自分のユーザ
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.*;
Dateクラスを利用するのに必要なimport文
public class clock{
public static void main(String argv[]){
System.out.println(new Date());
}
}
日付を格納するためのクラス
Hello.javaを少し変更するだけでできます
import java.io.*;
import java.util.*;
import javax.servlet.*;
import javax.servlet.http.*;
Dateクラスを利用するのに必要なimport文
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("<html> <body>");
out.println("<h1>" + new Date() + "</h1> </body></html>");
out.close();
}
}
日付を格納するクラス
データの入力
入力フォームを利用します。
入力フォームとはHTMLの<form></form>タグ内に
<input>タグなどによる、入力項目やボタンによって
表示される、ホームページの入力画面のことです。
入力フォーム内の<input type =“submit”>ボタンが押
されると、POSTのリクエストが送信され、入力フォー
ム内の入力情報も送信されます。
入力フォームの種類
<input type = “radio”>
ラジオボタン。どれかひとつを選択させます。
<input type = “text”>
テキストフィールド。文字を入力させます。
<input type = “submit”>
このボタンが押されると、POSTのリクエストが送信され、
入力フォーム内の情報も送信されます。
入力フォームのnameとvalue
<input type = “”name = “” value = “”>
nameは属性です。他から参照する時に使い
ます。
valueは値です。
Radio.javaの説明
~ラジオボタンで選んだ情報を表示するプログラム~
3 import java.io.*;
4 import javax.servlet.*;
5 import javax.servlet.http.*;
入力情報を受け取るのでdoPostを使う
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("");
nameがchoiceのvalue
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 }
radio.htmlが必要
radio.javaだけでは動きません。
POSTメソッドを用いたHTMLファイルを適当な
場所に置き、そこからactionタグで呼び出し先
を指定してやる必要があります。
radio.html
~formを用いた入力~
radio.javaのdoPostを実行させる
<html>
呼び出し先の指定
<body>
<form method=“post” action=“http://www.cs.dm.u-tokai.ac.jp/~自分のユー
ザID/servlet/Radio">
<input type=“radio” name=“choice” value=“Excellent”> 優
<input type=“radio” name=“choice” value=“Good”> 良
<input type=“radio” name=“choice” value=“Ok”>可
<input type=“radio” name=“choice” value=“Bad”> 不可
<input type="submit">
</form>
</body>
< /html>
実行
作成した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 {
nameがmynameの
res.setContentType("text/html");
valueの文字列を返している
PrintWriter out = res.getWriter();
out.println("");
String name[] = req.getParameterValues("myname");
nameがpointのvalueの
String point[] = req.getParameterValues("point");
文字列を返している
out.println(name[0] + " has " + point[0] + " point.");
out.println("");
out.close();
}
}
演習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);
リロードされる度に、doGetが呼びだされる
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));
countが増加する
out.println("");
out.close();
}
}
演習4をやってください
演習4
counter.javaにリセットボタンをつけたcounter2.javaを作成せよ。
(ヒント: doGetの本文中に、次のメッセージをブラウザに送る文
を追加する。
<form method=“post” action=“Counter2”>
<input value=“clear” type=“submit”> </form>
後はこのボタンが押されたときの処理を加えればよい。)
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ソースの埋め込み方
<% Javaソース %>:スクリプトレット
ソースは評価されてその結果をテキストとして置き換えます。
<%= Javaソース %>:式
ソースを実行します。簡易に出力する方法。
<%! Javaソース %>:宣言
ソース(の変数名や型などの)宣言します。
『「出力を行うメソッド」の外側』とみなされ、
フィールドやメソッドを記述できます。
headerなどにおきます。
javaソースの埋め込み方
<%@ Javaソース %>:ディレクティブ
JSPの特性を定義します。エンコード方式、Content-type、
クラスのインポート、タグライブラリの指定、外部ファイルの
インクルード指定など。
<%-- Javaソース --%>:コメント
JSPプログラム内のコメントを記述します。
評価と実行の違い
~さっきの時刻の例で説明~
実行
<%= Javaソース %> の場合
HTMLの中に、<%= new java.util.Date() %> をいれるだけ。
Date()を実行された結果が挿入されます。
評価
<% Javaソース %> の場合
HTMLの中に、<% out.println(new java.util.Date()); %>
としなくてはいけない。行末のセミコロンにも注意してください。
つまり
「<%= 変数 %>」は「out.print( 変数 );」
へと置き換えられるということニャ。
Hello.jsp
~Helloを表示するJSP~
<html>
<head><title> JSP Hello </title></head>
<body>
見出しタグに囲まれたHelloは大きく表示される
<h1> Hello </h1>
<% out.println("JSP World."); %>
<% Javaソース %>の形なので、
</body>
out.printlnとセミコロンが必要
実行
jspファイルを
~自分/public_html/Servlet/JSP の下に置くだけです。
※ ~/public_html/Servlet/JSP/ の下に置いたファイルが、
~/JSP/ でアクセスできることに注意してください。
コンパイルが不要で、必要最低限のところにだけ置けば
いいので、Servletよりも手軽です。
ServletでできるものはJSPに変換できる
先ほどのカウントのサーブレットはJSPでは次
のように変換できます。
ディレクディブの宣言
このソースがどういうものか指定
カウントの読み込みと保存を行っている。
<%@ から始まる
count.jsp
<%@ page language="java" contentType="text/html; charset=euc-jp" pageEnc oding="eucjp"%>
<%
int count;
applicationはJSPの
getAttribute(“count”)でcountという名の
if(application.getAttribute("count") == null){
JSP作成時に自動で作成されるオブジェクト。
getAttributeで
暗黙のオブジェクトのひとつ。
count = 0;
オブジェクトを読み出している。
}else{
読み出したオブジェクトは
count = (Integer)application.getAttribute("count")+1;
Object形式になっているので、
}
application.setAttribute("count", count);
int形式にcastしないといけない。
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<body>
setAttributeはgetAttributeの逆で値を保存するメソッド。
これは <% out.print(count); %> というソースの省略形で、
Count = <%= count %>
第1引数は名前。第2引数はその値。
</body>
ローカル変数countの値を表示させる。
この場合は、countという名前に
</html>
<%= Javaソース %>は簡単に出力できる形。
ローカル変数のcountを保存している。
一般的なHTMLのソース。
宿題1
テキストから問7.5の問題
count2.jspを作成せよ。
JSPフォルダに作成してください。
宿題2
テキストフィールドを2つ作り、2つの数字を入
力させ、ラジオボタンで四則演算をさせる、
Shisoku.javaとShisoku.htmlを作成せよ。
(htmlファイルから実行)
宿題3
あなたの名前と好きな人の名前を入力すると、二人
の相性が出力される、Uranai.javaとUranai.htmlを作
成せよ。
(相性の判断は二人の名前の文字数の差で判断させ
てください。
二人の文字数が同じ→saikou
二人の文字数の差が1文字→futuu
それ以外→yokunai
と出力してください)