「Web開発」カテゴリーアーカイブ

Web開発でApache POIを使用する際に注意する事

Web開発では帳票をExcelで出力する際に「Apache POI」がよく使用されています。
ただ「Apache POI」を使用する場合、システム的な制限やリソースなど事前に注意しておくべき点があるのでメモしておきます。

Apache POIの問題点

  • 「xlsx」形式のファイルの場合、リソースを大量に消費する
    POIを使用する場合、出力帳票のテンプレートファイルを用意して帳票を出力するケースが多いと思われます。このテンプレートファイルの拡張子がEXCEL2007以降の形式「xlsx」で用意されている場合、POIでは一旦そのファイルを全てメモリに読み込ませる為により多くのリソース(メモリ)を消費する事になります。
  • セル結合処理は非常に遅い
    POIでEXCEL操作する場合、セル結合処理は非常に処理速度が遅くなるので帳票のフォーマットを決める場合はセル結合しないフォーマットで設計しておいた方が懸命です。

UTF-8のBOM有り、BOM無しの違いとは

エディタなどで文字コードを指定する際「BOM有り」と「BOM無し」という選択肢があります。この「BOM」とは何かをまとめておきます。

BOMとは?

    まずBOMとは「バイトオーダーマーク (byte order mark) 」の略語となります。
    バイトオーダーマークとはUnicode形式のデータを「ビッグエンディアン」、「リトルエンディアン」のどちらで保存しているのかという情報をデータの先頭に付与する情報のことです。
    UTF-8の場合、先頭に3バイトのバイナリデータ「0xEF 0xBB 0xBF」が付与されたものが「BOM有り」の状態。付与されていない場合が「BOM無し」の状態となります。

どういう場合に「BOM有り」、「BOM無し」を使い分けるか?

  • Unicodeの規格ではBOMは推奨していません。
  • Web制作などでHTMLやPHPなどをエディタで編集する際はBOM無しを選択した方が一般的には問題は起こりにくいので無難です。但し、必ずしもBOM無しが正解というわけではないのは認識しておきましょう。
  • 「Microsoft Office Excel」などはBOMがないとUTF-8だと認識できず、種々の問題が起こる。
  • 基本的にはアプリケーション側でBOM有りが推奨されているケース以外ではBOM無しをデフォルト設定しておけば良いかと思われます。

JUnit:privateメソッドを実行(テスト)する方法

JUnitでテストする時にprivateメソッドをテストする方法をご紹介します。
privateメソッドをテストするにはリフレクション「java.lang.reflect.Method」を使用することで実行可能となります。

Javaソース

JUnitサンプル

JUnit:private変数を取得・更新する方法

JUnitでテストする時にprivateなメンバ変数を取得・更新したい場合の方法をご紹介します。
今回はAPI「JMockit」の「Deencapsulation」クラスを使用してカプセル化された変数を参照・更新する方法です。

JMokitのダウンロード

    以下サイトへアクセスしてダウンロードした「jmockit.jar」ファイルをクラスパスへ追加します。
    クラスパスへ追加する際、JUnitより先に読み込む必要があるのでJUnitより上位へ配置します。
    JMokitのダウンロード

JMokitのJavadoc

Javaソース

JUnitサンプル

djUnitでのプライベートコンストラクタのテスト方法

javaではUtilクラスなどのコンストラクタは無駄なインスタンス化を抑制するためにコンストラクタの修飾子をprivateにする事がよくあります。ただdjUnitで試験する場合にはコンストラクタを呼び出したくても修飾子がprivateになっていてはインスタンス化が出来ずに呼び出せないのでカバレッジを100%に出来ません。そういう場合にプライベートコンストラクタをテストする方法についてメモしておきます。

Javaソース

JUnitサンプル

djUnitを実行してクラス名の行が未実行になる

基本的な事ですがjavaのテストでdjUnitを使用していると以下の様にクラス名を指定している行が未実行になってしまうという事がありました。
この原因と対応方法についてメモして置きます。

クラス名が未実行となる原因

  • コンストラクタが定義されていない。

対応方法

  • 以下の様にコンストラクタを定義します。

    未実行の箇所がクラス名の行からコンストラクタの行へ変化したのがわかります。後はコンストラクタ用のテストメソッドを記述すれば全て実行済となります。

IEに互換表示をさせない「X-UA-Compatible」の指定方法

Web開発者泣かせでお馴染みのIEにはIEの過去バージョンモードで表示出来る互換表示機能があります。
しかし互換表示することで表示が崩れてしまう場合、デフォルトでは互換表示させたくないケースが多々あります。
そういう場合にはmetaタグで「X-UA-Compatible」を指定する事で互換モードではなく、使用しているIEの各バージョンの標準モードでレンダリングさせる事が可能となります。

使用しているIEの各バージョン毎でレンダリング

    使用しているIEの各バージョン毎でレンダリングさせたい場合は「X-UA-Compatible」へ「IE=edge」を指定します。

IEのバージョン固定でレンダリング

    特定のIEのバージョン固定でレンダリングさせたい場合は「X-UA-Compatible」へIE8なら「IE=8」、IE11なら「IE=11」を指定します。
    例えば「IE=8」を指定した場合、ブラウザのバージョンはIE11でもIE8の互換モードでレンダリングされます。

