兵どもが、夢のあとさき

JavaScript 系の言語に興味を惹かれ、まったりと更新しております

Netbeans + GlassFish

0. JDK のインストール

http://java.com/ja/download/manual.jsp から、『Windows オフライン(64ビット)』をダウンロード。実行(管理者権限が必要)

 

'14/02/09現在、デフォルトインストール先は、「C:\Program Files\Java\jdk1.7.0_51」となる。

 

JSKをインストールすることで、同時にJREもインストールされる。

 

環境変数JAVA_HOME』に、「C:\Program Files\Java\jdk1.7.0_51」を指定。(パスは適宜変更)

環境変数『PATH』に、「%JAVA_HOME%\bin」を設定

(*)上記、環境変数は、『管理者環境変数』ではなく『ユーザ環境変数』で良い。

 

1. Netbeans 

Webページ https://ja.netbeans.org/ (本家 https://netbeans.org/)

(1)インストール

 

https://netbeans.org/downloads/

 

先だって、JDK 及び JRE が必要。(JDKをインストールすれば、JREのインストールは不要)

 

NetbeansWindowsインストール(exe)版をダウンロードし、実行。パスは、デフォルトではなく c:\IDE 等の様にすると一般ユーザでもインストール可能。

 

*『OSに依存しないZIP』版を選択すると、なぜかCRCエラーが発生する。(MD5ハッシュは正しいにもかかわらず)

 

"C:\IDE\NetBeans 7.4\bin\netbeans64.exe" を起動

 

(2)日本語設定

 

http://1000g.5qk.jp/2011/01/22/netbeans%E3%81%AE%E6%97%A5%E6%9C%AC%E8%AA%9E%E5%87%BA%E5%8A%9B%E3%81%8C%E6%96%87%E5%AD%97%E5%8C%96%E3%81%91%E3%81%99%E3%82%8B%E3%81%A8%E3%81%8D/

http://yoshi-taka.info/wordpress/blog/2012/08/17/netbeans%E3%81%AE%E6%96%87%E5%AD%97%E3%82%B3%E3%83%BC%E3%83%89%E3%82%92utf-%EF%BC%98%E3%81%AB%E8%A8%AD%E5%AE%9A%E3%81%99%E3%82%8B/

 

等が勉強になります。

 

 

(3)Webアプリケーション開発入門(日本語版)

 

https://netbeans.org/kb/docs/web/quickstart-webapps_ja.html

 

入力した日本語文字が化ける。

 

以下のように、プロジェクト「毎の」構成ファイルのフォルダーにある glassfish-web.xml に parameter-encoding を追加する。

 

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE glassfish-web-app PUBLIC "-//GlassFish.org//DTD GlassFish Application Server 3.1 Servlet 3.0//EN" "http://glassfish.org/dtds/glassfish-web-app_3_0-1.dtd">

<glassfish-web-app error-url="">

 <context-root>/HelloWeb</context-root>

 <class-loader delegate="true"/>

 <jsp-config>

   <property name="keepgenerated" value="true">

     <description>Keep a copy of the generated servlet class' java code.</description>

   </property>

 </jsp-config>

 <parameter-encoding default-charset="UTF-8" />

</glassfish-web-app>

 

 

*追記

glassfish のインストールおよび起動、停止はNetbeans上で行わず、「4. glassfish 起動/停止/再起動」のコマンドラインを使用すること。Netbeans上では、うまく起動できない場合がある。(というかうまくいった試しが無い)

 

 

2. 補完

Ctrl + SPACE (基本形)

ALT + Insert (メソッド getter(), setter() 等)

Ctrl + 8 (FORM部品などのパレット)

 

3. (欠番)

4. glassfish 起動/停止/再起動

(0)インストール

 

https://glassfish.java.net/download.html から、マルチリンガル版『glassfish-4.0-ml.zip』をダウンロード。解凍。

glassfish4 というフォルダができるので、c:\ の配下に移動。

 

cd c:\glassfish\bin

asadmin create-domain domain1 で「ドメイン」が作成される。

 

 

 

(1)glassfish 起動

 

C:\glassfish4\bin>asadmin start-domain

 

デフォルトの「インスタント名」『domain1』、port 8080 で起動。

port 8009 で、apache と連携する。

port 4848 は管理サーバ

 

 

(2)glassfish 停止

 

