サーブレット入門
サーブレット入門
私たちががwebサイトを見るとき、実は内部では以下のような過程が行われている。
クライアントであるwebブラウザはwebサーバーにhttpリクエストを送る。そしてそのリクエストをもとにサーバーからデータを収集し、レスポンスを返しているのである。
仕組みを図解すると以下のようになる。
サーブレット
サーブレットとはアプリケーションサーバー内で動くjavaクラスのことである。サーブレット単独で動くことはできず制御する実行環境上(サーブレットコンテナ)で動く。
ユーザーが作るサーブレットは、servletインタフェースを直接は実装せずHttp.Servletクラスを継承する形をとる。
httpリクエスト
httpリクエストは、クライアントからサーバー側に送られる要求のことである。httpリクエストは以下のような構成になっている。
1行目はリクエストラインである。サーバーに要求する情報で、メソッド、リクエストURL、プロトコルバージョンで構成されている。
GET / HTTP/1.1
httpのバージョン1.1で通信を行い、/というURLに対して情報を取得(GET)したいという要求である。
GETとPOST
GETとPOSTはクライアントからサーバーに情報を送信したりするときに使用するメソッドである。HttpServletクラスにあるdoPost()・doGet()メソッドをオーバーライドしてサーブレットから呼び出す。 両者の違いは以下のようなところにある。
GETを使用して情報を送信:URLに付与する形でリクエストパラメータを送信する。URLの後ろに?を付け、名前=値の順番で記述する。
またクライアントがwebページの情報をサーバーに要求するだけの場合は基本的にGETを用いる。
POSTを使用して情報を送信:入力フォームを使用して送信する。
サーブレット側に送信されたリクエストパラメーターを取得するときはgetParameter(String name)メソッドを使用する。
httpレスポンス
HttpServletResponseオブジェクトはhttpレスポンスを表現しており、httpレスポンスは以下のような構成になっている。
レスポンスでhtmlを返却する場合はボディ部にhtmlが格納される。
setContentType(String type)メソッドを使用することで返却するレスポンスのコンテントタイプを指定することができる。
コンテントタイプの指定
package sample; import java.io.IOException; import java.io.PrintWriter; import java.util.Arrays; import java.util.List; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.xml.ws.RespectBinding; @WebServlet("/names") public class NameSarvlet extends HttpServlet { @Override protected void doGet(HttpSevletRequest req,HttpServletResponse resp)throws ServletException, IOException{ List<String> names = Arrays.asList("John","Paul","George","Ringo"); resp.setContentType("text/html; charset=UTF-8"); PrintWriter out = resp.getWriter(); out.println("<html>"); out.println("<head><title>Names</title></head>"); out.println("<body>"); out.println("<ul>"); for(String name : names){ out.println(<"li"> + name + </li"">); } out.println("</ul>"); out.println("</body>"); out.println("</html>"); } }
@WebServlet("/names") public class NameSarvlet extends HttpServlet {
1行目ではnamesという名前のサーブレットを作成するということを表している。この名前はURLに関連した名前である。
2行目でNameSarvletクラスはHttpServletクラスを継承している。
@Override protected void doGet(HttpSevletRequest req,HttpServletResponse resp)throws ServletException, IOException{
HttpServletクラスのdoGet();メソッドをオーバーライドしている。
doGetメソッドでは、サーブレットがクライアントに返すレスポンス内容を含むHttpServletResponseオブジェクトを生成している。
resp.setContentType("text/html; charset=UTF-8");
setContentTypeの引数には文字列でテキストタイプを指定する。
PrintWriter out = resp.getWriter();
レスポンスのボディ部にテキストデータを出力するためにgetWriter();メソッドからPrintWriterオブジェクトを取得する。
out.println("<html>"); out.println("<head><title>Names</title></head>"); out.println("<body>"); out.println("<ul>"); :
PrintWriterオブジェクトに対してHTMLを出力している。結果としてHTMLがレスポンスボディに格納されることになる。
JDBC(Java Database Connectivity)
JDBCとは
Java言語でデータベースにアクセスするためのインターフェース(API)のこと。
あくまで仕様であり、実装されていないため中身はない 。
中身の実装はDB製品の種類に応じてDBを提供している各ベンダーのJDBCドライバが行う。
JDBC API
Javaプログラムで使用し、JDBCドライバとの接続を行うための標準インターフェースである。機能は以下のようになっている。
- データベースへ接続する
- SQL文を発行する
- データベースが処理した結果を取り出す
- データベースの情報や処理結果に関する情報を取り出す
JDBC DriverManager
java.sqlパッケージのクラスであり、JavaプログラムとJDBCドライバの間に位置する。複数のJDBCドライバを管理することができる。
JDBCドライバ
データベースに直接アクセスするためのに使用する、JDBCインターフェースの具象クラスのこと。
MySQL<基本>
MySQL
MySQLとは …
Oracle社から販売されているリレーショナル・データモデルに基づいて作成されたデータベース管理システム(DBMS:Database Management System)のこと
オープンソースで開発されており、無償で提供されている
データベース(Database)とは…
広義の意味でのデータベースは、「データの貯蔵庫」を指す
IT分野では、DBMSのことを指す
DBMSとは…
データベースを管理するためのアプリケーションのこと
DBMSの基本的な操作"CRUD"とは…
作業名 | 内容 | MySQL内での具体的な文 |
---|---|---|
CREATE | 新しいデータの追加 | CREATE・INSERT |
READ | 既存データを検索する | SELECT |
UPDATE | 既存データを変更する | UPDARE |
DELETE | 既存データを削除する | DELETE |
リレーショナル・データベースとは…
①二次元の表(テーブル)を扱う
②テーブルはデータ重複なく整合的である(=正規化されている)
③テーブル同士に関連を持たせて結合(ジョイン)することができる
④SQL(Structured Query System)という専門言語を用いて操作する
*1:一連のデータ処理の流れをひとまとめにした単位のこと
オブジェクト指向
1.17-18
クラスとオブジェクト
オブジェクト(object)・・「モノ」のこと
目に見えるモノでだけではなく、概念などもオブジェクトである。オブジェクトの中には、クラスとインスタンスが含まれる。オブジェクト
- クラス
- インスタンス
クラス(class)・・「分類」「型」「概念」
- インスタンス(instance)・・クラスを実体化したもの
インスタンスを生成するためには new を用いる
Dog john = new Dog();
自分で定義したDogという参照型の変数の型を用いてjohnという名前の変数にインスタンスを格納している。これは、インスタンスがDogにいるという存在の場所を知らせているだけで、そのまま変数に代入している訳ではないことに注意
またクラスは三つで構成されている。
- フィールド(状態)
- メソッド(振る舞い)
- コンストラクタ(フィールドの初期化)
コンストラクタの方法
public class Dog{ String name; Dog(String name){ this.name = name; } }
コンストラクタするときに陥りやすいところ
コンストラクタは、明示的に表示していないときでも、引数なしのコンストラクタが暗黙のうちに生成されている。(デフォルトコンストラクトという)
しかし、引数ありのコンストラクタを生成した場合、引数なしのコンストラクタは生成されない。
そのため、java Dog john = new Dog();
に引数を入れなかった場合、コンパイルエラーが生じる。
なぜなら、引数ありのコンストラクタを生成しているにも関わらず、引数を与えていないからである。この場合、Dogクラスに引数なしのコンストラクタを明示する必要がある。
Java Silver への道 データ型(プリミティブ型)編
4.4
データ型
データ型とは、データの種類を表す情報で、プログラムの実行中にデータの扱い方を指定するために記述するもの。
例えば"3"という値を整数として扱う場合と浮動小数点として扱う場合とではコンピュータ内部での扱い方が変わる。
プリミティブ型(基本データ型)
プリミティブ型は、整数や浮動小数点といった数値、真偽値、文字を扱うもの。
種類 | 型 | サイズ | 既定値 |
---|---|---|---|
整数型 | byte | 8bit | 0 |
整数型 | short | 16bits | 0 |
整数型 | int | 32bits | 0 |
整数型 | long | 64bits | 0 |
小数型 | float | 32bits | 0.0 |
小数型 | double | 64bits | 0.0 |
真偽値型 | boolean | 1bit | false |
文字型 | char | 16bits | ¥¥u000| |
*型名は省略などせずにこのままの通り記述する
暗黙の型変換について
整数はlong型、少数はdouble型がいちばん大きなデータを表すことができる。
前述した表の上から小さい順に並んでいて、イメージとしては順番にデータを入れる箱が大きくなっていると考えるとよい。そのため、小さい箱は大きい箱に入れて変換することができる。
たとえば、int型はlong型に変換してくれるけれど、short型に変換はしてくれない。
public class Sample { public static void main(String[] args) { // 2147483647はint型で扱えるデータの最大値 int x = 2147483647; // long型の方がintより大きいデータを扱えるため、暗黙的にlong型に変換してくれる long xx = 2147483647; // shortで扱えるデータの値より大きいためint型に変換できずコンパイルエラーが起きる short xxx = 2147483647; //short型の範囲であれば型変換OK short xxxx = 21; } }
リテラル
リテラルとは、ソースコード中に記述する値のこと。javaには整数、浮動小数点、真偽値、文字の4つのリテラルが存在する。
たとえば整数値を記述するとデフォルトでint型として扱われる。浮動小数点だとdouble型、真偽値であればboolean型、文字であればchar型である。
もしデフォルトの型ではなくて明示的に違う型を指定したい場合は、接尾辞をつけなければいけない。
public class Sample { public static void main(String[] args) { //9223372036854775807はint型では扱えないlong型でいちばん大きなデータ //longと表記しているにも関わらず、接尾辞をつけていないためint型と認識しコンパイルエラーがでる long a = 9223372036854775807; //接尾語をつけるとlong型と認識してくれる long aa = 9223372036854775807L; } }
~整数リテラルを2・8・16進数で表記するときのルール~
10進数はそのまま表記することができるが、それ以外の進数で表記したいときは接頭辞をつけなければいけない。
進数 | 接頭辞 |
---|---|
2 | 0b |
8 | 0 |
16 | 0x |
~文字リテラル~
文字リテラルは一文字を表すデータ型で、char型で表現できる。
ちなみに文字列リテラルは複数の文字を表すデータ型である。
この二つのリテラルを区別するために、文字リテラルはシングルクォーテーション「'‘」、文字列リテラルはダブルクォーテーション「"“」で括る。
文字リテラルは、「a」などの文字だけでなく、「¥u」から始まるUnicode番号(16進数4桁)でも表すことができる。
このように16進数4桁の数値で文字を表現できることから、char型には0~65535までの数値を代入できる。(負の値は不可) これは数値リテラルであるため、シングルクォーテーションは必要ない。
char型に代入できるもの
public class Sample { public static void main(String[] args) { char a = 12450; char b = 'ア'; char c = '\u30A2'; System.out.println(a); System.out.println(b); System.out.println(c); } }
➡結果はすべて「ア」が表示される
~アンダースコア~
数値リテラルの見やすさを向上させるために導入された。使用には以下のルールがある。
- リテラルの先頭と末尾には使用できない
- 記号の前後には使用できない
- 利用できる記号は「.」「F」「L」「0b」「0x」
識別子
識別子とは、変数やメソッド、クラスなどプログラマーが自由につけていい名前のことを指す。識別子には以下のような命名規則がある。
*1:intやforなどプログラムを書く上で必要な用語