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
以上、備忘録でした。
現在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プログラムで、その文字列が全角文字列のみどうかチェックするメソッドを作る必要がありました。
ググって見たところ、各種共通関数 - 文字列チェック関数(全角文字のチェック)を見つけました。
公開されているソースをそのまま流用しても実装可能なのですが、見た感じデバック用と思われるコードが残っているみたいです。それをスッキリさせ、意味もなく文字コードを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()メソッドを実行してやれば良いと。
簡単ですね。
そんなわけで備忘録としておいておきます∠( ̄∧ ̄)