C:\glassfish4\bin>asadmin stop-domain

 

 

(3)glassfish 再起動

 

C:\glassfish4\bin>asadmin restart-domain

 

 

(4)glassfishドメイン(インスタンス)の追加

 

C:\glassfish4\bin>asadmin create-domain 『ドメイン名』

(ポートは自動的に割り当てられる)

 

C:\glassfish4\bin>asadmin create-domain domain1

Enter admin user name [Enter to accept default "admin" / no password]>

Using default port 4848 for Admin.

Using default port 8080 for HTTP Instance.

Using default port 7676 for JMS.

Using default port 3700 for IIOP.

Using default port 8181 for HTTP_SSL.(← オレオレ証明書)

Using default port 3820 for IIOP_SSL.

Using default port 3920 for IIOP_MUTUALAUTH.

Using default port 8686 for JMX_ADMIN.

Using default port 6666 for OSGI_SHELL.

Using default port 9009 for JAVA_DEBUGGER.

Distinguished Name of the self-signed X.509 Server Certificate is:

[CN=OWNER-PC,OU=GlassFish,O=Oracle Corporation,L=Santa Clara,ST=California,C=US]

 

Distinguished Name of the self-signed X.509 Server Certificate is:

[CN=OWNER-PC-instance,OU=GlassFish,O=Oracle Corporation,L=Santa Clara,ST=California,C=US]

Domain domain1 created.

Domain domain1 admin port is 4848.

Domain domain1 allows admin login as user "admin" with no password.

Command create-domain executed successfully.

 

 

* 自動で、オレオレ証明書も発行される。ブラウザへのインポートの方法は下記

 

 

(5)glassfish のルートドキュメント

 

C:\glassfish4\glassfish\domains\『ドメイン名』\docroot\index.html

 

 

(6)https連携

 

 

 

5. Apache との連携

httpd.conf を修正

 

(1)モジュールを読み込むあたりに、下記を追記

 

#

# 2013/12/15 glassfish 連携用モジュール。mod_jk.so は元から存在していた。

#

LoadModule jk_module modules/mod_jk.so

 

 

(2) httpd.conf の最後に、下記を追記

 

#

# GlassFish の設定を行う

#

 

<IfModule mod_jk.c>

 

   JkWorkersFile conf/extra/workers.properties

    

   # Where to put jk logs

JkLogFile /xampp/apache/logs/mod_jk.log

# Set the jk log level [debug/error/info]

JkLogLevel debug

# Select the log format

JkLogStampFormat "[%a %b %d %H:%M:%S %Y] "

# JkOptions indicate to send SSL KEY SIZE,

JkOptions +ForwardKeySize +ForwardURICompat -ForwardDirectories

# JkRequestLogFormat set the request format

JkRequestLogFormat "%w %V %T"

 

# Send all jsp requests to GlassFish

# すべての *.jsp ファイルは、glassfish の『ドメイン』/docroot/*.jsp に転送する

