読者です 読者をやめる 読者になる 読者になる

セッション

セッションとは

ブラウザとサーバーの一連のやりとりのこと。
例えばあるwebサイトにアクセスして、そのサイトから出て行くかブラウザを閉じるまでが1セッションとなる。
セッション管理を用いると、ショッピングサイトなどで異なるページを開いても同一クライアントの情報を管理することができる。
多くの場合ページの閲覧時間が何分か開くと新しいセッションとしてカウントされる。サイトでよく見かける”セッションタイムアウトになりました”というのがこれを意味する。
HttpSessionインタフェースを使用するとサーブレットコンテナがセッション管理を容易に行ってくれる。

セッション管理サンプルコード

package example;

import java.io.IOException;
import java.io.PrintWriter;

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.servlet.http.HttpSession;

@WebServlet("/count")
public class CountServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        HttpSession session = req.getSession();
        Integer count = (Integer) session.getAttribute("count");
        if (count == null) {
            count = 0;
        }
        count++;
        session.setAttribute("count", count);

        resp.setContentType("text/html;charset=UTF-8");
        PrintWriter out = resp.getWriter();
        out.println("<html>");
        out.println("<head><title>Count</title></head>");
        out.println("<body>");
        out.println("<h1>Count: " + count + "</h1>");
        out.println("<a href=\"count\" >count</a>");
        out.println("</body>");
        out.println("</html>");
    }
}
HttpSession session = req.getSession();

doGetメソッドでは、HttpServletRequestオブジェクトに対してgetSessionメソッドを呼び出し、HttpSessionオブジェクトを取得している。
この時引数を指定していないので、初回アクセス時などセッションが存在していない場合は新しいセッションが作成される。

Integer count = (Integer) session.getAttribute("count");

HttpSessionオブジェクトのgetAttributeメソッドを呼び出し、"count"という名前で保存されたデータの値を取得している。この時データがなければnullで返却される。
また、getAttributeはオブジェクト型で返却され、基本データ型は扱えない。そのため今回はIntegerにキャストして変数countをint型として扱っている。

if (count == null) {
        count = 0;
}
count++;
session.setAttribute("count", count);

変数countがnullでないことを確認し、countをカウントアップしている。そしてその後HttpsSessionオブジェクトに対しsetAttributeメソッドを呼び出し、"count"という名前をつけcountオブジェクトをセッションに保存している。

サーブレット入門

サーブレット入門

私たちががwebサイトを見るとき、実は内部では以下のような過程が行われている。
クライアントであるwebブラウザはwebサーバーにhttpリクエストを送る。そしてそのリクエストをもとにサーバーからデータを収集し、レスポンスを返しているのである。
仕組みを図解すると以下のようになる。 f:id:mmmnn1257:20170313231715p:plain

サーブレット

サーブレットとはアプリケーションサーバー内で動くjavaクラスのことである。サーブレット単独で動くことはできず制御する実行環境上(サーブレットコンテナ)で動く。
ユーザーが作るサーブレットは、servletインタフェースを直接は実装せずHttp.Servletクラスを継承する形をとる。

httpリクエスト

httpリクエストは、クライアントからサーバー側に送られる要求のことである。httpリクエストは以下のような構成になっている。

f:id:mmmnn1257:20170320184305p:plain
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レスポンスは以下のような構成になっている。
f:id:mmmnn1257:20170321113914p:plain
レスポンスで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ドライバが行う。

f:id:mmmnn1257:20170305161245p:plain  

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とは…

データベースを管理するためのアプリケーションのこと

  • 膨大な量のデータを扱うことができる
  • 素早くデータを取り出すことができる
  • 複数のユーザーで同時に利用できる
  • トランザクション*1管理機能を備えている
  • セキュリティ機能を備えている
  • 耐障害性を備えている

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 ]

1.31

変数とはプログラムで使う値を一時的に格納しておくためのメモリ上の領域のこと。
箱のようなイメージを持っておくのが良い。

基本データ型

種類 サイズ 既定値
整数型 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|

文字型を明示的な型で表す
char型としたい場合はシングルクォーテーションで囲む
‘A’
String型としたい場合はダブルクォーテーションで囲む
“A”

参照型

参照型はオブジェクト型ともいい、簡単に言えば基本データ型以外の型のことである。
参照型=クラスと考えてもいい。参照型を使用する際には基本的にインスタンスを生成する。(static修飾されているメソッドや変数を使用するときはインスタンスの生成は不要)
String,Date,Integer,ArrayListなど

参照型の中でもString型は特別で、基本データと同じような宣言が可能。