矢口・清水

Download Report

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
と出力してください)