JkMount /*.jsp worker1

 

# /glassfish-test/* ファイルは、すべて、glassfish の 『ドメイン』/docroot/glassfish-test/* に転送する

# Apache 側に、glassfish-test フォルダがある必要はない

JkMount /glassfish-test/* worker1

 

</IfModule>

 

 

(3) conf/extra/workers.properties を新規作成。下記を記載

 

#

# glassfish 連携設定。address:port

# 2013/12/15 作成

#

worker.list=worker1

worker.worker1.type=ajp13

worker.worker1.host=127.0.0.1

worker.worker1.port=8009

 

 

apacheglassfish を再起動。

 

 

(4) glassfishのサーバインスタンスが複数ある場合(port52475)

 

わからん

 

 

7. HTTPS/SSL

正当なサーバ証明書が登録されていなため、https://~:8080/ へアクセスすると、『このサイトのセキュリティ証明書は信頼できません』と「警告」が表示される。

 

そこで、以下の手順で自己サーバ証明書をインストールする(以下、Chromeの場合)。Apache(80)、glassfish(8080)双方が立ち上がっている場合には、別々に証明書のインポートが必要(連携した場合の手順は調査中)

 

まず、現在の自己サーバ証明書をエクスポートする

 

1. 「警告」の表示された画面の左上鍵に×印がマークをクリック。

2.『証明書情報』をクリック

3.『詳細』タブをクリック

4. 「ファイルにコピー」→「次へ」

5.3番目の「Cryptographic Message Syntax Standard PKCS #7 証明書 (.P7B)(C)」を選択、「次へ」

6.「ファイル名」を『ssl』として、適当なフォルダにエクスポートする。

7.「次へ」「完了」で『正しくエキスポートされました。』と表示されれば、エキスポートは完了

8. 「OK」で終了

 

次に、インポート処理

 

1.Chrome の「設定」から『証明書』で検索。HTTPS/SSL 『証明書の管理』ボタンが表示される。『証明書の管理』をクリック

2. 「インポート」「次へ」

3. 『信頼された証明機関』タブを選択 (*** 重要 ***)

4. エクスポート時(6)で指定したファイルを選択。その際、『PKCS #7 証明書(*.spc;*.p7b)』を選択すること

5. 「次へ」(証明書を次のストアへ配置する(P) [信頼されたルート証明書])

6. 「完了」「はい」「OK」

 

Chromeを再起動

 

 

発行者はOracleのままなので、ここを変更したければ OpenSSL で自己署名証明書を作成するか、http://vertex.air-nifty.com/blog/2009/07/glassfishssl-3b.html を参照のこと。

 

8. データベース連携(JPA)

「ソースパッケージ」を右クリック → 「新規」「データベースからのエンティティクラス」

 次に、ファイル・ウィザードで「持続性」カテゴリを選択し、「データベースからのエンティティ・クラス」を選択

 

「新しいデータソース」

→「JNDI」(何でも良い。例 jdbc/mysql_bk)

→「データベース接続」→『データベース新規接続』(既に存在する場合には、『jdbc:mysql://localhost:3306/bk』を選択)

→「ドライバ」を『MySQL (Connector/J driver)』を選択

→「ドライバ・ファイル」を『c:\IDE\NetBeans 7.4\ide\modules\ext\mysql-connector-java-5.1.23.jar』

「次へ」

「データベース」名を変更『mysql』→『bk』

「パスワード」を設定し、「接続をテスト」を実施

 

 

 

 

下記の2つの設定ファイルが生成される。

 

JPA (Java Persistence API)

既存のRDBMSから、EJBのO/Rマッパーを自動生成する。

 

「プロジェクト」を選択し、「構成ファイル」「persistence.xml」で確認。

(位置 c:\「ユーザ」/『ユーザ名』/「マイドキュメント」/「NetbeansProjects」/『プロジェクト名』/src/)

 

一例

 

<?xml version="1.0" encoding="UTF-8"?>

<persistence version="2.1" xmlns="http://xmlns.jcp.org/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd">

 <persistence-unit name="HelloJavaEE6PU" transaction-type="JTA">/* <= 接続性ユニット名 */

   <jta-data-source>q</jta-data-source>

   <exclude-unlisted-classes>false</exclude-unlisted-classes>

   <properties/>

 </persistence-unit>

</persistence>

 

 

<persistence-unit name="***" transaction-type="JTA"> の『***』が「接続性ユニット名」

<jta-data-source>***</jta-data-source> の『***』がデータベース接続の「データソース」名?

 

 

 

 

glassfish リソース情報

 

glassfish4 から、RDBへアクセスする際の情報を格納する。

 

(2)「サーバ・リソース」→「glassfish-resource.xml

(位置 c:\「ユーザ」/『ユーザ名』/「マイドキュメント」/「NetbeansProjects」/『プロジェクト名』/)

 

一例

 

 

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE resources PUBLIC "-//GlassFish.org//DTD GlassFish Application Server 3.1 Resource Definitions//EN" "http://glassfish.org/dtds/glassfish-resources_1_5.dtd">

