独習Javaサーバサイド編第2版 第6章まとめ
●サーブレットの必要性
アプリケーションを構築する場合、ただ動けば良いのではなく、長期的に修正したり改造したりすることを考慮し、メンテナンスしやすいコードを書く必要がある
そのキーとなるのがサーブレットである
●暗黙オブジェクト
●サーブレットの骨格
java.io,javax.servlet,javax.servlet.httpパッケージは必須
javax.servletおよびjavax.servlet.httpパッケージに属する4つのクラスはJSPでは自動的にインポートされるがサーブレットでは明示的にする必要がある
HttpServletクラスを継承すること
サーブレットがクライアントと通信を行うための最低限の手続きを定めた基本クラス
サーブレットの起点はdoXxxxxメソッド
サーブレットのエントリポイントとなるメソッド
エントリポイント とはクラスが呼び出されたタイミングで最初に実行されるメソッド
一般的によく使うのはdoGetかdoPostメソッド
protected void doXxxxx(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException
request:リクエスト情報
response:レスポンス情報
リクエストの実処理を定義する
XxxxxはGet,Post,Delete,Head,Options,Put,Traceのいずれか
@WebServletアノテーションを宣言する
サーブレットを呼び出すためのパス(URL)を宣言する
引数には呼び出しのパスを、アプリケーションルートからの絶対パスで指定
サーブレットをフォームから起動する
直接URLを指定してページを要求するとき、クライアントはサーバに対してGETという要求メソッドを送信している
その場合呼び出されたサーブレットはまずdoGetというメソッドを実行する
JSTLをダウンロードしたところ
http://jstl.java.net/download.html
教科書ではこれからダウンロードってなっていたのだけれど
行ってみたらなんかsorryってなっていたので調べることに。
よくわからぬままここから頂いたけど動作に問題はないので大丈夫だと思う
最新バージョンもあるみたいだけどとりあえず教科書に合わせてver1.2.1
・javax.servlet.jsp.jstl1.2.1.jar
・javax.servlet.jsp.jstl-api-1.2.1.jar
この二つをダウンロードした
https://mvnrepository.com/artifact/org.glassfish.web/javax.servlet.jsp.jstl/1.2.1
ダウンロード後はEclipseのプロジェクトのWEB-INF/libってとこにふたつとも置いて完了
MySQLの起動ができなくなった時と文字化けが起こったときすること
ターミナルで起動できないとき
-rw-r----- 1 _mysql admin(ここの権限を変える(これは変えた後のやつ) 71283 6 6 20:03 マシン名.local.err
sudo chown -R 名前:admin /usr/local/var/mysql/マシン名.local.err
ググったり、何してもわからなかったらここを見る
ここにはエラーのログがかいてある
ここに書いてあるエラー内容をみて調べる
sudo vim /usr/local/var/mysql/マシン名.local.err
文字化けについて
参考にした記事
mysqldにつては「default-character-set=utf8」から「character-set-server=utf8」に変更されたらしいので注意が必要 *http://qiita.com/WizowozY/items/5d7224be92aa8364a42a から引用
環境設定やり直しを振り返る
つい最近EclipseMarsの設定をしたのにTomcatとの関係がうまくいかなくて今日すべてやり直しました。
だからこの前書いた記事はボツだね。
あ、でも自分の役には立ってるのだけど。今回も見直したし。
Eclipseの環境設定欄のserverランタイム設定するとこがでなくなったり
コマンドプロンプトからだとTomcatが起動できるのにEclipseからだとできなかったり
わけがわからなくなったから、もうEclipse新しいのダウンロードしちゃおうってなって
どうせならMac版のpleiadesAllinoneがでたみたいだからそれを使って
再び設定を試みた。
Allinone版だと日本語にする作業も省けるし
Tomcatも入ってるぽい(ぽいんだけど環境設定のとこにTomcatの欄はなくて、結局serverランタイムでは、この前ダウンロードして/Library/Tomcatに置いておいた8.0.44を使って設定した)
ランタイムの設定は前うまくいかなくてつまずいたとこだったから、とりあえず少し進んだのでした。
でもなんかTomうまく動いてくれない。
起動はしてくれる・・。
相談してみたら、この記事を読みながら設定してくださった。
プロジェクト作るとこからなんか違うことしちゃってたみたいで
新しいプロジェクトをこれにそって作ったらうまく動いてくれた。
ここ最近ずっと環境構築でつまずいていたから少し進んで本当によかった〜
自分で調べるのも大事だけど、何時間もそこでつまずくようならやり方を変えたほうがいいよと教えてもらった。
例えば今回だったら、一時間調べても解決できなかったらmarsでずっと頑張るんじゃなくて、一からインストールしなおすとかバージョンを変えてみるとか。
仕事をするようになったり、できるようになってきても、理由がわからんことでつまずくことはあるらしくて(時間がたつとわかることもある)、そういうときは抜け出すのにすごく苦しむって。
今回みたいにバージョン変えられたらいいけど、それできないこともたくさんあるだろうしね、大変。
Eclipse苦手になりそうだったけど(最初から好きではない)コマンド操作も結構使えたし今回は良い勉強になったかな!
まだ他の章でも環境設定ありそうだからまたつまずくだろうけどがんばろ〜。
独習Javaサーバサイド編第2版 第5章まとめ
・JSTL
アクションタグ はJSPページからプログラム的な要素のほとんどを取り除き、ソースコードを簡略化する
アクションタグと式を組み合わせることでJavaに精通していない人でもJSPページを記述できるようになる
アクションタグを駆使したコーディングを行う場合、JSTLの導入が必要になる
自分で個別に用意したタグのことを カスタムタグ という
カスタムタグをライブラリ形式でまとめたものを タグライブラリ という
JSTLは特に標準的なカスタムタグを集めたもの
JSTLはJava標準化組織であるJCPでJSRとして承認されたもので、近年はスクリプティング要素主体のJSPページ開発から、JSTLを使用した開発に主流がうつっている
・変数の出力をJSTLで表現する
<%@ taglib prefix="カスタムタグの接頭辞" uri="タグライブラリ識別のURI" %>
JSPページで使用するタグライブラリを有効化する
・式言語(EL式)
指定された式の値をより簡単に出力できる
${任意の式}
指定された式の値を出力する
特徴
・与えらえた式を評価し出力することがすべて
・データ型の制約が緩い
・あいまいな式の記述が可能
・Javaの知識がなくても記述できる
・Coreタグライブラリ
変数の設定/出力から条件分岐、繰り返し処理など、Javaの基本的な制御構文を代替するライブラリ
・スコープ変数を設定する(ある決められた範囲で有効な変数のこと)
・ページスコープ
・リクエストスコープ
・セッションスコープ
・アプリケーションスコープ
などがある
値はvalue属性または要素配下のテキストとして指定できる
value属性と要素本体とはいずれか片方しか指定できない
・変数の値を出力する
・単純分岐を実装する
・多岐分岐を実装する
・繰り返し処理を行う
・Mapの内容を列挙する
・ステータス変数を利用する
・Databaseタグライブラリ
データベースへのデータ登録/更新/検索など基本的なデータベース連携の手段を提供する
java.sqlパッケージに相当する機能を提供するライブラリ
・Databaseタグライブラリでデータベースを検索する
・Databaseタグライブラリでデータを登録する
・i18nタグライブラリ
i18nタグライブラリは、日付や数値、メッセージの整形などをロケール(地域情報)に応じて制御する手段を提供する
SimpleDateFormatやDecimalFormat,MessageFormatクラス,Localクラスを代替するライブラリ
・数値データの加工
・日付データの加工
・文字列を数値/日付データに変換
・ロケール情報を設定
・国際化対応ページを作成する
・Functionタグライブラリ
文字列を加工するための機能を提供する
Stringクラスを代替する式言語ベースのライブラリ
複数の機能を適用したい場合には複数のタグ(関数)を入れ子に記述することもできる
独習Javaサーバサイド編第2版 第4章まとめ
データベース
後から検索・分析することを目的に、体系的に蓄積した情報群のこと
データベースサーバ
データベースに情報を確実に矛盾なく蓄積、更新し、必要な情報を大量のデータの中から高速に取り出すための手段を提供するソフトウェア
データベースの種類
・カード型データベース
一つの情報を一枚のカードとして扱う
・ネットワーク型データベース
関連するデータ同士が網状に関連付けられる
・リレーショナルデータベース
現在の主流
関連する一連のデータをテーブルに格納する
mysqlクライアント
MySQLにアクセスするにはMySQLに標準で付属しているコマンドラインツールであるmysqlクライアントを利用する
JDBC
データベースごとの仕様差を吸収し、Javaアプリケーションがデータベースに対してなんらかのアクセスを試みる際に一元的なインターフェースを提供するもの
コアはJavaSEのjava.sqlパッケージで提供されている
実際に各DBへの接続や操作を担うのは、個々のJDBCドライバである
DBによって別個に提供されているので必要に応じて適切なドライバをインストールする必要がある
データベース接続
JSPアプリケーションからDBを操作するには、DBに対して接続を確立しなければならない
接続をプール(保管)しておくために コネクションプーリング という仕組みを利用する
・いちいち接続を確立する必要がなくパフォーマンスがよい
・ユーザー数の増減に比較的強い
コネクションプーリングを管理する一連の手続きを規定するのが データソース の役割
設定はcontext.xmlに対して行う。アプリケーションルート配下の/META-
INFフォルダに保存する(要コンテナ再起動)
データソースの情報を定義するのは
データソースURL
データベース接続のための基本情報を表す
jdbc:subprotocol:subname
subprotocolにはJDBCドライバを識別するための文字列を指定する
データベース接続の基本
登録したデータソースを取得するにはInitialContextクラスのlookupメソッドを使用する
lookupメソッドの引数にはjava:comp/env/データソース名の形式で使用したいデータソースを指定する必要がある
戻り値はObjectクラスなので必ずDataSourceオブジェクトへの型キャストを行う必要が有る
データベース切断時注意
原則としてcloseメソッドはfinallyブロックで記述すること
SQLクエリの発行
DBに発行する一連の命令を管理するのはPreparedStatementオブジェクトの役割でConnectionオブジェクトdbからprepareStatementメソッドを呼び出すことで取得する
PreparedStatement prepareStatement(String sql) throws SQLException
sql:発行するsql命令
指定されたSQL命令を実行するためのPreparedStatementオブジェクトを取得する
SQLの命令には?の形式でプレースホルダを含めることが可能
void setXxxxx(int i,T value) throws SQLException
i:パラメータの番号(1スタート)
value:値(Tはデータ型がメソッドに応じて変動する意味)
プレースホルダ?に対して指定された値をセットする
Xxxxxの部分はBoolean,Byte,Date,Double,Float,Int,Long,Short,String,Timeなど
結果セット取得
SQLのSELECT命令によって、一つまたは複数のテーブルから取り出されたレコード群を保持するためにメモリ上に用意された仮想テーブルのこと
結果セットを読み込む場合、レコード単位で読み込む必要がある
現在読み込み可能なレコードを表す内部的な目印のことを レコードポインタ といい、それが示す現在行を カレントレコード という
結果セットから個々の行を取り出すことを フェッチする という
boolean next() throws SQLException
レコードポインタを次のレコードに移動する
ポインタの移動に成功した場合はtrueを、そうでないならfalseを返す
T getXxxxx(int i)
T getXxxxx(String name)
T:Boolean,Byte,Date,Double,Float,Int,Long,Short,String,Timeなど
i:インデックス番号
name:フィールド名
カレントコードから指定されたフィールドの値を取得する
トランザクション処理
分けることのできない複数の処理をグループ化したもの
処理を元に戻すことを ロールバック といい、トランザクションに属するすべての処理をなかったことにする
自動コミット はSQL命令を一つ発行するたびトランザクションを自動的に確定する機能
メタデータまたはメタ情報
データの構成を表すためのデータのこと
ResultSet getTables(String catalog, String schemaPattern, String tableNamePattern,
String[] types) throws SQLException
catalog:データベース名
schemaPattern:スキーマ名
tableNamePattern:テーブル名
types:テーブルの種類
指定されたテーブルのメタ情報を取得する
テーブルの種類は文字列配列で指定可能
ResultSet getColumns(String catalog, String schemaPattern, String tableNamePattern, String columnNamePattern) throws SQLException
catalog:データベース名
schemaPattern:スキーマ名
tableNamePattern:テーブル名
columnNamePattern:フィールド名
指定されたテーブルに含まれるフィールドのメタ情報を取得する
ResultSetMataDate getMetaData() throws SQLException
結果セットの構成情報をResultSetMetaDataオブジェクトとして返す
独習Javaサーバサイド編第2版 第3章まとめ
リクエスト情報
クライアントからサーバに送信される情報の総称
HTTP通信の確認
HTTP通信の構成
・HTTPメソッド:サーバに対する直接の要求と取得するパス
・リクエストヘッダ:リクエストの構成情報、クライアント情報など
・リクエスト本体:フォームから送信されたデータ
・HTTPステータス:サーバでの処理結果を表すコードとメッセージ
・レスポンスヘッダ:コンテンツの構成情報、サーバ情報など
・レスポンス本体:コンテンツ本体
HTTPメソッド
クライアントからサーバに対して発行する直接の命令
メソッド名、パス、プロトコル情報から構成される
GETは指定されたコンテンツを取得しなさいという命令
HTTPステータス
サーバでの処理結果を表す
クライアントの処理方法や次のアクションを決める情報でもある
200 OK であれば、サーバでの処理が正しく終了し応答が返されたことを表す
ポストデータ