Webアプリケーション

第6章 インターネットアプリケーション
6.1
6.2
6.3
6.4
6.5
インターネットアプリケーション
Javaによるネットワーク処理
電子メール
Webアプリケーション
チャットアプリケーション
6.4 Webアプリケーション
6.4.1 WWW
■ WWW(World Wide Web :「 世界中に張りめぐらされた蜘蛛の巣」の意味)
・ 本来は,研究論文の公開・共有を目的としたもの。
・ 商用に使えない制限が外れたため,認証技術や暗号化技術の導入と共にビジネ
ス用としても使えるようになった。
(1)ハイパーテキスト
hyper text
リンク(link)と呼ばれる機構を導入することで,
文書中から別の文書への接続を可能にすることで,
非連続的な文書の閲覧を可能にしたもの。
インターネット上で実現したもの=WWW
記述言語 : HTML(Hyper Text Markup Language)
(2)WWWクライアント
■WWWサーバから受取ったレスポンスデータを表示する機能。
■「ブラウザ(browser)」と呼ばれる。
[例]
NCSA(National Center for Supercomputing Applications)のMosaic
Internet Explorer
Netscape Navigator
(3)WWWサーバ
■サーバ側に保管されている情報をWWWクライアントに提供す
るシステム
[例]Apache
セキュリティ上の配慮から,直接インターネットに接続するのではな
く,クライアントからのリクエストを外部のインターネット上のサーバ
に送る方式も採用されるようになってきた。
代理サーバ(プロキシサーバ:proxy server)と呼ばれる。
(4)HTML
■SGML(Standard Generalized Markup Language)を単純化し
て,タグ方式で処理軽量化を図った言語
書式やリンク指定,組込み画像等をタグで指定する。
6.4.2 HTTP
Hyper Text Transfer Protocol
■ Webページを閲覧する際のプロトコル(Well known port : 80)
■ アクセスする際は,URL(Uniform Resource Locator)を指定する。
■ クライアントからの接続した状態を保持するための機構を「クッキー」という。
[URLの書式構成]
http://www.aaa.bbb.jp/xxx/yyy.html
ドメイン名
プロトコル(http,https)
ファイルのパス名
(1)リクエストとレスポンス
■ クライアントからはメソッドと呼ばれるHTTPコマンドで指定し,Webサーバからレス
ポンスが返却される。
リクエストメッセージ
レスポンストメッセージ
リクエスト行
ステータス行
リクエストヘッダ
レスポンスヘッダ
空行(CR+LF)
空行(CR+LF)
リクエストボディ
レスポンスボディ
リクエスト行例:GET /index.html HTTP/1.0
ステータス行例:HTTP/1.0 200 OK
代表的なメソッドとステータスコード
HTTP1.1の代表的なメソッド
メソッド
機 能
GET
URLで指定した情報を取り出す。
POST
フォームに入力したデータを送信するなど,サーバにデータを送信する。
HEAD
ファイルの最終更新日など,URLで指定したリソースのヘッダ情報を取得する。
PUT
URLで指定したサーバ上のファイルを置き換える(アップロードなど)。
DELETE
URLで指定したサーバ上のファイルを削除する。
HTTP1.1のステータスコード
コード
1XX
2XX
3XX
4XX
5XX
意
味
処理の経過状況等の通知
正常終了
リダイレクト(何らかの別のアクションが必要)
クライアント側のエラー
サーバ側のエラー
ヘッダ情報
ヘッダ情報を読み込むことで,サーバ側,クライアント側で
のバージョン等に応じた処理が可能になる
HTTP1.1の代表的なリクエストヘッダとレスポンスヘッダ
ヘッダの種類
リクエストヘッダ
レスポンスヘッダ
共通ヘッダ
書式
Accept:レスポンスで受取り可能なメディアのタイプ
Host:ホスト名
Referrer:要求元のURL
User-Agent:Webブラウザの種類
Server:Webサーバの種類
Date:メッセージの生成日時
Location:リダイレクトするURL
Cache-Control:キャッシュの指示
Content-Type:メディアタイプ
Content-Length:ボディ部の長さ
6.4.3 ServletによるHTMLフォーム処理
(1)クライアントサイドとサーバサイドの技術
Webアプリケーションは以下のように分類できる。
■ クライアントサイドのアプリケーション
Webブラウザ側で実行されるプログラム。
[例]Javaアプレット,JavaScript
■ サーバサイドのアプリケーション
サーバ側で実行されるプログラム。
[例]Perl/CGI,Active Server Pages, Servlet, JSP
[用語]
Perl : Practical Extraction and Report
CGI : Common Gateway Interface
JSP : JavaScript Pages
(2)HTMLによるフォーム処理
Webページでユーザ入力を受け付ける部分をフォーム(form)という。
Webクライアント
Webサーバ
フォーム
テキストボックス
チェックボックス
フォームに入力
されたデータ
データ処理と
HTMLページ
の生成
ラジオボタン
送信ボタン
サーバに転送するため記述
生成された
HTMLページ
① GETリクエスト
<form method=“GET” action=“GetServlet”>
② POSTリクエスト
<form method=“POST” action=“PostServlet”>
POSTリクエストの例
HTML定義例
<html><head></head><body>
<form action="http://localhost:8080/webap/servlet/WebAp" method ="post">
<h2>問合せ:</h2>
<p>名前<INPUT TYPE="text" SIZE="20" Name="param1"></p>
<p>Email:<INPUT TYPE="text" SIZE="30" Name="param2"></p>
<p>学年<select name="param3">
<option value="1">情報工学科 1 年</option>
<option value="2">情報工学科 2 年</option>
<option value="3">情報工学科 3 年</option>
<option value="4">情報工学科 4 年</option>
</select></p>
<p>質問内容</p><p><textarea name="param4" row="5" cols="60"></textarea></p>
<INPUT TYPE="submit" VALUE="送信">
<INPUT TYPE="reset" VALUE="リセット">
</form>
</body>
</html>
(3)Servetによるデータ処理
A. その前にCGI(Common Gateway Interfaceの仕組み)
Webブラウザからのリクエストに対応する処理を
外部プログラムを動かすことで実現する仕組み
Webサーバ
#! c:/perl/bin/perl
(空白行)
print "Contents-type:
print "Hellow CGI !"
外部プログラムの起動
c:/perl/bin/perl
text/plain\n\n"
標準入力
外部プログラム
(perl処理系)
標準出力
Contents-type:
CGIヘッダの
「Contents-type:
text/plain」
が取り除かれて出力される
Hello CGI !
Webブラウザ
(通常HTMLの形式で出力)
text/plain
Hellow CGI !
Webクライアントへの出力
リクエストメソッドPOSTとGETのデータ
■Getの場合
環境変数QUERY_STRING
■Putの場合
標準入力からデータ受け取り
(文字の長さ:環境変数CONTENT_LRNGTH)
Perl によるフォームデータ取得の例
if($ENV{'REQUEST_METHOD'} eq 'POST'){
read(STDIN,$query, $ENV{'CONTENTS_LENGTH'});
}
else {
$query = $ENV{'CONTENTS_LENGTH'};
}
CGIから受取るデータの形式
①コントロール名と入力内容が「=」を挟んで1組となり,「&」でつながっている。
②スペースは「+」に変換されている。
③その他の文字は,先頭に%が付いた2桁の16進数に変換されている。
[取得データの例]
name=yutaka&[email protected]&subject=About+your+c
ondition&msg=Haw+are+you%3F%0D%0AThis+is+Yutaka.
[意
味]
name=yutaka
[email protected]
subject=About your condition
msg=
Haw are you?[改行]
This+is+Yutaka.
B. CGIを利用しない方法
① Active Server Pages
② Servlet
③ JavaServer Pages
ここでは Servlet について説明する
HttpServlet クラスを拡張する
① HttpServlet クラスは,HTTPを使ったサーブレットに必要な
機能を実装するクラス
② doGet メソッド(WebのmethodがGETのとき)
③ doPost メソッド(WebのmethodがPOSTのとき)
■ protected void doGet(HttpServletRequest req, HttpServletResponse res)
throws ServletException, IOException
HTTPのGETリクエストを処理するとき,このメソッドを実装する。
■ protected void doGet(HttpServletRequest req, HttpServletResponse res)
throws ServletException, IOException
HTTPのGETリクエストを処理するとき,このメソッドを実装する。
引数に使われているHttpServletRequest クラスは, ServletRequest を拡張したクラ
スであり,HTTP用のサーブレットを構築するための機能が提供されている。
HttpServletRequest クラスの代表的なメソッド(その1/3)
① public String getParameter(String name)
親インターフェースの ServletRequest で定義されている。
リクエストパラメータを取得する。
[例]
public class Sample extends HttpServlet {
public void doGet(HttpServletRequest req, HttpServletResponse res)
throws IOException, ServletException {
String val = req.getParameter("name");
}
}
HttpServletRequest クラスの代表的なメソッド(その2/3)
② public String getParameterValues(String name)
親インターフェースの ServletRequest で定義されている。
指定された名前で指定できるリクエストパラメータすべてを取得する。
[例]
public class Sample extends HttpServlet {
public void doGet(HttpServletRequest req, HttpServletResponse res)
throws IOException, ServletException {
String vals[] = req.getParameterValues("name");
if(vals != nulls)
for(int i=0; i<vals.length; i++) out.println(vals[i]);
}
}
HttpServletRequest クラスの代表的なメソッド(その3/3)
② public Enumeration getParameterNames()
親インターフェースの ServletRequest で定義されている。
リクエストに含まれているパラメータ名をStringオブジェクトで構成される
Enumerationオブジェクトを返す。
Enumeration:数え上げ型
[例]
public class Sample extends HttpServlet {
public void doGet(HttpServletRequest req, HttpServletResponse res)
throws IOException, ServletException {
Enumeration names = req.getParameterNames();
while (names.hasMoreElements()) out.println((String)names.nextElement());
}
}
(4)文字エンコーディングの指定
エンコーディング : コンピュータで扱う文字を整数値に変換する方式
① ASCII
② ISO-8859-1
③ EUC(Extended Unix Code)
④ Shift JIS
: 1バイト文字用
: 1バイト文字用
: 2バイト文字用
: 2バイト文字用
[Servlet のコード実行で,Webブラウザに送信されたデータが文字化けをするとき]
Servlet から送信されるHTMLコードのエンコーディング方式(ISO-8859-1)が
表示のエンコーディング方式と異なる
ISO-8859-1のコードとして扱われるのをshift JISとして扱う例(その1/2)
import
import
import
import
javax.servlet.http.*;
javax.servlet.*;
java.io.*;
java.util.*;
public class Sample extends HttpServlet {
private String paramName[] = {“名前”, “E-Mail”, “学年”, “内容"};
public void doPost(HttpServletRequest req, HttpServletResponse res)
throws IOException, ServletException {
PrintWriter pw = res.getWriter();
res.setContentsType("text/html; charset=Shift_JIS");
pw.write("<head><title>Servlet Application Sample</title></head>");
pw.write("<body>");
//HTMLフォームで送信されたデータのShift_JISへの変換
req.setCharacterEncoding("Shift_JIS")
Enumeration em = req.getParameterNames();
-----(続く) -----
ISO-8859-1のコードとして扱われるのをshift JISとして扱う例(その2/2)
-----(前シートから続く) -----
//POSTされたパラメータと値の格納
Hashtable ht = new Hashtable();
while (em.hasMoreElements()){
String param = "param" + String.valueOf(j+1);
String value = req.getParameterValues(name)[0];
ht.put(name,value)
}
pw.write("<h2>送信データの確認:</h2><br>");
for(int j=0;j<paraName.length; j++) {
String param = "param" + String.valueOf(j+1);
if(j==2) {
pw.write(paraName[j] + ": " + "情報工学科" + ht.get(param) + "年<p>");
}
else pw.write(paraName[j] + ": " + ht.get(param)+"<p>");
}
pw.write("</body></html>");
pw.close();
}
}