第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(); } }
© Copyright 2024 ExpyDoc