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
プロジェクトを開いてみてください。また、ビルドして実行してみましょう。
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
ここまでisCallerInRole() で索引語にする
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 String key = externalContext.getRequestParameterMap().get("productId"); 87 Product e = productDb.find(Long.valueOf(key));
88 ByteArrayInputStream in = new ByteArrayInputStream(e.getPic_S()); 89 DefaultStreamedContent ds = new DefaultStreamedContent(in); 90 return ds;
91 }
p.〇
92 } 93
94 /* *****(画像表示処理<大画像>)************************/ 95 public StreamedContent getPicL() {
96 if (facesContext.getCurrentPhaseId() == PhaseId.RENDER_RESPONSE) { 97 return new DefaultStreamedContent();
98 } else {
99 String key = externalContext.getRequestParameterMap().get("productId"); 100 Product e = productDb.find(Long.valueOf(key));
101 ByteArrayInputStream in = new ByteArrayInputStream(e.getPic_L()); 102 DefaultStreamedContent ds = new DefaultStreamedContent(in); 103 return ds;
104 } 105 } 106
107 /* *****(メッセージを作成しキューに入れる)**************/ 108 public void facesMessage(String s) {
109 FacesMessage msg = new FacesMessage(s);
110 FacesContext.getCurrentInstance().addMessage(null, msg); 111 }
112 /* *****(エラーメッセージを作成しキューに入れる)**************/ 113 public void facesErrorMsg(String s) {
114 FacesMessage msg = new FacesMessage(s); 115 msg.setSeverity(FacesMessage.SEVERITY_ERROR); 116 FacesContext.getCurrentInstance().addMessage(null, msg); 117 } 118 /* *****(メッセージを作成しキューに入れる)***************** 119 FacesMessage.SEVERITY_FATAL 致命的エラー(4) 120 FacesMessage.SEVERITY_ERROR エラー(3) 121 FacesMessage.SEVERITY_WARN 警告(2) 122 FacesMessage.SEVERITY_WARN 情報(1) 123 *************************************************************/ 124 public void facesMessage(FacesMessage.Severity severity, String s) {
125 FacesMessage msg = new FacesMessage(s); 126 msg.setSeverity(severity);
127 FacesContext.getCurrentInstance().addMessage(null, msg); 128 }
129 /* *****(ログインしているユーザーの ID を返す */ 130 public String getUserId() {
131 return securityContext.getCallerPrincipal().getName(); 132 } // セッター・ゲッターは記載を省略 }
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/bin3 サーバーのデータベース設定(一般的な方法方法)
サーバー管理画面(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 です