<resources>

   <jdbc-connection-pool allow-non-component-callers="false" associate-with-thread="false" connection-creation-retry-attempts="0" connection-creation-retry-interval-in-seconds="10" connection-leak-reclaim="false" connection-leak-timeout-in-seconds="0" connection-validation-method="table" datasource-classname="com.mysql.jdbc.jdbc2.optional.MysqlDataSource" fail-all-connections="false" idle-timeout-in-seconds="300" is-connection-validation-required="false" is-isolation-level-guaranteed="true" lazy-connection-association="false" lazy-connection-enlistment="false" match-connections="false" max-connection-usage-count="0" max-pool-size="32" max-wait-time-in-millis="60000" name="connectionPool" non-transactional-connections="false" ping="false" pool-resize-quantity="2" pooling="true" res-type="javax.sql.DataSource" statement-cache-size="0" statement-leak-reclaim="false" statement-leak-timeout-in-seconds="0" statement-timeout-in-seconds="-1" steady-pool-size="8" validate-atmost-once-period-in-seconds="0" wrap-jdbc-objects="true">

       <property name="URL" value="jdbc:mysql://localhost:3306/bk"/>

       <property name="User" value="root"/>

       <property name="Password" value="***************"/>

   </jdbc-connection-pool>

   <jdbc-resource enabled="true" jndi-name="library" object-type="user" pool-name="connectionPool"/>

</resources>

 

9. ビルド失敗

C:\Users\『ユーザ名』\Documents\NetBeansProjects\TEST\build\webにインプレース・デプロイメント

GlassFish Server, deploy, Connection refused: connect, false

C:\Users\『ユーザ名』\Documents\NetBeansProjects\TEST\nbproject\build-impl.xml:1045: モジュールはデプロイされませんでした。

詳細は、サーバーのログ・ファイルを参照してください。

ビルド失敗(合計時間: 3秒)

 

(1) glassfish が停止している

 

c:\glassfish4\bin\asadmin start-domain domain1

 

(2) glassfishデバッグモードで実行してみる(詳細なログを吐き出すので、Warning 等に注意!)

 

C:\glassfish4\bin>asadmin start-domain --debug domain1

 

というか、動的Warningも吐き出すので、運用時にもデバッグモードで起動した方が良くないか?これ。

 

 

(3) persistence.xml のチェック

 

特に、「データ・ソース」が正しいかを確認。データソースが異なっていてもコンパイル時にエラーとならない!

 

(4) プロジェクトを選択して、右クリック。『消去してビルド』でビルドし直す。これでうまくいく場合もある。

 

10. デプロイ失敗

デプロイに成功すると、通常『サーバルート』/domains/『ドメイン名』/applications/『コンテキスト名』/ 配下に関連ファイルが展開される。しかし、ライブラリの不足などの場合エラーが発生する。下記に従いチェックをすること。

 

 

 

(1)『デプロイメント中にエラーが発生しました: Exception while preparing the app : Invalid resource : jdbc/mysql_library_ppp__pm。詳細はserver.logを参照してください。』

 

新しいサーバ側の、「JDBC接続プール」に、『jdbc/mysql_library_ppp』(__pm を抜いた表記)がない。

管理サーバから、新規の「JDBC接続プール」を登録する。

 

 

(2)『デプロイメント中にエラーが発生しました: アプリケーション[TEST]のデプロイ中に例外が発生しました : Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.5.0.v20130507-3faac2b): org.eclipse.persistence.exceptions.DatabaseException Internal Exception: java.sql.SQLException: 接続の割当でエラーが発生しました。原因: Class name is wrong or classpath is not set for : com.mysql.jdbc.jdbc2.optional.MysqlDataSource Error Code: 0。詳細はserver.logを参照してください。』

 

データベースドライバ(上記の場合 connector/J)が認識できない。

『サーバルート』/domains/『ドメイン名』/lib/ 配下に、『mysql-connector-java-5.1.23-bin.jar』を配備し、

glassfishサーバの「再起動」を行った後、再デプロイする。

 

11. キャッシュの位置

一度IDEを停止し、『ユーザ』/『ユーザ名』/AppData/Local/NetBeans/Cache/7.4/ 配下のすべてのファイル、フォルダを削除。その後、IDEを再起動。

どうしてもうまくいかない場合の裏ワザ。

 

12. glassfish と データベースの接続

