pi-15. カプセル化,MVCモデル,
オブジェクトのマッピング
1
金子邦彦
Java マスター講座:基礎から応用まで)
URL: https://www.kkaneko.jp/pro/pi/index.html
Javaにおけるカプセル化によるアクセス制御、MVC
デルによるプログラム設計、オブジェクトとデータベー
ス・DOMとのマッピング技術
学習内容の構成
1. カプセル化public, privateの指定による属性・メ
ソッドへのアクセス制御
2. MVCモデル:モデル(データ保持)、ビュー(表
示)、コントローラー(ユーザ操作受付・モデル更
新)への分離による設計手法
3. オブジェクトのマッピングJavaオブジェクトをリ
レーショナルデータベースやDOMオブジェクトに対
応付ける技術
前提:Javaのクラス定義、オブジェクト生成の理解
意義:見通しの良いプログラム設計、Webアプリケー
ションや情報システム構築への応用
2
GDB online
3
Java などのプログラミング言語の体
験,演習ができるオンラインサービス
https://www.onlinegdb.com/
オンラインなので、「秘密にしたいプログラム」を
扱うには十分な注意が必要
GDB online Java を動かす手順
ウェブブラウザを起動する
次の URL を開く
https://www.onlinegdb.com
4
Language」のところで,「Java」を選ぶ
5
6
ソースコードを入れる
実行.実行結果を確認
Run」をクリック.
15-1. カプセル化
7
カプセル化とは
オブジェクトは、属性と、メソッドを持つ
必要な属性メソッドのみ、他のオブジェクトに
公開する
8
クラス
クラスは,同じ種類のオブジェクトの集まりと考
えることができる
9
人間
学生
学生でもあり人間でもある
人間だが、学生ではない
ソースコード
・クラス定義
・オブジェクト生成など
10
プログラムの起動
オブジェクトが生成され、互いに連携
しながら動作する
11
クラスA
クラスB
クラスC
クラスB
すべてのオブジェクトカプセル化されている。
必要な属性メソッドのみ、他のオブジェク
トに公開する
何を公開し、何を公開しないかは、クラス単
位で指定可能
Java でのカプセル化
公開 public
非公開 private
12
まとめ
カプセル化
Java では、public, private の指定により,属性やメ
ソッドへのアクセス制御を行う
13
15-2. MVC モデル
14
モデルとビューとコントローラ
15
モデル
ビュー
ユーザに見せる
ユーザから受け付ける
更新
更新
コントローラ
データの保持
表示
ユーザ操作
受け付け、
モデル更新
モデルとビューとコントローラ
オブジェクト指向では、
アプリ(Webアプリなど)は、
さまざまなオブジェクトの集まり
モデル、ビュー、コントローラーに分けて、
プログラムを設計、製作、テストすることで、
プログラムを見通し良く作成可能 (私の見解)
16
MVC の例
名簿を作るとき
モデルの例
Person クラス: オブジェクトは1人の人間
Meibo クラス: オブジェクトは名簿全体
ビューの例
表やフォーム形式で、名簿データを表示
コントローラーの例
フォーム記入内容をもとに、モデルを更新
17
15-3. Java での MVC モデル
18
今から行うこと
モデル部分: Person クラス,Meibo クラス
コントローラー部分: Main クラス
ビューは考えないことにする
19
演習
資料:22 29
【トピックス】
MVC モデル
20
21
プログラム モデル部分
22
プログラムの続き(モデル部分
23
プログラムの続き(コントローラー部分)
24
実行し結果を確認
次に行うこと
モデル部分: Person クラス,Meibo クラス
コントローラー部分: Main クラス
ビュー部分: View クラス(新しく追加)
25
26
次のプログラムを書き加える
27
次のように書き換える(ビューを使うように)
28
実行し結果を確認
モデルとビューの分離
モデルの中のデータを,全て見せる必要がない(す
べてを見せたくない)場合などに有効となる考え
「プログラムが作成しやすくなる」(私の見解)
例)「『表示にこだわりたい』という場合,
モデルとビューを分離しておけば,
ビューのプログラムに集中できる」
という考え方も
29
15-4. MVC モデルの応用
30
フレームワーク:アプリケーションの土台となる
ソフトウエア
MVC モデルに適する Java 言語フレームワークも
多数ある
Struts
JSF (Java Server Faces)
Spring Framework
Java の標準機能外であるが、インストールは簡単
31
Struts 2
https://struts.apache.org/getting-started/hello-world-
using-struts2.html
32
Web アプリケー
ションのワーク
HTML, Java の組
み合わせでアプリ
ケーションを作成
15-5. オブジェクトのマッピング
33
34
モデル
ビュー
ユーザに見せる
ユーザから受け付ける
コント
ローラ
マッピング
マッピング
データベース
データベースシステム内
DOM
オブジェクト
情報システムのアーキテクチャ
35
サーバ
(コンピュータ)
デジタルデバイス
ネットワーク接続
・画面表示
・画面,マウス,
キーボードでの操作
プログラム配信
データのやり取り
データベース
データベースとの
マッピング
DOMオブジェクトと
のマッピング
オブジェクトのマッピングを行う理由
データベースとのマッピング
Java オブジェクトを,データベース(リレーショ
ナルデータベースシステム内)にマッピング
リレーショナルデータベースのデータ検索結
果などを Java で簡単に扱えるように
DOM オブジェクトとのマッピング
Java オブジェクトを,DOMオブジェクトWeb
ラウザと相性が良い)にマッピング
Web プログラムのダイナミック化
36
マッピングのための技術
Java 言語
データベース向け SQL Alchemy など
DOM 向けDOM, SAX など(いずれも Java の標
準)
Python 言語
データベース向け SQLAlchemy など
DOM 向けdom パッケージなど
37
15-6. Java でのオブジェクトの
マッピング
38
トピックス
リレーショナルデータベースとのマッピング
XML, HTML, DOM
DOM オブジェクトとのマッピング
39
Spring JDBC のマッピングの例
40
Spring JDBC
のライブラリ
マッピングを
行う Java プログラム
Java
オブジェクト
リレーショナル
データベース
テーブル
Spring JDBC のマッピングの例
41
List<Employee> employeeList = jdbcTemplate.query(
"SELECT * FROM Employee",
(rs, rowNum) -> {
int id = rs.getInt("id");
String name = rs.getString("name");
BigDecimal salary = rs.getBigDecimal("salary");
LocalDate joined = rs.getDate("joined").toLocalDate();
return new Employee(id, name, salary, joined); } );
マッピングを
行う Java プログラム
リレーショナル
データベース
テーブル
Java
オブジェクト
id
name
salary
joined
リストオブジェクト
・要素は Employee オブ
ジェクト.属性は,id,
name ,salary, joined
・テーブルを丸ごと読み込んで Java のリストオブジェクト
・「SELECT ・・・」のところには条件を指定可能
記事をアップしています https://www.kkaneko.jp/pro/jdbc/springjdbc.html
XMLとは
XML とは eXtensible Markup Language のこと
タグ属性を使い文書を書く
42
<items>
<item id="001">XX</item>
<item id="002">YY</item>
</items>
item, items はタグ
id は属性
DOMとは
DOM とは Document Object Model のこと
DOM では,ノードが階層構造をなすと考える
43
<items>
<item id="001">XX</item>
<item id="002">YY</item>
</items>
item, items はタグ
id は属性
DOM
items ノード
itemノード
itemノード
HTMLをプログラムで扱う理由
Webブラウザでの表示をダイナミックに変えたい
とき,プログラムを書く
そのとき,DOM オブジェクトを使うのは良い方針
44
HTML DOM に準拠しつつある
<!DOCTYPE html>
<html lang="ja">
<head>
<meta content="text/html; charset=utf-8"
http-equiv="Content-Type">
<meta content="width=device-width, initial-
scale=1.0, maximum-scale=1.0, minimum-
scale=1.0" name="viewport">
<title>サンプル</title>
</head>
</body>
<h1>サンプル</h1>
</body>
</html>
45
HTML ファイル
Web ブラウザで表示
DOM でのマッピングの例 (Java 言語)
46
JDBC の標準ラ
イブラリ
DOMオブジェクトの
読み出し,書き込み
を行うプログラム
Java
Document d = new XMLDocument();
Element r = document.createElement("items");
d.appendChild(r);
Element e = d.createElement("item");
r.appendChild(e);
Text t = d.createTextNode("VALUE");
e.appendChild(t);
e.setAttribute("id", "ID");
DOM
オブジェクト
<items>
<item id="ID">VALUE</item>
</items>
書き込みの例
書き込まれた
DOMオブジェ
クト
DOM でのマッピングの例 (Python 言語)
47
DOMオブジェクトの
読み出し,書き込み
を行うプログラム
Python DOM
オブジェクト
<items>
<item id="001">XX</item>
<item id="002">YY</item>
</items>
書き込みの例
import xml.etree.ElementTree as ET
all = ET.Element('items')
x = ET.SubElement(all, 'item', {'id':'001'})
x.text = 'XX'
y = ET.SubElement(all, 'item', {'id':'002'})
y.text = ‘YY'
ET.dump(all)
まとめ
リレーショナルデータベースや、DOMオブジェク
トは、Java オブジェクトへのマッピング可能
リレーショナルデータベースや、DOMオブジェク
トを、ふつうの Java オブジェクトと同じ感覚で
扱える
48
関連ページ
Java プログラミング入門
GDB online を使用
https://www.kkaneko.jp/pro/ji/index.html
Java の基本
Java Tutor, GDB online を使用
https://www.kkaneko.jp/pro/pi/index.html
Java プログラム例
https://www.kkaneko.jp/pro/java/index.html
49
15-1
import java.util.*;
class Circle {
double x;
double y;
double r;
String color;
public Circle(double x, double y, double r, String color) {
this.x = x;
this.y = y;
this.r = r;
this.color = color;
}
public void printout() {
System.out.printf("%f %f %f %s¥n", this.x, this.y, this.r, this.color);
}
}
public class Main {
public static void main(String[] args) throws Exception {
Circle x = new Circle(2, 4, 3, "green");
Circle y = new Circle(8, 10, 1, "blue");
x.printout();
y.printout();
}
}
50
15-3
import java.util.HashMap;
import java.util.Iterator;
import java.util.ArrayList;
class Person {
String name;
String address;
public Person(String name, String address) {
this.name = name;
this.address = address;
}
public void printout() {
System.out.printf("%s %s¥n", this.name, this.address);
}
}
class Meibo {
HashMap<Integer, Person> m;
public Meibo(HashMap<Integer, Person> m) {
this.m = m;
}
public void add(int id, String name, String address) {
m.put(id, new Person(name, address));
}
public void printout() {
for(Integer i : this.m.keySet()) {
System.out.printf("%d, ", i);
this.m.get(i).printout();
}
}
}
public class Main {
public static void main(String[] args) throws Exception {
HashMap<Integer, Person> m = new HashMap<Integer, Person>();
Meibo a = new Meibo(m);
a.add(1, "XX", "Fukuyama");
a.add(2, "YY", "Okayama");
a.printout();
}
}
51
15-3
import java.util.HashMap;
import java.util.Iterator;
import java.util.ArrayList;
class Person {
String name;
String address;
public Person(String name, String address) {
this.name = name;
this.address = address;
}
public void printout() {
System.out.printf("%s %s¥n", this.name, this.address);
}
}
class Meibo {
HashMap<Integer, Person> m;
public Meibo(HashMap<Integer, Person> m) {
this.m = m;
}
public void add(int id, String name, String address) {
m.put(id, new Person(name, address));
}
public void printout() {
for(Integer i : this.m.keySet()) {
System.out.printf("%d, ", i);
this.m.get(i).printout();
}
}
}
class View {
ArrayList<Person> v;
public View() {
}
public void update(Meibo meibo) {
this.v = new ArrayList<Person>();
for(Integer i: meibo.m.keySet()) {
v.add(meibo.m.get(i));
}
}
public void printout() {
for(Person p: this.v) {
System.out.printf("%s %s¥n", p.name, p.address);
}
}
}
public class Main {
public static void main(String[] args) throws Exception {
HashMap<Integer, Person> m = new HashMap<Integer, Person>();
Meibo a = new Meibo(m);
a.add(1, "XX", "Fukuyama");
a.add(2, "YY", "Okayama");
View v = new View();
v.update(a);
v.printout();
}
}
52