jbossとtomcatの違い

Web開発では必ずアプリケーションサーバ(APサーバ)とかWebサーバなどという言葉が出てきます。
ここでは「アプリケーションサーバ」とは何者なのか、またこの「アプリケーションサーバー」として使用されている「JBoss」と「Tomcat」の機能や違いについて整理しておきます。
その前に「アプリケーションサーバ」って何?という方もいると思いますので、簡単にまとめておきます。

アプリケーションサーバとは

  • Webシステム開発する上で構成される「プレゼンテーション層」「アプリケーション層」、「データ層」の3階層モデルにおいて、「アプリケーション層」のプログラムを実行するサーバーのこと。
  • アプリケーションサーバで提供するのは基本的に以下の3つとなります。
    • Javaなどのプログラム実行環境やデータベースへの接続機能の提供。
    • 複数の処理(スレッド)を連結するトランザクション管理機能。
    • 業務処理の流れを制御するビジネスロジックの実装。

Jbossとは

  • EJB(Enterprise JavaBeans)のオープンソース実装であるJavaによるオープンソースソフトウェア開発コミュニティのこと。
  • JBossはEJB(J2EE対応アプリケーション)を動作させるためのサーバソフトウェアとして利用されています。本来JSPやサーブレットは動作しませんが、これらを動作させるためにWebコンテナとしてTomcatを採用しています。
  • Jbossで提供される機能は「JTAトランザクションマネージャ」、「EJB」、「MDB」、「JPA」、「JMS」、「JCA」、「JAX-WS」、「JMX」、「log4jを用いたログ基盤」、「分散キャッシュなどの各種クラスタリングサービス」などがあります。

Tomcatとは

  • Apache Tomcat Project内で開発されているオープンソースのソフトウェア。
  • JavaサーブレットやJSPを処理するアプリケーションサーバ(APサーバ)/サーブレットコンテナの一つ。
  • 単独でWebサーバとして動作することも可能。
  • 実際にはプラグインとしての利用が主流となっています。
  • Tomcatで提供される機能は基本的にServlet, JSP, JDBC接続プールのみ。

とつらつら書いてみましたが、要はJbossもTomcatも「JavaをWeb(ブラウザ)上で動かすためのプログラム」という感じで理解しておけば最初の内はいいのかなあと思います。ただTomcatでは使用出来る機能が限られる為、Tomcatの機能も包含しているJBossを使用しているケースが最近は多いようです。

インスタンス変数とローカル変数の違い

Webシステムは基本的に複数人で同時利用されるのが前提のため、マルチスレッドアクセスを考慮した設計・実装を行う必要があります。業務でJavaの各変数とスレッドセーフについて考える機会があったので、「インスタンス変数とローカル変数の違いとスレッドセーフとの関係」について今回は整理してみようと思います。

Javaでの変数毎のメモリ管理イメージ


    上記は変数毎のメモリ管理イメージとなります。Javaではクラス変数やインスタンス変数はヒープ領域と呼ばれる共有メモリ領域へ保存されます。複数のスレッドで共有され別のスレッドに書き換えられる可能性があり,スレッドセーフではありません。対してローカル変数はJavaスタックと呼ばれるスレッド固有メモリ領域へ保存されます。スレッド固有領域なので別のスレッドに書き換えられる可能性はないのでスレッドセーフとなります。

インスタンス変数とは

  • サンプルコード
  • メソッドの外に記述します。staticは付けません(staticが付くとクラス変数になります)。
  • ヒープ領域と呼ばれる共有メモリ領域へ保存される為、宣言しただけではスレッドセーフにはなりません。
  • スレッドセーフを保つ為には初期化する必要があります。
    • コンスラクタで初期化
    • インスタンス宣言時に初期化
    • 最初のget時に初期化
  • 他のスレッドからの更新を防ぐ為、修飾子はprivateにする必要があります。
  • 当該クラス内の任意のメソッドから参照可能となります。

ローカル変数とは

  • サンプルコード
  • メソッド内に記述します。
  • そのメソッドが実行中の間だけ有効となります。
  • Javaスタックと呼ばれるスレッド固有メモリ領域へ保存される為、スレッドセーフとなります。

DTOとVOの違い

様々な業務でシステム開発をしているとDTOやVOというクラスが出てきて違いが曖昧になってくる事があるので両者の違いについて整理しておきます。

DTO(Data Transfer Object)

  • 基本的には値をまとめて受け渡す事のみを目的とするクラス。
  • DTO(Data Transfer Object)はデザインパターンの一つ。
  • 過去、J2EEではVO(Value Objects)と呼ばれていた。
  • VOとは違い、値は変更可能なのでsetterメソッドを持つ。

VO(Value Objects)

  • VO(Value Objects)もデザインパターンの一つ。
  • インスタンスコンストラクタでプロパティを初期化してプロパティの変更(set)は外から出来ないようにするクラス。
  • VOは不変である事が前提のため、MVC間で使用する場合にはDTOを用いた方が相性が良い。
  • VOクラス例