データ・ソースとコネクションプール(https://netbeans.org/kb/docs/javaee/ecommerce/connect-db_ja.html?print=yes#createConnPoolDataSource)

 

方法1

glassfishの管理サーバから、以下の2つを登録する。

 

(1)JDBCコネクションプール

データベースと接続済みのコネクション群。いちいち接続、切断を行っていてはリソースの無駄なので、glassfish等の

アプリケーションサーバは、プールから適時取得してそれを使用する。

 

(1)STEP.1

リソースタイプjava.sql.DataSource

データソース・クラス名com.mysql.jdbc2.optional.MysqlDataSource

データベースドライバベンダMySQL

 

(2)STEP.2

USERMySQLユーザ

PASSWORDMySQLユーザのパスワード

SERVERNAME『localhost

PORT3306

DATABASENAME『bk』

URLjdbc:mysql://ホスト:ポート/データベース名

 

 

(2)JDBCリソース

javaアプリケーションが、ORACLE, MySQL等のリレーショナルデータベースと接続するリソースを表す。

アプリケーション(JPA)で指定(persistence.xmlファイルの<jta-data-source>)した「リソース名」と名称を一致させること

 

方法2

NetBeansからアプリケーション作成画面から設定

 

(1)データソース

『パッケージ名』→「新規」→「データベースからのエンティティクラス」→「データ・ソース」の選択。(新規登録)

データベースの必要な「表」を選択。「次」→「終了」で、新規に「データ・ソース」が作成される。

 

「プロジェクト」タブに、『構成ファイル』『persistence.xml』が生成されるので、「データ・ソース」を上記と合わせる。

キャッシュも不要?。<= RDBMSの静的データと動的データで区別できないか?

 

 

ビルドすると、「サーバ・リソース」「glassfish-resources.xml」が生成される。サーバ名、ポート番号、ユーザ名、パスワード、

上記で指定した、「データ・ソース」「プールネーム(自動生成?)」が記載されている。はず。

 

 

設定は、glassfishの管理画面(http://localhost:4848/)の、『JDBC』→『JDBC Resource』,『JDBC ConnectionPool』で確認可能。

この画面からも設定の変更も可能だが、日本語は使用しないこと。

 

13. 文字化け

GlassFishのデフォルトではユーザーがWeb画面に入力した日本語(HTTPリクエストに含まれる日本語)が文字化けするため、

NetBeansからGlassFish文字コードの設定を変更する。

 

ファイル→新規ファイルからGlassFishの設定ファイルを作成する。

プロジェクトに-warの名前のプロジェクトを選び、カテゴリ:GlassFishのファイル・タイプ:GlassFishディスクリプタを選択し、次へ。

 

XMLタブを開き、<parameter-encoding default-charset="UTF-8"/>を下記の位置に入力し、保存する。

 

http://dotstyle.net/csr/?GlassFish%A4%CE%C0%DF%C4%EA

 

14. JSON

JSONICライブラリを使用する。ダウンロードして、解凍。『jsonic-1.3.0.jar』を「CLASS_PATH」に放り込む。

 

使い方は、

 

 

package jsonicsample;

import net.arnx.jsonic.JSON;

 

/**

 *

 * @author shogorobe

 */

public class JsonicSample {

 

    private static final int MAX = 5;

 

    // Just POJO

    private static class User {

 

        public String aaa;

        public int bbb;

        public String ccc;

    }

 

    public static void main(String args) {

 

        User jsonObject = new User[MAX];  // 宣言するだけではNG

        for (int i = 0; i < MAX; i++) {

            jsonObject[i] = new User();     // jsonObject をひとつひとつ new しないと NullPointerError となる

        }

 

        User jsonObject2 = new User[MAX];

        for (int i = 0; i < MAX; i++) {

            jsonObject2[i] = new User();

        }

 

        try {

            

            jsonObject[0].aaa = "山縣有朋";

            jsonObject[0].bbb = 83;

            jsonObject[0].ccc = "<---\"'--->";

 

            jsonObject[1].aaa = "乃木希典";

            jsonObject[1].bbb = 62;

            jsonObject[1].ccc = "<&>\"'/";

 

            jsonObject[6].aaa = "東郷平八郎";

 

        } catch (ArrayIndexOutOfBoundsException e) {

            System.err.println("配列オーバー");

        }

 

        // エンコード(classの配列を渡す。配列でない場合も同様)

        String jsonText = JSON.encode(jsonObject);

        System.out.println(jsonText);

 

        // デコード (class が単数の場合は、『User.class』、配列の場合には『User.class』を渡す)

        jsonObject2 = JSON.decode(jsonText, User.class); // String を POJO へ変換する(『User.class』が重要)

        // ... = JSON.decode(jsonText, User.class); class が配列でない場合には、User.class を

        System.out.println(jsonObject2[1].ccc);

    }

 

}

 

こんな感じ。