注意
このページには、insertというエラー回避があるので注意
サーブレット間の連携
1)インクルード: 他のサーブレットの処理をインクルードする方法
他のサーブレットに処理を委譲する。
引数には委譲先のファイルやサーブレットのパスを指定(相対パス)
String disp = "/includetest"; RequestDispatcher dispatch = request.getRequestDispatcher(disp); dispatch.include(request, response); //includetestの処理が終わると、ここに戻ってくる
2)フォワード: 他のサーブレットに処理を移す方法
インクルードに似ているが、呼び出し元に戻ってこない。
完全に処理を移す場合に利用する。
クライアント側はページを移ったことに気づかない
String disp = "/forwardtest"; RequestDispatcher dispatch = request.getRequestDispatcher(disp); dispatch.forward(request, response);
3)リクエストへの属性追加
フォワードする際に、フォワード元のリクエストは引き継がれるが、
そこにさらにリクエストの属性を追加することができる。
フォワード元でrequest.setAttribute("名前", "値"); フォワード先でrequest.getAttribute("名前")で取得 取得した値は(String)などでキャストして使う
HTMLから受け取った値を判定して、
他のサーブレットに結果を反映させるなどの使い方が考えられる
4)リダイレクト
フォワードに似ているが、フォーワードはサーバー内でページを移るが、
クライアントに別のページに移るように指示を出すだけ。
クライアントはページを移ったことがわかる。
また、リクエストを移動先ページに渡すことはない
したがって、用途はエラーページに飛ばすなどの処理に使われる。
メリットとしては、フォワードは同一サーバーにしか飛ばせないが、
リダイレクトは別のサーバーのURLへ飛ばすことも可能。
String url = "/dispatch/redirecttest"; response.sendRedirect(url);
JDBCドライバ
JDBCとは、Javaでデータベースを扱う場合に使用するAPIで
データベースを操作するためのファイルやクラスの集まり(JAR)
Mysql用のJDBCなどというように、データベースによってJDBCがあるが、
JDBC自体には共通のAPIでアクセスできるので、
プログラムの可搬性があがる
JDBCのインストールや使い方
http://www.javadrive.jp/servlet/database/
JDBCドライバのロード
try {
Class.forName("com.mysql.jdbc.Driver").newInstance();
}catch (ClassNotFoundException e){
}catch (Exception e){
}
Classクラスで、Javaのクラスを表すことができる。
forNameメソッドで任意の名前のクラスを指定できる。
そして、指定した名前のクラスを作るには、
newInstanceメソッドをもちいる
データベースへの接続
getConnectionメソッドを用いてデータベースに接続する。
"jdbc:mysql://(サーバー名)/(データベース名)"を指定する
Connection conn = null;
String url = "jdbc:mysql://localhost/jdbctestdb";
String user = "testuser";
String password = "testpass";
try{
conn = DriverManager.getConnection(url, user, password);
// データベースに対する処理
}catch (SQLException
データベースとの切断(Closeメソッド)
Closeを呼ばなくても、ガーベージクレクタで切断されるが、
セキュリティのために速やかに切断する。
切断を忘れないようにするため、finally文中に記述する
Connection conn = null;
String url = "jdbc:mysql://localhost/jdbctestdb";
String user = "testuser";
String password = "testpass";
try{
conn = DriverManager.getConnection(url, user, password);
// データベースに対する処理
}catch (SQLException e){
// 例外処理
}finally{
try{
if (conn != null){
conn.close();
}
}catch (SQLException e){
// 例外処理
}
}
mysqlの使用データベースの設定
use (データベース名)で使用するデータベースを設定できる。
データベースを設定しておけば
select * from price のようにしてデータを取得できる。
データベースを設定していない場合は
select * from goods.price
のように(データベース名).(テーブル名)の形式で設定すれば取得可能
また、接続時に
mysql -u root -p (データベース名)
とすれば、そのまま目的のデータベースに接続できる
接続中のデータベースは
select database();
で確認できる
show databases;
は登録されているデータベース一覧を取得するコマンドなので混同注意!
データベースの削除
drop database (データベース名)
でデータベースの削除
mysqlに日本語でInsertできない場合
英語でテーブルにデータをinsertすることは可能だが、
日本語で挿入すると失敗する場合の対処法
http://d.hatena.ne.jp/tacohachi/20100128/p1
JDBCからのSELECT(データの取得)
conn = DriverManager.getConnection(url, user, password);
Statement stmt = conn.createStatement();
String sql = "SELECT * FROM kabukatable";
ResultSet rs = stmt.executeQuery(sql);
のようにしてexecuteQueryメソッドにて取得する。
数値ならば、 rs.getInt("名前");
文字列ならば、rs.getString("名前");
のようにして取得する。
すべてのデータを取得するときは
while( rs.next() ){
...
}
のようにして取得する。
rs.close(); //Resultsetのclose
stmt.close(); //ステートメントのclose
ステートメントやResultsetもcloseしてリソースを解放するべし
もちろん、前述の接続のcloseも必要
データの更新(UPDATE)
データを取得するときは、executeQueryメソッドをもちいるが、
データの更新や削除、追加の場合は結果として何か受け取るわけではない。
このような場合は、executeUpdateメソッドをもちいる。
conn = DriverManager.getConnection(url, user, password);
Statement stmt = conn.createStatement();
String sql = "update kabukatable set company='楽天(株)' where code = 4755";
int num = stmt.executeUpdate(sql);
データの追加(INSERT)・削除(DELETE)
更新のときと同じく、executeUpdateメソッドをもちいる。
データベースに送信するSQL文が異なるだけ。
高速化
prepareStatementは、Statementと同じく
データベースに対するSQL文を実行するために使われるが、
事前にコンパイルされていて高速に動作する。
事前にコンパイルされているが、変更の可能性がある個所を指定して、
後からパラメータとして、指定することも可能である。
String sql = "insert into kabukatable (basho, company) values (?, ?)";
PreparedStatement pstmt = conn.prepareStatement(sql);
pstmt.setInt(1, "東証");
pstmt.setString(2, "ドコモ");
int num = pstmt.executeUpdate();
pstmt.setString(2, "KDDI"); //2番目のパラメータのみ変更
上記のように、' ? 'を用いてパラメータの個所を指定する。
'?'を付けた順番に1,2,...と番号が割り当てられる。
さらに、setXXXがパラメータをセットしている部分である。
また、パラメータの1番目は変更の必要がないので、改めて設定する必要がない