情報システム科
Java サーブレッド・JSP
サンプル
目次
Java技術情報
Visual Age for Javaの使い方
TCPソケット
HTTP
CSSとJavaScript
CGI
クッキー
サーブレット
JSP
JavaBeans
JDBC
Java技術情報
Java技術情報
http://jdc.sun.co.jp/
J2SE JavaTM 2 Platform, Standard Edition, 1.4.0 API 仕様
http://java.sun.com/j2se/1.4/ja/docs/ja/api/index.html
J2SE Java 2 Platform Standard Edition Version 1.4
http://java.sun.com/j2se/1.4/ja/
J2SE JavaTM 2 SDK ドキュメント
http://java.sun.com/j2se/1.4/ja/docs/ja/index.html
J2EE JavaTM 2 Platform Enterprise Edition, v 1.4 API Specification
http://java.sun.com/j2ee/1.4/docs/api/
J2EE Java Servlet テクノロジ
http://java.sun.com/j2ee/ja/servlet/index.html
J2EE JSP
http://java.sun.com/j2ee/ja/jsp/
J2EE JDBC
http://java.sun.com/j2ee/ja/jdbc/index.html
JavaBeansTM Component API
http://java.sun.com/j2se/1.3/ja/docs/ja/guide/beans/
Java Beans
http://java.sun.com/products/javabeans/index.html
Java 2 SDK インストールガイド
http://java.sun.com/j2se/1.4/ja/install-windows.html
Visual Age for Javaの使い方
ワークベンチ ソースコード等をツリー形式で統合管理
・ソースコードは専用エディタで編集
フィールドやメソッドがツリー
保存するだけでコンパイル
・リポジトリ
ソースコードはリポジトリと呼ばれるデータベースに
インポート
エクスポート
・プロジェクト
開発単位を「プロジェクト」という単位で管理
・プログラム作成
Window、Workbench
3段目、AddNew or Exiting Project to Workspace
3段目、Create class、Class nameに
・エディタ
4段目、Project、目的のクラスをダブルクリック
修正し
終了、Edit、Save
・デバック
3段目、Run、別のウィンドが開く、Console、そのoutputに実行結果が
TCPソケット
TCPソケットとは、TCP/IPのTCP層が提供する、クライアント・サーバー型のストリーム通信のための機構。
TCPソケットは、サーバーが「口をあけて」待機している状態のところに、クライアントが「接続」し、データの送受信を行う。
クライアント サーバ
bind
Listen
connect---------->
accept
write------------>
read
処理
<------------write
read
close
クライアントがサーバに接続(connect)して、サーバーが受け入れ(accept)た時点から通信が開始します。その後、どちらがreadするのか、どちらがwriteするのか、プログラムを作る人が自由に決められます。この順序(会話手順)の事を「プロトコル」と呼びます。
TCPソケットは、1つのサーバー上で、複数の受け口として宣言(bind)及び待機(listen)することが出来ます。この時、どれにアクセスするかを認識しなければならないので番号が振られます。この番号のことを「ポート番号」と呼びます。
特定の(例えば80番の)ポート番号を宣言(bind)して待機(listen)することが出来るプロセスは、コンピュータ上で1つだけです。
HTTP
Web、すなわちWWW(World Wide Web)の基本はHTTP(Hyper Text Transfer Protocol)とHTML(Hyper Text Markup Language)です。
HTTPサーバーは、TCPソケットのポート(通常80番)をオープンして待機します。HTTPのクライアントはポート80のソケットに接続(connect)し、HTTPリクエストと言うデータを送信します。HTTPリクエストには、OPTIONSメソッド、GETメソッド、POSTメソッドなどの種類があります。
最もよく使われるHTTPリクエストは、HTTPサーバに対してファイルの送信を要求する「GETリクエスト」です。クライアントがHTTPリクエストを送信すると、HTTPサーバがHTTPレスポンスを返します。そこで、クライアントがソケットを閉じて1回のやり取りが終了します。
クライアント サーバ
HTTP GETリクエスト---------->
<-----------レスポンス
通常、1回のリクエストでは1つのコンテンツしか送信されません。
HTMLでは、<IMG src="image.gif">のように記述して、画像を表示することが出来ます。
このようなコンテンツの場合、GETリクエストが2回発行されます。
最初のリクエストでHTMLファイルがWebブラウザに送信されます。次に、WebブラウザがHTMLを解析します。<IMG>タグの部分でimage.gifと言うファイルが別途必要だとわかるので、もう一度GETリクエストを出してそれを取りに行きます。
CSSとJavaScript
CSS(Cascading Style Sheet)は、HTMLの各タグに関連付けられた書式属性です。
例えば、<H1>タグなら、どのフォントで、何ポイントで、何色で表示するかと言う、属性です。
例えば、HTMLのBODYの直前に次の数行を加えます。
<STYLE type="text/css">
<!--
H1{ color : blue; }
-->
</STYLE>
すると、HTMLの<H1>タグで囲まれた文字がすべて青で表示されます。
スタイルシートは、以下のように記述することで、別のファイルに記述しておくことも出来ます。
<LINK href="/Master.css" rel="stylesheet" type="text/css">
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
JavaScriptは、HTMLなどのコンテンツ内に記述できるスクリプト言語(プログラミング言語の一種)です。HTMLに記述する場合は、<SCRIPT>タグで囲みます。HTMLに記述されているJavaScriptは、Webブラウザにソースコードの状態で送信され、Webブラウザがそれを解釈して実行します。
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
cssの属性は、Javascriptなどで動的に変更することが出来ます。例えば、以下のHTMLコードをWebブラウザに表示し、ボタンを押します。
<HTML><BODY>
<SCRIPT language="JavaScript">
function chgClr(){
document.bgColor="blue";
}
</SCRIPT>
<H1>JavaScript</H1>
<FORM>
<INPUT type="button" value="色の変更" onclick="chgClr();">
</FORM></BODY></HTML>
これは、<BODY>タグを意味するdocumentオブジェクトのbgcolor(背景色)属性をJavaScriptで書き換えています。ボタンを押すと「onclick」イベントが発生し、そのイベントがchgClr()メソッドへ伝えられます。JavaScriptで書かれたchgClr()メソッドでは、documentオブジェクトのbgClolor属性をblueに変更するので、ボタンが押されたとき、背景色が青色に変わります。
CGI
CGI(Common Gateway Interface)は、通常、HTTPリクエストがHTTPサーバーに送られてくると、そのURLに従ってファイルが検索され、該当するファイルが送信されます。
CGIのほとんどは、Perlというスクリプト言語で記述されています。
クッキー
クッキー(cookie)は、Webブラウザの稼動するコンピュータに、サーバプログラムが少しだけデータを保存できるようにした仕組みです。
本来、Webブラウザが動作するコンピュータ(クライアント)のハードディスクにサーバプログラムがアクセスすることは出来ませんでした。これは、サーバプログラムがクライアントを攻撃することを防ぐためです。
ところが、この制限のために「クライアントを識別する」とか、「前にアクセスした最後のページ」という情報を管理するのが困難になってしまっています。そこで、いくつかの制限付きで「サーバプログラムがクライアント上にデータを保存できる仕組み」が提供されるようになりました。これがクッキーです。制限と言うのは以下のものです。
1.テキストのみが保存できる。
2.Webブラウザ全体で300個まで、1つにつき4096バイトまで、ホストサーバーごとに20個までしか保存できない。
3.別のサーバが保存したデータは読み出すことが出来ない。
4.名前をつけて保存できるが、保存する場所はWebブラウザによって決まっている。
HTTPサーバが、HTTPレスポンスにクッキー情報を入れて送信することでクッキーを書き込むことが出来ます。一度書きこまれたクッキーは、そのHTTPサーバへ送られるHTTPリクエストに常に添付されます。ですから、あまり大量のデータをクッキーに書き込んでしまうと、毎回のデータが増えてしまうことになります。
通常、クッキーはWebブラウザを終了すると消えてしまいます。延命することも出来ます。
サーブレット
Tomcatのセットアップ
Tomcatダウンロード
Tomcat 3.3
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
環境変数の設定
JAVA_HOME c:\j2sdk1.4.0
TOMCAT_HOME c:\jakarta-tomcat-3.2.3
CLASSPATH c:\jakarta-tomcat-3.2.3\lib\servlet.jar;.
コンテキストパスを設定
サーブレット・JSPのURLを設定
@Confディレクトリのserver.xmlをテキストエディタで編集
Acontextmanager
Bファイルを配置
Tomcatをインストールしたディレクトリ−−webapps\YJKS
CJSP,HTML webapps\YJKS\06\Sample1.jsp
Dサーブレット webapps\YJKS\06\WEB-INF\classes\Sample1.class
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
TOMCAT起動
c:\jakarta-tomcat-3.2.3\bin\startup
TOMCAT終了
c:\jakarta-tomcat-3.2.3\bin\shutdown
サーブレッドの実行(Webブラウザ)
http://localhost:8080/YJKS/06/servlet/Sample1
JSPの実行
http://localhost:8080/YJKS/06/sample1.jsp
HTMLの実行
http://localhost:8080/YJKS/06/sample1.html
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
サーブレットの動作
サーブレットの例
・TOMCATの起動
・Webブラウザでサーブレッド実行
サーブレッドは、ユーザーから始めてリクエストを受け取ったとき、1度だけ起動し、その後はスレッド(thread)で処理。
→高速で、同時に多くのユーザーが訪れても、すばやく対応。
サーブレットのメソッド
init() サーブレットが読み込みされた時
service() サーブレットが呼び出された時
doGet() GETリクエストを受け取った時
doPost() POSTリクエストを受け取った時
destroy() サーブレットが終了する時
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
サーブレットをフォームから実行
例 Sample2.html
例 Sample2.java
getParameter()メソッド
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
セッション管理
セッション管理の例
一人のユーザーがWebサイトにやってきてから立ち去るまでの行動を管理。
セッションを設定
HttpSession hs = request.getSession(true);
getAttribute :セッションに設定されている値を取得
Integer cn = (Integer) hs.getAttribute("count");
Date dt = (Date) hs.getAttribute("date");
setAttribute :セッションに名前と値を設定
hs.setAttribute("count", cn);
hs.setAttribute("date", dt);
Webクライアント Webサーバ
クッキー<----------セッションID(セッションIDを割り当てる)
クッキー --------->セッションID(セッションIDを確認してユーザを判別)
Webブラウザを終了した場合や、一定時間が経過した場合、終了したものとみなされる。
サーブレットの処理ルーチンとなるサービスメソッド
service()
doGet()
doPost()
URL再書き込み
クッキーを使うセッション管理では、Webブラウザがクッキーを使用しない設定にしていると、セッション管理が上手くいきません。
このとき、「URL再書き込み」という方法があります。
http://hostname/servlet/MyServlet$sessionid=XXXXXXXXX
SSLという暗号化技術を使うときは、暗号化の対象にならないので、向いていない。
JSP
例 Sample2.html
例 Sample2.jsp
JSP(Java Server Pages)は、HTML文章中にコードを埋め込む。
サーブレットは、コードの中にHTML文書を埋め込む。
JSPファイルはディレクトリに保存されていて、サーバーから読込まれると、いったんサーブレットに変換され、コンパイルされてから実行される。コンパイルされた後は、サーブレットと同じ動作になる。ソースファイルが更新されない限り、再コンパイルは行われない。このため、スプリクティングを使うような技術であるにもかかわらず、短いレスポンスタイムを実現できる。
JSPの書式
スクリプトレット(scriptlet):javaのコードを記述
<%・・・%>又は
<jsp:scriptlet>・・・</jsp:scriptlet> XMLの書式
宣言(declaration):変数やメソッドなどを宣言
<%!・・・%>又は
<jsp:declaration>・・・</jsp:declaration> XMLの書式
式(expression):式を評価して文字列とする
<%=・・・%>又は
<jsp:expression>・・・</jsp:expression> XMLの書式
ディレクティブ(directive):インポートを行う
<%@page import="クラス名"%>又は
<jsp:directive.page import="クラス名"/> XMLの書式
ディレクティブ(directive):Webブラウザに送られる文書のコンテンツのタイプを設定する
<%@page contentType="コンテンツタイプ"%>又は
<jsp:directive.page contentType="コンテンツタイプ"/> XMLの書式
アクション(action)
リクエストを転送する
<jsp:forword page="転送先のURL"/>
ファイルを読込む
<jsp:include page="読込むファイルのURL"/>
JavaBeansを使う
<jsp:useBean id="変数名" class="Beanのクラス"/>
オブジェクトのデータを設定する
<jsp:setProperty name="変数名" property="データ名" value="値"/>
オブジェクトのデータを取得する
<jsp:getProperty name="変数名" property="データ名"/>
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
暗黙のオブジェクト(implicit Object)
request:<%String tmp = request.getParameter("cars");・・・
オブジェクト名 オブジェクトの内容 インターフェイス
request リクエスト HttpServletRequest
response レスポンス HttpServletResponse
session セッション HttpSession
out 出力ストリーム PrintWriter(JSPWriter)
pageContext このJSPページ PageContext
application 同じWebページアプリケーション内のサーブレット・JSP
ServletContext
cojfig このJSPページの初期設定
ServletConfig
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
場合に応じたWebページ
<% if(carname.length() != 0){ %>
<%= carname %>のお買い上げありがとうございました。<br>
<% } else{ %>
入力してください。<br>
<% } %>
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
JSPページにHTML文書を埋め込む
・サーブレットがリクエストを受け取った時、HTML文書の埋め込みが行われる。
<jsp:include page="company.html" flush="true" />
・JSPが最初にサーブレットのコードに変換されるときに、文書を埋め込む。
<%@ include file="company.html" %>
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
JSPとサーブレットとの連携
リクエスト
−−−−−−>サーブレット−−−>JSP
−−−>HTML
・リクエスト Sample5.html
<form action="http://localhost:8080/xxx/servlet/Sample5" method="GET">
・サーブレット Sample5.java
String carname = request.getParameter("cars");
ServletContext sc = getServletContext();
if(carname.length() != 0){
sc.getRequestDispatcher("/Sample5.jsp")
.forward(request, response);
}
else{
sc.getRequestDispatcher("/error.html")
.forward(request, response);
}
・JSP Sample5.jsp
<% String tmp = request.getParameter("cars");
String carname = new String(tmp.getBytes("8859_1"), "JISAutoDetect"); %>
<%= carname %>のお買い上げありがとうございました。<br>
JavaBeans
JavaBeansという仕様にしたがって、コンポーネントを作成。
@Serializableインタフェース実装
A引数なしのコンストラクタをもつ
Bフィールドをクラスの外部から直接アクセスできないように修飾子をつける。
Cフィールドの値を設定・取得するために決まった名前のメソッドを使う。
プロパティの設定・・・setプロパティ名
プロパティの取得・・・getプロパティ名
Beanを設定 Beanから結果を取得
リクエスト−>サーブレット−−−−−>Bean−−−−−−−−−>JSP
リクエストの転送
−−−−−−−−−−−−−−−−−>
サーブレット
//Beanの作成
CarBean cb = new CarBean();
cb.setCarname(carname);
cb.makeCardata();
//Beanをリクエストに設定
request.setAttribute("cb", cb);
//リクエストをJSPに転送
sc.getRequestDispatcher("/Sample6.jsp")
.forward(request, response);
Bean
//Cプロパティの設定・・・setプロパティ名
public void setCarname(String cn)
{ carname = cn; }
//Cプロパティの取得・・・getプロパティ名
public String getCardata()
{ return cardata; }
public void makeCardata()
{ cardata = "車種:" + carname; }
JSP
<%@ page contentType="text/html; charset=Shift_JIS" %>
//id="cb":Beanオブジェクトをさす変数
//class="CarBean":Beanの準備をする
<jsp:useBean id="cb" class="CarBean" scope="request" />
//Bean結果を取得
<jsp:getProperty name="cb" property="cardata" />
Beanを利用するためのJSPアクション
タグ 属性
<jsp:useBean /> id="Beanオブジェクトをさす変数名"
サーブレットで設定したBeanの名前
type="Beanオブジェクトの型"
class="Beanのクラス"
scope="Beanのスコープ"
<jsp:getProperty />
name="Beanオブジェクトをさす変数名"
property="プロパティ名"
<jsp:setProperty />
name="Beanオブジェクトをさす変数名"
property="プロパティ名"
value="プロパティに設定する値"
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
JavaでWebサイトを構築する。
・サーブレット・・リクエストの受付を担当
・Bean・・・・・・定型的な処理を担当
・JSP ・・・・・Webページの表示を担当
JDBC
データベース(database)
java.sqlパッケージ
SQL(Structured Query Language)
JDBCドライバ(JDBC driver)
JavaプログラムーーJDBC-ODBCーーーーーーODBCーーーーーdb
ブリッジドライバ ドライバ
Microsoft社のODBC
(Open Database Connectivity)
ODBCデータソースの設定
@スタート、設定、コントロールパネル、管理ツール、データソース(ODBC)
A追加
BMySQL ODBC Driver(Microsoft Access Driver)
Cデータソース名
JDBCドライバ
タイプ1:JDBC-ODBCブリッジドライバ (今回)
タイプ2:ネイティブブリッジドライバ
タイプ3:ネットプロトコルドライバ
タイプ4:ネイティブプロトコルドライバーー本格的
@JDBCドライバを読込んでドライバマネージャに登録
//JDBCドライバを読込む
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
Aデータベースに接続
Connection cn = DriverManager.getConnection
("データソース名","ユーザ名","パスワード");
//問い合わせの準備
Statement st = cn.createStatement();
String qry = "SELECT * FROM 車表";//SQL文を用意
BSQL文による問い合わせ
ResultSet rs = st.executeQuery(qry);
Cデータの取得
ResultSetMetaData rm = rs.getMetaData();
int cnum = rm.getColumnCount();//列数を取得
//1行ずつ取得
rs.next()
rm.getColumnName(i)
rs.getObject(i)
Dクローズ
rs.close();
st.close();
cn.close();
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
SQL
表の表示
SELECT * FROM 表;
データの追加
INSERT INTO 表 VALUES(5,'タクシー');
データの削除
DELET FROM 表 WHERE 名前='トラック';
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
Webとデータベース
┏━━━━━━┓
┃データベース┃
┗━━━━━━┛
↑│データベースに問い合わせ
││
Bean │↓ Beanから
┏━━━━━━┓を設定 ┏━━┓ 結果を取得 ┏━━┓
リクエスト─→┃サーブレット┃───→┃Bean┃──────→┃JSP ┃
┗━━━━━━┛ ┗━━┛ ┗━━┛
│ リクエストの転送 ↑
└────────────────────┘
参考資料
かんたん サーバサイド Java
米持幸寿著
翔泳社発行
2001年12月18日
やさしいJava活用編
高橋麻奈著
ソフトバンクパブリッシング発行
2002年6月1日
ホームへ