タグ「Java」が付けられているもの

Strutsの<bean:write>で数値フォーマットに整形した値を出力するの続編として、お送りします。

Date型を持つ値を「2007/11/22」の様に、整形した値で出力したいときがありますよね。
Strutsの場合、Date型の変数を日付フォーマットで整形した値を出力する方法があるようです。

忘れっぽいエンジニアのJakarta Strutsリファレンス - 日付フォーマットを指定してプロパティを出力する<bean:write>

実は、前回の記事からも上記のリンクはたどり着けるのですが、残念なことに、現在、参考先サイトのコードにはミスがあったので、それも含めてコードの解説をします。

<bean:write name="usrdata" property="dateData" format="yyyy/MM/dd" />
<bean:write name="usrdata" property="dateData" format="yyyy/MM/dd HH:mm:ss" />
赤字にした部分は月を出力するようフォーマットの設定ですが、そのMMの部分が参考先サイトでは小文字でmmとなっています。2行目の時間出力まで含めたformat要素を見ていただけるとお分かりかとは思いますが、月を意図してmmとしてしまうと、その部分には分が表示されてしまいます。

単純なミスだとは思うのですが、試しに参考先サイトのformatのまま記述してしまうと、「2007/30/22」の様なもの凄い出力がされるということでして、楽しんでみてください(ぇ?w

以上、備忘録でした。

iTextを用いてJava ServletからPDFを作成する

現在JSP & Java Servletを用いてWebアプリケーションを開発していますが、PDFの帳票出力が必要になりました。色々調べてみると、JavaプログラムからPDFを出力するためのライブラリが無料で公開されており、意外に簡単にできそうなのです。

CodeZine - iTextを利用してJavaからPDF形式の帳票を出力する
※会員登録することで、iTextを用いたサンプルWebプログラムをダウンロードすることができます。

サイト内のソース解説を見ていただければお分かりの通り、カプセル化のカプセル化で作成する形なので、オブジェクト指向が分かる方には(もしかしたらそうでない方も含め)コーディングしやすいのかななんて感じます。

PDFの中に自分の名前が入るとかたまらないですね(≧∇≦)(何)


解説するもの全て上記サイトで解説されつくしている感じなので、今回はiTextのサンプルプログラムをEclipseに読み込ませようとしたときのトラブルについて対処法を記述しておきます。

Eclipseのワークスペースに、展開したiTextのサンプルプログラムを配置したところ、正しく動作しませんでした。

Unable to find a javac compiler;
com.sun.tools.javac.Main is not on the classpath.
Perhaps JAVA_HOME does not point to the JDK
みたいなエラーがでたので、ググってみたところ、同様の症状が出た場合の対処法が書かれているサイトを見つけました。

Eclipse 3.2 日本語版の場合、[ウインドウ(W)]→[設定(P)...]→[Tomcat]→[JVM設定]の「クラスパス (生成されたクラスパスの前)」で[Jar/Zip]ボタンをクリックし、「%JAVA_HOME%\\lib\tools.jar」のライブラリを追加してください。
※「%JAVA_HOME%」はJDK 5.0、または、J2SDK 1.4をインストールしたトップフォルダのことです。

サンプルプログラムなのに、ソースを確認したら赤字だらけだって方は、Eclipseを起動すると左側に位置する[パッケージ・エクスプローラー]に存在すると思います。iTextのアプリケーションフォルダを右クリックし、[プロパティ(R)]→[Java のビルドパス]→[ライブラリー(L)]タブを開きます。[JAR の追加(J)...]で、「(iTextのサンプルプログラム)\WEB-INF\lib」の下にある「itext-1.3.jar」と「iText-Asian.jar」を選択し、[OK]ボタンをクリックします。
パッケージ・エクスプローラーのiTextフォルダに先ほどクリックした2つのファイルが表示されれば、赤字だったソースの箇所が消えていると思います。

こんな感じでJavaからPDFを作成してみましょ〜。

Javaの全角文字列チェック関数

先日、Javaプログラムで、その文字列が全角文字列のみどうかチェックするメソッドを作る必要がありました。
ググって見たところ、各種共通関数 - 文字列チェック関数(全角文字のチェック)を見つけました。

公開されているソースをそのまま流用しても実装可能なのですが、見た感じデバック用と思われるコードが残っているみたいです。それをスッキリさせ、意味もなく文字コードをShift_JISではなく、Windows-31Jに変更したコードを作ってみました。

public boolean ChkZen(String inBuff){

// 文字列が null もしくは、長さ 0 のときは false
if( (inBuff == null)||(inBuff.length() == 0) ) {
return false;
}

byte[] bytData = null;
String strChar = null;
boolean flgSingle = false;
for(int i=0 ; i < inBuff.length() ; i++ ){
try{
strChar = inBuff.substring(i,i+1);
bytData = strChar.getBytes("Windows-31J");
if( bytData.length != 2 ){
flgSingle = true;
}
} catch(Exception e){
flgSingle = false;
}
}

return !(flgSingle);
}

本家で公開されているコードと挙動を別にしてみたのは、入力される文字列がnull、または、文字列の長さが0の場合はfalseにしてみました。全角文字が入力されている訳ではないという考え方前提ってことで。

今回、このエントリーを投稿するに辺り、様々な言語の有用な関数群を公開してくださっている納谷明隆さんには感謝致します。
この場を借りて御礼申し上げます。

「5300」のような値を「5,900」と出力したい場合、色々と面倒ですよね。
しかし、Strutsの場合、long型やdouble型の基本型を数値フォーマットで整形した値を出力する方法があるようです。

忘れっぽいエンジニアのJakarta Strutsリファレンス - 数値フォーマットを指定してプロパティを出力する<bean:write>

とりあえず、ここで説明しなくても分かりやすい内容が上記のリンクにあるのでご参考に。

<bean:write name="usrdata" property="intData" format="###,###,###" />
<bean:write name="usrdata" property="doubleData" format="##0.0##" />

とか、本当便利ですね。
format属性作った人偉い!
むしろエロい!

以上、備忘録でした。

StrutsのActionFormを使っていると、validator()メソッドが結構便利です。
しかし、普通のActionServletでActionErrorを呼び出してエラーを表示させたい場合もあるじゃないですか。

そのための方法が、忘れっぽいエンジニアのJakarta Strutsリファレンス -
アクションクラスで生成したエラーのエラーメッセージを表示する<html:errors>に書かれていました。

ポイントは、

ActionMessages errors = new ActionMessages();
errors.add("userId", new ActionMessage("errors.required","ユーザーID"));
errors.add("userName", new ActionMessage("errors.invalid","名称"));

のようにActionMessageを用いてエラーを作成し、
saveErrors(request, errors);
return mapping.findForward("error");

のように、saveErrors(HttpServletRequest, ActionMessage)のメソッドを呼び出してから、findForward()メソッドを実行してやれば良いと。

簡単ですね。
そんなわけで備忘録としておいておきます∠( ̄∧ ̄)

Javaにおける論理演算子を復習すると共に、NullPointerExceptionへの対処法についての紹介をします。

Javaにおける論理演算子は4つあります。

AND演算が「&&」と「&」の2つ
OR演算が「||」と「|」の2つ
の計4個です。

つまり、同じ論理演算において、同じ記号を2回重ねるものと、1回だけのものが存在しているわけです。これらの違いは短絡評価をするかしないかにあります。
Javaの論理演算における短絡評価とは、左辺の評価を以てその論理演算が決定する場合、右辺の評価を行わないということです。

AND演算を例に挙げると、左辺が偽(false)、右辺が真(true)の論理演算があるとします。
短絡評価をするAND演算子「&&」(&が2つ)を用いて、「( (左辺) && (右辺) )」の論理演算を行うと、左辺の時点でfalseになったので、その後、右辺の評価を行わずに「( (左辺) && (右辺) )」全体の演算結果としてfalseを返します。
短絡評価をするAND演算子「&」(&が1つ)を用いて、「( (左辺) & (右辺) )」の論理演算を行うと、左辺の時点でfalseと分かっていても、その後、右辺の評価を行い、「( (左辺) && (右辺) )」全体の演算結果は「偽、かつ、真」なのでfalseを返します。

これを用いることで、NullPointerExceptionに対処することができます。
実際のコードを用いて説明しましょう。

String str = null;
の場合で、
if( (str != null) && (str.equals("hoge") ) { doSomeMethod(); }
の条件式の場合、「&&」は短絡評価をするので右辺の条件式「(str.equals("hoge);」は評価されません。もし、左辺の評価式がない、または、AND演算子を「&」にしてしまうと、右辺の「(str.equals("hoge")」を評価することになるので、参照が存在しないstr変数に対し何かの処理を行うことになります。これが「NullPointerException」が発生する原因であり、上記の様なコードにすることで「NullPointerException」を見事に抑えることができました。

ただ、ここで注意しなくてはいけないソースがあります。
俺もやったことがあるのですが、上のような考え方のつもりで、以下のようにコーディングしてしまうとエラーが発生し、プログラムとして全く意味がありません。

if( (str != null) & (str.equals("hoge") ) { doSomeMethod(); }
または
if( (str == null) && (str.equals("hoge") ) { doSomeMethod(); }

前者は、ここで「&」と「&&」の意味を説明したので今は大丈夫だとは思いますが、問題は後者です。
後者のソースを記述したのに、null対策をしているんだって思いこんでいたことで、見事にNullPointerExceptionが発生し2時間くらい悩んでいた俺がいましたorz

人間思いこみってダメですね〜。
もし同様なことで悩んでいる人を見かけた、もしくは、同様の現象に立ち会った場合に、try {} catch を用いなくても解決できる場合があるということと、論理演算子の使い方と条件式の記述方法によってはNullPointerException対策になってない場合があるということを肝に銘じてコーディングしてください。

以上、JavaにおけるぬるぽTipsでした〜。

・参考サイト
Okapi Project - Java 基礎知識( 演算子 )

Hibernateを用いてシステム開発をしていると、確かに便利なんですが微妙に重いな〜なんて感じます。
Hibernateの公式サイトから必要なファイルをダウンロードし、説明書を読んで必須(Required)と書かれているファイルを導入しても、果たして、それらが全て必要なのか微妙なところです。

そこでググってみたところ、
ギジュツメモ - TomcatでHibernateを動かすとき最低限追加設置が必要なJarを見つけました。

自ら必要だろうと思って設置したファイルより大分削減できそうな感じです。
「Hibernate関連のJARファイル多すぎじゃね?」って思える人は是非参考にして下さい。

Strutsのタグライブラリを用いたページを作っている最中に起きたトラブルへの備忘録です。

Strutsタグがない全てのページの基となるテンプレートページに、Strutsのタグライブラリを付け足しつつ編集していきました。
一通り完成したので、実際に動作させたところ、ページが表示されません。
「org.apache.struts.taglib.html.BEAN という名前のbeanが見つかりません」とエラーがでたものの、どこが原因になっているか分からない...orz

ググってみたところ、Java Look: formの要素のページが見つかりました。
ただし、なぜかindex.rdfの形で( ̄□ ̄;)!!
※上記のリンクはちゃんと普通のページにリンクしているのでご安心をw

ここを見て激しく高速に解決できました。
本来なら<html:form>タグの中に記述しなくてはいけない、<html:radio>、<html:checkbox>、<html:text>などのタグが<html:form>タグの外側に記述されているか、そのページに<html:form>タグがそもそも記述されていないかのどちらかです。

ちなみに、俺の場合、全てのページの基となるテンプレートをいじりながら製作したことで、<html:form>タグを<form>タグのままにしていたことが原因でしたorz
テンプレートをいじりつつ、本来のHTMLタグをActionフォーム用のStrutsタグに置き換えるときには注意ってことで。

StrutsからServletContextクラスを取得するには

MVCモデルで知られているJSP&ServletのStrutsフレームワークですが、Contorollerの部分にあたるActionを作成しているときにちと困ったことになりました。
普通のサーブレットの場合、サーブレットの中でServletContextを呼び出すには、

ServletContext sc = getServletContext();

で良いわけですが、Strutsの場合は上記のような構文をexecuteメソッドの中に記述しても動きません。
せっかくStrutsのプラグインを用いてあるクラスをアプリケーションスコープに格納したのに取得できないなんてかなりorzな訳ですが。

ググってみたところ、上記のコードにもうひと味付けることで解決できました。

ServletContext sc = getServlet().getServletContext();
Foo bar = (Foo)sc.getAttribute("bar");

例えば、上記のコードのようにすれば、StrutsのActionサーブレットにおいてもApplicationスコープから値を取得できます。

めでたし。めでたし。