第6章 インターネットアプリケー ション 6.1 インターネットアプリケーション 6.2Java によるネットワーク処理 6.3 電子メール 6.4Web アプリケーション 6.5 チャットアプリケーション
6.4Webアプリケーション 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 , https )
(1)リクエストとレスポンス ■ クライアントからはメソッドと呼ばれる HTTP コマンドで指定し, Web サー バからレスポンスが返却される。 リクエストメッセー ジ リクエスト行 リクエストヘッダ 空行(CR+LF) リクエストボディ レスポンストメッ セージ ステータス行 レスポンスヘッダ 空行(CR+LF) レスポンスボディ リクエスト行例: GET /index.html HTTP/1.0 ステータス行例: HTTP/ OK
代表的なメソッドとステータスコード HTTP1.1 の代表的なメソッド メソッド 機 能 GETURL で指定した情報を取り出す。 POST フォームに入力したデータを送信するなど,サーバにデータを送信する。 HEAD ファイルの最終更新日など, URL で指定したリソースのヘッダ情報を取得する。 PUTURL で指定したサーバ上のファイルを置き換える(アップロードなど)。 DELETEURL で指定したサーバ上のファイルを削除する。 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 サーバ フォームに入力 されたデータ データ処理と HTML ページ の生成 生成された HTMLページ Web クライアント ① GET リクエスト ② POST リクエスト サーバに転送するため記述
HTML 定義例 POST リクエストの例 問合せ : 名前 学年 情報工学科 1 年 情報工学科 2 年 情報工学科 3 年 情報工学科 4 年 質問内容
(3)Servetによるデータ処理 A. その前にCGI( Common Gateway Interface の仕組み) Web ブラウザからのリクエストに対応する処理 を 外部プログラムを動かすことで実現する仕組み Web サーバ 外部プログラムの起動 Contents-type: text/plain Hellow CGI ! 外部プログラム ( perl 処理系) #! c:/perl/bin/perl (空白行) print "Contents-type: text/plain\n\n" print "Hellow CGI !" c:/perl/bin/perl 標準出力 Web クライアントへの出力 Web ブラウザ Hello CGI ! CGI ヘッダの 「 Contents-type: text/plain 」 が取り除かれて出力される (通常 HTML の形式で出力) 標準入力
リクエストメソッド POST と GET のデータ ■ Get の場合 環境変数 QUERY_STRING ■ Put の場合 標準入力からデータ受け取り (文字の長さ:環境変数 CONTENT_LRNGTH ) if($ENV{'REQUEST_METHOD'} eq 'POST'){ read(STDIN,$query, $ENV{'CONTENTS_LENGTH'}); } else { $query = $ENV{'CONTENTS_LENGTH'}; } Perl によるフォームデータ取得の例
CGI から受取るデータの形式 ①コントロール名と入力内容が「 = 」を挟んで1組となり, 「 & 」でつながっている。 ②スペースは「 + 」に変換されている。 ③その他の文字は,先頭に % が付いた 2 桁の 16 進数に変換されている。 r+condition&msg=Haw+are+you%3F%0D%0AThis+is+Yutaka. [取得データの例] name=yutaka 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 オブジェクトを返す。 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()); } [ 例] Enumeration :数え上げ型
(4)文字エンコーディングの指定 エンコーディング : コンピュータで扱う文字を整数値に変換する方式 ① ASCII : 1バイト文字用 ② ISO : 1バイト文字用 ③ EUC ( Extended Unix Code ): 2バイト文字用 ④ Shift JIS : 2バイト文字用 Servlet から送信される HTML コードのエンコーディング方式( ISO )が 表示のエンコーディング方式と異なる [ Servlet のコード実行で, Web ブラウザに送信されたデータが文字化けをする とき]
ISO のコードとして扱われるのを shift JIS として扱う例(その 1/2) import javax.servlet.http.*; import javax.servlet.*; import java.io.*; import java.util.*; public class Sample extends HttpServlet { private String paramName[] = { “ 名前 ”, “ ”, “ 学年 ”, “ 内容 "}; public void doPost(HttpServletRequest req, HttpServletResponse res) throws IOException, ServletException { PrintWriter pw = res.getWriter(); res.setContentsType("text/html; charset=Shift_JIS"); pw.write(" Servlet Application Sample "); pw.write(" "); //HTML フォームで送信されたデータの Shift_JIS への変換 req.setCharacterEncoding("Shift_JIS") Enumeration em = req.getParameterNames(); -----(続く) -----
ISO のコードとして扱われるのを 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(" 送信データの確認 : "); 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) + " 年 "); } else pw.write(paraName[j] + ": " + ht.get(param)+" "); } pw.write(" "); pw.close(); }