3校での変更点
010
015
①
{drive}/jet/netbeans/bin/netbeans64.exe
のショートカットを作成する020
4.
[リンク先]欄に" -J-Xmx512m --fontsize 14"
と追記するC:¥jet¥netbeans¥bin¥netbeans64.exe -J-Xmx512m --fontsize 14
030
※-J-Xmx512mは、NetBeansが使用するメモリの最大値を512MBにします。--fontsize 14は画面表示に使 われるフォントサイズを14ポイントに指定します。
※{drive}はJETを展開したドライブで す。左図ではC:¥です。
これ以降、JETを配置したドライブを {drive}と表記します。
9110.tif 53%
展開先は、c:¥のようにドライブ名だけを指定します。c:¥jetのよう に指定すると、左図のようにjetフォルダが2重になってしまいます。
この状態では動作しなくなるので、注意してください。
9112.tif 22%
本文の90%のフォントサイズ、黒枠で囲む。
040
・ファイルダイアログが開くので、
{drive}/jet/payara
を選択する045
④-4 Payara Serverを起動する
・[サーバー]ノードを展開し、Payara Serverを表示する
・Payara Serverを右ボタンでクリックし、[start]を選ぶ
⇒出力ダイアログが開き、サーバーの起動状態が表示される
※出力ダイアログが開かない場合は、Payara Serverを右クリックし、[View Domain Server Log]を 選択する
(注意)初回の起動時のみ、起動完了まで1分~最大3分程度の時間を要します。
050
{drive}/jet
⇒projects
⇒sampleProjects
060
プロジェクトをコンパイルして、設定ファイルなどと共に
1
つのファイルにまとめることを ビルドといいます。ここではbuilder
というプロジェクトを開いて、ビルドし、さらに実行し てみましょう。builder
は、新規プロジェクトを作成する時に使うツールです。9116.tif 60%
9118.tif 68%
この部分は、ゴシ、青、太字
100
①[プロジェクト]タブをクリックする
②[ファイル]⇒[プロジェクトを開く]と選択する
③ファイルダイアログで、{drive}/jet ⇒ projects ⇒ sampleProjectsと選択する
④[builder]プロジェクトをクリックして選択し、[プロジェクトを開く]ボタンを押す
手順 2 builder プロジェクトをビルドして実行する
①上段の ボタンを押して実行に使うブラウザを指定する
(Chrome、Edge、SafariなどInternet Explorer以外のブラウザを選択する。また、巻末資料「1.既定 のブラウザを設定する方法]には、あらかじめ既定値を決めておく方法の説明がある)
②builderプロジェクトを1度クリックして選択状態にする
③ ボタンを押してプロジェクトをビルドする
④ビルドが完了したら ボタンを押してプロジェクトを実行する
⇒ ブラウザに実行画面が表示される
プロジェクトのビルドと実行は、以上で完了です。この
builder
プロジェクトは、空のプロ ジェクトを生成するプロジェクトビルダーで、新しいプロジェクトを作りたい時に利用します。ここで、
3
章で使うsample01
プロジェクトを作っておきます。プロジェクト名にsample01
と入力して、このまま作成ボタンを押してください(一般に、GroupID
は変更する必要はあり ません)。これで、sample01
プロジェクトが作成されます。作成される場所は、builder
と同 じフォルダになります。メニューから[ファイル]⇒[プロジェクトを開く]と選択し、sample01
プロジェクトを開いてみてください。また、ビルドして実行してみましょう。なお、
builder
プロジェクトを使わず、NetBeans
の機能でスケルトンプロジェクトを作成 する方法は、巻末資料「3.
プロジェクトの作成方法」を参照してください。110 ここまで
9180.tif 53%
9160.tif 40%
9130.tif
9140.tif 9150.tif
9130.tif~9140.tifの サイズは文字に合わせて、
適宜、調整してください 110
ここから
115
例えば、
CDI
ビーンの中に、書籍のList
を返すメソッドがある時、メソッドに@Produces
を 付けると、書籍のList
をインジェクトできるようになります。120
例題のように
@Produces
を付けると、他のCDI
ビーンに、130
※windowsでは{drive}はJETを展開したc:¥のようなドライブ文字です。また、Macでは/ユーザ/<home>/ですが、エイリ アスとして~を使えるので、/ユーザ/<home>/jet/dockerは、~/jet/dockerと同じです。
140
※Macではvoluems:は、- ~/docker/mysql_data:/var/lib/mysqlです
150
⑦[接続をテスト]ボタンを押して、「接続に成功しました」と表示されることを確認する
⑧[次
>
]ボタンを押す2.6 Payara Server の設定
前節までで、
MySQL
サーバーを動かし、NetBeans
からデータベースを起動したり、内容を見 たりできるようになりましたが、プログラムでデータベースを読み書きするには、Payara Server
にも設定が必要です。というのも、プログラムは
JPA
を利用してデータベースを操作しますが、JPA
での操作をM
ySQL
に伝えるのはPayara Server
だからです。Payara Server
はMySQL
への接続情報を知 っておく必要がありますし、また、効率よく接続するために接続プールを作成しておくことも 必要です。さらにプログラムが名前を指定するだけでデータベースサービスを利用できるよう に、接続名(データソース)を提供する必要があります。そこで、Payar Server
に次の2
つ の設定を行います。①コネクションプールの作成
②データソースの作成
設定の具体的な方法は、巻末資料に
Windows
専用と一般的な方法に分けて記載しています。Mac OS
は一般的な方法で設定します。比較的簡単な手順ですから、資料を読んで必要な設定を済ませてください。
次節では、いよいよ、データベースに値を書き込んで表示してみることにします。
160 ここまで 160 ここから
サーバーコンソールでデータソースを参照する手順
①
NetBeans
の中からPayar Server
を右クリックしてAdmin Console
を開く あるいは、http://localhost:4848
をブラウザで開く②[共通タスク]⇒[リソース]⇒[
JDBC
]⇒[JDBC
リソース]と選択するデータソース一覧
※Payara Server以外のサーバーでは、それぞれのマニュアル等を参照してください。
図で、
java:comp/DefaultDataSource
と表示されているのが、デフォルトで用意されて いる論理JNDI
名です。これをDataSourceLookup
に指定します。ただ、デフォルトでは接続 プールがH2Pool
となっているので、このままでは使えません。そこで、jdbc/mydb
の接続プ ールであるmydbpool
を割り当て直すことにします。割り当て直しの手順
①データソース一覧から
jdbc/__default
をクリックして編集画面を開く②プール名を
H2Pool
からmydbpool
に変更して[保存]ボタンを押す9330.tif 97%
170 ここから
170 ここまで
9300.tif
97%
5.6 SecurityContext
EL
式の中で行った認証チェックは、SecurityContext
オブジェクトをインジェクトするこ とで、プログラムの中でも実行することができます。@Inject
SecurityContext context;
String userName = context.getCallerPrincipal().getName(); // ユーザー名を得る boolean result = contex. isCallerInRole("admin"); // グループを調べる
合わせて覚えておきましょう。
180
http://localhost:8080/sample27-05/bookshop/member
182
http://localhost:8080/sample27-05/bookshop/member/5
184
http://localhost:8080/sample27-05/bookshop/member
186
http://localhost:8080/sample27-05/bookshop/member?id=7
188
http://localhost:8080/sample27-05/bookshop/member
190
これから、ソースコードを少しずつ見ながら、クライアント
API
の使い方を解説します が、最初にすべてコードを掲載しておきます。少し長いコードですが、それぞれのメソッドは とても簡単なことがわかるでしょう。175 ここから
175 ここまで
44 * *****(データベース処理)*******************************/
45 @EJB protected ProductFacade productDb; // 商品データベース 46 @EJB protected CustomerFacade customerDb; // 顧客データベース 47 @EJB protected AppOrderFacade appOrderDb; // 注文履歴データべース 48 @EJB protected OrderLineFacade orderLineDb; // 注文明細データベース 49
50 /* *****(ユーティリティのインジェクト)********************/
51 @EJB protected ProductManager pm; // 商品マネージャー 52 @Inject protected transient Logger log; // ロガー
53 @EJB protected MailSender sender; // 電子メールユーティリティ 54 @Inject protected Pagenation productPage; // ページングマネージャー 55 @EJB protected OrderManager orderManager; // 顧客の購入履歴の検索
56 @Inject protected MakeText text; // 注文確認メールの文面を作成するユーティリティ 57
58 /* **** (コンテキスト) *********************************/
59 @Inject SecurityContext securityContext;
60 @Inject FacesContext facesContext;
61 @Inject ExternalContext externalContext;
63 /* *****(初期化)******************************************/
64 @PostConstruct 65 public void init() {
66 cart = new ArrayList<>(); // カート 67
68 priceItems = new LinkedHashMap<>(); // 並べ替え選択肢 69 priceItems.put("なし", 1);
70 priceItems.put("安い順", 2);
71 priceItems.put("高い順", 3);
72
73 kindItems = new LinkedHashMap<>(); // 種類選択肢 74 kindItems.put("全商品", AppKind.NONE);
75 kindItems.put("新入荷品", AppKind.KIND1);
76 kindItems.put("おすすめ品", AppKind.KIND2);
77 kindItems.put("特価品", AppKind.KIND3);
78
79 productPage.setup(productDb.count(), 5);// ページングマネージャー 80 }
192 ここから
192 ここまで
p.
〇194 ここまで 194 ここから
1 package beans;
2 import db.*;
3 import net.tkxtools.MailSender;
4 import entity.*;
5 import java.io.ByteArrayInputStream;
6 import java.io.Serializable;
7 import java.util.ArrayList;
8 import java.util.LinkedHashMap;
9 import java.util.List;
10 import java.util.Map;
11 import java.util.logging.Logger;
12 import javax.annotation.PostConstruct;
13 import javax.ejb.EJB;
14 import javax.faces.application.FacesMessage;
15 import javax.faces.context.ExternalContext;
16 import javax.faces.context.FacesContext;
17 import javax.faces.event.PhaseId;
18 import javax.inject.Inject;
19 import javax.security.enterprise.SecurityContext;
20 import org.primefaces.model.DefaultStreamedContent;
21 import org.primefaces.model.StreamedContent;
22 import util.Pagenation;
23 /*
24 * ・フィールド変数とアクセサメソッドを持つ 25 * ・初期化処理を行う
26 * ・ページング処理を行う
27 * ・ユーティリティメソッドもスーパークラスに用意する 28 */
29 public class SuperBb implements Serializable {
30 /* *****(変数)********************************************/
31 protected Map<String, Integer> priceItems; // 並べ替え選択肢 32 protected Map<String, AppKind> kindItems; // 種類選択肢 33 protected AppKind kindItem = AppKind.NONE; // 種類選択結果 34 protected Integer priceItem = 1; // 並べ替え選択結果 35
36 protected List<OrderLine> cart; // カート
37 protected Product sel; // 詳細画面に表示する商品
38
39 protected String c_name; // 顧客氏名
40 protected String c_address; // 顧客住所
41 protected String c_mail; // 顧客メール
42 protected String c_msg; // 顧客メッセージ
43
44 /* *****(データベース処理)*******************************/
45 @EJB protected ProductFacade productDb; // 商品データベース
p.
〇p.
〇 196ここから
46 @EJB protected CustomerFacade customerDb; // 顧客データベース 47 @EJB protected AppOrderFacade appOrderDb; // 注文履歴データべース 48 @EJB protected OrderLineFacade orderLineDb; // 注文明細データベース 49
50 /* *****(ユーティリティのインジェクト)********************/
51 @EJB protected ProductManager pm; // 商品マネージャー 52 @Inject protected transient Logger log; // ロガー
53 @EJB protected MailSender sender; // 電子メールユーティリティ 54 @Inject protected Pagenation productPage; // ページングマネージャー 55 @EJB protected OrderManager orderManager; // 顧客の購入履歴の検索
56 @Inject protected MakeText text; // 注文確認メールの文面を作成するユーティリティ 57
58 /* **** (コンテキスト) *********************************/
59 @Inject SecurityContext securityContext;
60 @Inject FacesContext facesContext;
61 @Inject ExternalContext externalContext;
62
63 /* *****(初期化)******************************************/
64 @PostConstruct 65 public void init() {
66 cart = new ArrayList<>(); // カート 67
68 priceItems = new LinkedHashMap<>(); // 並べ替え選択肢 69 priceItems.put("なし", 1);
70 priceItems.put("安い順", 2);
71 priceItems.put("高い順", 3);
72
73 kindItems = new LinkedHashMap<>(); // 種類選択肢 74 kindItems.put("全商品", AppKind.NONE);
75 kindItems.put("新入荷品", AppKind.KIND1);
76 kindItems.put("おすすめ品", AppKind.KIND2);
77 kindItems.put("特価品", AppKind.KIND3);
78
79 productPage.setup(productDb.count(), 5);// ページングマネージャー 80 }
81 /* *****(画像表示処理<小画像>)************************/
82 public StreamedContent getPicS() {
83 if (facesContext.getCurrentPhaseId() == PhaseId.RENDER_RESPONSE) { 84 return new DefaultStreamedContent();
85 } else {
86 Map<String, String> map = externalContext.getRequestParameterMap();
87 String key = map.get("productId");
88 Product e = (Product) (productDb.find(Long.valueOf(key)));
89 ByteArrayInputStream in = new ByteArrayInputStream(e.getPic_S());
90 DefaultStreamedContent ds = new DefaultStreamedContent(in);
91 return ds;
p.
〇92 } 93 } 94
95 /* *****(画像表示処理<大画像>)************************/
96 public StreamedContent getPicL() {
97 if (facesContext.getCurrentPhaseId() == PhaseId.RENDER_RESPONSE) { 98 return new DefaultStreamedContent();
99 } else {
100 Map<String, String> map = externalContext.getRequestParameterMap();
101 String key = map.get("productId");
102 Product e = (Product) (productDb.find(Long.valueOf(key)));
103 ByteArrayInputStream in = new ByteArrayInputStream(e.getPic_L());
104 DefaultStreamedContent ds = new DefaultStreamedContent(in);
105 return ds;
106 }
107 } 108
109 /* *****(メッセージを作成しキューに入れる)**************/
110 public void facesMessage(String s) {
111 FacesMessage msg = new FacesMessage(s);
112 FacesContext.getCurrentInstance().addMessage(null, msg);
113 }
114 /* *****(エラーメッセージを作成しキューに入れる)**************/
115 public void facesErrorMsg(String s) {
116 FacesMessage msg = new FacesMessage(s);
117 msg.setSeverity(FacesMessage.SEVERITY_ERROR);
118 FacesContext.getCurrentInstance().addMessage(null, msg);
119 }
120 /* *****(メッセージを作成しキューに入れる)*****************
121 FacesMessage.SEVERITY_FATAL 致命的エラー(4) 122 FacesMessage.SEVERITY_ERROR エラー(3) 123 FacesMessage.SEVERITY_WARN 警告(2) 124 FacesMessage.SEVERITY_WARN 情報(1)
125 *************************************************************/
126 public void facesMessage(FacesMessage.Severity severity, String s) { 127 FacesMessage msg = new FacesMessage(s);
128 msg.setSeverity(severity);
129 FacesContext.getCurrentInstance().addMessage(null, msg);
130 }
131 /* *****(ログインしているユーザーのIDを返す */
132 public String getUserId() {
133 return securityContext.getCallerPrincipal().getName();
134 }
// セッター・ゲッターは記載を省略 196 }
ここまで
1000
2.2 Payara Server のセットアップ
セットアップには、
Payara Server
のGUI
画面(Admin Console
)で行う方法と、コマン ドを使う方法があります。ここでは、コマンドによる方法を解説します。GUI
画面による方法 は、次節の「一般的な方法」を参照してください。コマンドプロンプトを起動して、コマンドをタイプします。例えば、
JET
をC
ドライブの直 下に置いた場合は、次のようにタイプします。他のドライブの場合はC
を実際のドライブ名に 読み替えてください。c: --- cd c:/jet/payara/bin --- pool.bat --- resource.bat ---
1005ここから
1005 ここまで
コマンドのあるフォルダに切り替える 接続プールを作成する
データソースを作成する JETのあるドライブに切り替える {drive}は、JET フォルダのある場
所です。WindowsならJETのあるド ライブ、Mac OSならホームディレク トリ(~)です。
(例)
win -- c:¥jet/jdk/bin Mac -- ~/jet/jdk/bin
3 サーバーのデータベース設定(一般的な方法方法)
サーバー管理画面(
Admin Console
)を使って、設定を行います。3.1 データベースドライバの登録( JET では不要)
Payara Server
の①か②のフォルダにドライバソフトをコピーします。①
payara/glassfish/domains/domain1/lib
(domain1
にだけ有効)②
payara/glassfish/lib
(全ドメインに有効)JET
では、あらかじめ①のフォルダに、MySQL8
用のJDBC
ドライバをコピーしてあるので、このコピー操作は不要です。
3.2 コネクションプールの作成
1020
cd {drive}/jet/payara/bin asadmin start-domain
※{drive}は、WindowsではJETのあるドライプ(c:¥など)、MacOSではホームフォルダ(~)です
※停止コマンドは asadmin stop-domain です 1010
ここから
1010 ここまで
4.MySQL の外部ボリュームを変更する
MySQL
のデータを記録するフォルダを変更するには、JET
のdocker
フォルダにあるdocker- compose.yuml
ファイルを書き換えます。ただし、書き換えは、MySQL
データベースを動かす 前に行ってください。すでに起動した後であれば、次のコマンドでインスタンスを削除します。これにより、それ までのデータはすべて消去されます。
docker-compose down
書き換える箇所は、
volumes:
の部分です。青字で示す部分を、変更したいフォルダのパスに 書き換えます。Windows
では、ドライブからの絶対パスで指定しないと正常に機能しないので、注意してください(例は
C
ドライブの場合)。また、Mac OS
では、"~"
はホームフォルダを意 味します。NetBeans
のメニューから、[ファイル]⇒[ファイルを開く]と選択して、docker-
compose.yuml
ファイルを開いて編集します。書き換えでは、インデントを変更しないようにしてください。また、タブを入力しないように注意してください。
Windows
volumes:- /c/mysql_data:/var/lib/mysql
Mac OS
volumes:- ~/mysql_data:/var/lib/mysql
書き換え後、保存して起動します。
docker-compose up -d 1040
ここから
1040 ここまで