レイアウト使用時にBODYタグにJavaScriptを記載

Teedaのレイアウト機能を使用するとBODYタグはlayout/layout.htmlのBODYタグが使用されます。各ページとも共通のJavaScriptなら問題ないけど、一部個別に設定したい場合があった場合どうしたらいいのか・・・・

一つは(ってこれしか思いつかなかったけど)layout.htmlのBODYタグに



を書いておきます。

各ページに


//
JavaScriptを書いておくと個別に設定できます。ただ、全てのページ(html)にこれを書かなくてはならず、ちょっと管理が大変。

なお、この例ではkumuを使用して、特定のテキストボックスにフォーカスするようにしています。

慣れないDB2

今回のプロジェクトでDB2を使用しているけど、以下の2点ではまった。どちらもSQLエラーコード(-302)で、リファレンスでその項目を見ただけではわからず・・・(知っちゃえば、そんなもんかということなんだけど。)

1.Where句の文字サイズ制限
パラメータマーカーを使用して条件検索をした場合、Where句の値もそのカラムサイズ以上のものが指定されると、SQLエラーが発生。
このために必要なチェックが増えて面倒だなー。
例)
select count(*) from usermaster where userid='aaaaa'
のようなSQLがあってuseridがvarchar(3)で定義してあるとエラーになる。

2.BLOBの定義
BLOBは2GBまで大丈夫だから、
create table test{
id varchar(9),
data blob
}
って書けばいいと思っていた。が、Webからのファイルアップロードを実装したときに1Mを超えるファイルのみSQLエラーが発生。よくよくリファレンスを読んでみるとBLOBって作成時にサイズをしていないと1Mになってしまうとのこと。
本来ならBLOB(10M)のように記述すべきだった。
個人的には2GBをデフォルトにしてほしかったな。

BLOBの取得をどうする??

DBFluteを使用して、BLOBのカラムが含まれているテーブルに対してSELECTを発行するとSQLの例外が発生。
原因はDB2JDBCドライバにscrollable cursorではLOB列(BLOB,CLOBなど)をfetchできないという制限があるとのこと。
S2DAOでは下記の方法で回避できるとのことだけどDBFluteではどうしたらいいのかな?
参考情報
[Seasar-user:5458] DB2 S2DaoでBLOB型のデータを取得時にExceptionが発生
FAQ/S2DAO - SeasarWiki



select FILEDATA.FILE_NAME, FILEDATA.FILE_SIZE, FILEDATA.UPDATE_DATE, FILEDATA.CREATE_DATE, FILEDATA.CREATE_USER, FILEDATA.UPDATE_USER, FILEDATA.FILEDATA_ID, FILEDATA.OPEN_LEVEL, FILEDATA.SUBAPP_CODE, FILEDATA.GROUPING_CODE, FILEDATA.UPLOAD_AUTHORITY, FILEDATA.UPLOAD_USER_ID, FILEDATA.UPLOAD_DATE, FILEDATA.FILE_DATA from FILEDATA where FILEDATA.FILEDATA_ID = 41
論理的なコネクションを閉じました。tx=[FormatId=4360, GlobalId=1199843510546/33, BranchId=]
FiledataDao was interrupted by SQLRuntimeException
[Interrupted Target]
dao = FiledataDao
method = public abstract java.util.List XXXXXX.dbflute.bsdao.BsFiledataDao.selectList(XXXXXXX.dbflute.cbean.FiledataCB)
args = /* df:includeSelectClause */ from FILEDATA where FILEDATA.FILEDATA_ID = /*dto.conditionQuery.filedataId.equal*/null
END XXXXX#filedowonload(XXXXXX.FileboxDto@85d9a4, , org.seasar.teeda.core.context.servlet.ServletFacesContextImpl@193c227) Throwable:org.seasar.framework.exception.SQLRuntimeException: [ESSR0072]SQLで例外(SQL=[select FILEDATA.FILE_NAME, FILEDATA.FILE_SIZE, FILEDATA.UPDATE_DATE, FILEDATA.CREATE_DATE, FILEDATA.CREATE_USER, FILEDATA.UPDATE_USER, FILEDATA.FILEDATA_ID, FILEDATA.OPEN_LEVEL, FILEDATA.SUBAPP_CODE, FILEDATA.GROUPING_CODE, FILEDATA.UPLOAD_AUTHORITY, FILEDATA.UPLOAD_USER_ID, FILEDATA.UPLOAD_DATE, FILEDATA.FILE_DATA from FILEDATA where FILEDATA.FILEDATA_ID = ?], Message=[[ESSR0072]SQLで例外(SQL=[select FILEDATA.FILE_NAME, FILEDATA.FILE_SIZE, FILEDATA.UPDATE_DATE, FILEDATA.CREATE_DATE, FILEDATA.CREATE_USER, FILEDATA.UPDATE_USER, FILEDATA.FILEDATA_ID, FILEDATA.OPEN_LEVEL, FILEDATA.SUBAPP_CODE, FILEDATA.GROUPING_CODE, FILEDATA.UPLOAD_AUTHORITY, FILEDATA.UPLOAD_USER_ID, FILEDATA.UPLOAD_DATE, FILEDATA.FILE_DATA from FILEDATA where FILEDATA.FILEDATA_ID = ?], Message=[-270], ErrorCode=42997, SQLState={3})が発生しました : [SQLで例外(Message=[DB2 SQL Error: SQLCODE=-270, SQLSTATE=42997, SQLERRMC=63, DRIVER=3.50.152], ErrorCode=-270, SQLState=42997)が発生しました。], [SQLで例外(Message=[DB2 SQL Error: SQLCODE=-727, SQLSTATE=56098, SQLERRMC=2;-270;42997;63, DRIVER=3.50.152], ErrorCode=-727, SQLState=56098)が発生しました。], [SQLで例外(Message=[DB2 SQL Error: SQLCODE=-727, SQLSTATE=56098, SQLERRMC=2;-270;42997;63, DRIVER=3.50.152], ErrorCode=-727, SQLState=56098)が発生しました。], [DB2 SQL Error: SQLCODE=-270, SQLSTATE=42997, SQLERRMC=63, DRIVER=3.50.152], ErrorCode=-270, SQLState=42997)が発生しました
トランザクションロールバックしました。tx=[FormatId=4360, GlobalId=1199843510546/33, BranchId=]
END XXXXX#doDownload() Throwable:org.seasar.framework.exception.SQLRuntimeException: [ESSR0072]SQLで例外(SQL=[select FILEDATA.FILE_NAME, FILEDATA.FILE_SIZE, FILEDATA.UPDATE_DATE, FILEDATA.CREATE_DATE, FILEDATA.CREATE_USER, FILEDATA.UPDATE_USER, FILEDATA.FILEDATA_ID, FILEDATA.OPEN_LEVEL, FILEDATA.SUBAPP_CODE, FILEDATA.GROUPING_CODE, FILEDATA.UPLOAD_AUTHORITY, FILEDATA.UPLOAD_USER_ID, FILEDATA.UPLOAD_DATE, FILEDATA.FILE_DATA from FILEDATA where FILEDATA.FILEDATA_ID = ?], Message=[[ESSR0072]SQLで例外(SQL=[select FILEDATA.FILE_NAME, FILEDATA.FILE_SIZE, FILEDATA.UPDATE_DATE, FILEDATA.CREATE_DATE, FILEDATA.CREATE_USER, FILEDATA.UPDATE_USER, FILEDATA.FILEDATA_ID, FILEDATA.OPEN_LEVEL, FILEDATA.SUBAPP_CODE, FILEDATA.GROUPING_CODE, FILEDATA.UPLOAD_AUTHORITY, FILEDATA.UPLOAD_USER_ID, FILEDATA.UPLOAD_DATE, FILEDATA.FILE_DATA from FILEDATA where FILEDATA.FILEDATA_ID = ?], Message=[-270], ErrorCode=42997, SQLState={3})が発生しました : [SQLで例外(Message=[DB2 SQL Error: SQLCODE=-270, SQLSTATE=42997, SQLERRMC=63, DRIVER=3.50.152], ErrorCode=-270, SQLState=42997)が発生しました。], [SQLで例外(Message=[DB2 SQL Error: SQLCODE=-727, SQLSTATE=56098, SQLERRMC=2;-270;42997;63, DRIVER=3.50.152], ErrorCode=-727, SQLState=56098)が発生しました。], [SQLで例外(Message=[DB2 SQL Error: SQLCODE=-727, SQLSTATE=56098, SQLERRMC=2;-270;42997;63, DRIVER=3.50.152], ErrorCode=-727, SQLState=56098)が発生しました。], [DB2 SQL Error: SQLCODE=-270, SQLSTATE=42997, SQLERRMC=63, DRIVER=3.50.152], ErrorCode=-270, SQLState=42997)が発生しました
[ESSR0072]SQLで例外(SQL=[select FILEDATA.FILE_NAME, FILEDATA.FILE_SIZE, FILEDATA.UPDATE_DATE, FILEDATA.CREATE_DATE, FILEDATA.CREATE_USER, FILEDATA.UPDATE_USER, FILEDATA.FILEDATA_ID, FILEDATA.OPEN_LEVEL, FILEDATA.SUBAPP_CODE, FILEDATA.GROUPING_CODE, FILEDATA.UPLOAD_AUTHORITY, FILEDATA.UPLOAD_USER_ID, FILEDATA.UPLOAD_DATE, FILEDATA.FILE_DATA from FILEDATA where FILEDATA.FILEDATA_ID = ?], Message=[[ESSR0072]SQLで例外(SQL=[select FILEDATA.FILE_NAME, FILEDATA.FILE_SIZE, FILEDATA.UPDATE_DATE, FILEDATA.CREATE_DATE, FILEDATA.CREATE_USER, FILEDATA.UPDATE_USER, FILEDATA.FILEDATA_ID, FILEDATA.OPEN_LEVEL, FILEDATA.SUBAPP_CODE, FILEDATA.GROUPING_CODE, FILEDATA.UPLOAD_AUTHORITY, FILEDATA.UPLOAD_USER_ID, FILEDATA.UPLOAD_DATE, FILEDATA.FILE_DATA from FILEDATA where FILEDATA.FILEDATA_ID = ?], Message=[-270], ErrorCode=42997, SQLState={3})が発生しました : [SQLで例外(Message=[DB2 SQL Error: SQLCODE=-270, SQLSTATE=42997, SQLERRMC=63, DRIVER=3.50.152], ErrorCode=-270, SQLState=42997)が発生しました。], [SQLで例外(Message=[DB2 SQL Error: SQLCODE=-727, SQLSTATE=56098, SQLERRMC=2;-270;42997;63, DRIVER=3.50.152], ErrorCode=-727, SQLState=56098)が発生しました。], [SQLで例外(Message=[DB2 SQL Error: SQLCODE=-727, SQLSTATE=56098, SQLERRMC=2;-270;42997;63, DRIVER=3.50.152], ErrorCode=-727, SQLState=56098)が発生しました。], [DB2 SQL Error: SQLCODE=-270, SQLSTATE=42997, SQLERRMC=63, DRIVER=3.50.152], ErrorCode=-270, SQLState=42997)が発生しました
org.seasar.framework.exception.SQLRuntimeException: [ESSR0072]SQLで例外(SQL=[select FILEDATA.FILE_NAME, FILEDATA.FILE_SIZE, FILEDATA.UPDATE_DATE, FILEDATA.CREATE_DATE, FILEDATA.CREATE_USER, FILEDATA.UPDATE_USER, FILEDATA.FILEDATA_ID, FILEDATA.OPEN_LEVEL, FILEDATA.SUBAPP_CODE, FILEDATA.GROUPING_CODE, FILEDATA.UPLOAD_AUTHORITY, FILEDATA.UPLOAD_USER_ID, FILEDATA.UPLOAD_DATE, FILEDATA.FILE_DATA from FILEDATA where FILEDATA.FILEDATA_ID = ?], Message=[[ESSR0072]SQLで例外(SQL=[select FILEDATA.FILE_NAME, FILEDATA.FILE_SIZE, FILEDATA.UPDATE_DATE, FILEDATA.CREATE_DATE, FILEDATA.CREATE_USER, FILEDATA.UPDATE_USER, FILEDATA.FILEDATA_ID, FILEDATA.OPEN_LEVEL, FILEDATA.SUBAPP_CODE, FILEDATA.GROUPING_CODE, FILEDATA.UPLOAD_AUTHORITY, FILEDATA.UPLOAD_USER_ID, FILEDATA.UPLOAD_DATE, FILEDATA.FILE_DATA from FILEDATA where FILEDATA.FILEDATA_ID = ?], Message=[-270], ErrorCode=42997, SQLState={3})が発生しました : [SQLで例外(Message=[DB2 SQL Error: SQLCODE=-270, SQLSTATE=42997, SQLERRMC=63, DRIVER=3.50.152], ErrorCode=-270, SQLState=42997)が発生しました。], [SQLで例外(Message=[DB2 SQL Error: SQLCODE=-727, SQLSTATE=56098, SQLERRMC=2;-270;42997;63, DRIVER=3.50.152], ErrorCode=-727, SQLState=56098)が発生しました。], [SQLで例外(Message=[DB2 SQL Error: SQLCODE=-727, SQLSTATE=56098, SQLERRMC=2;-270;42997;63, DRIVER=3.50.152], ErrorCode=-727, SQLState=56098)が発生しました。], [DB2 SQL Error: SQLCODE=-270, SQLSTATE=42997, SQLERRMC=63, DRIVER=3.50.152], ErrorCode=-270, SQLState=42997)が発生しました
at org.seasar.framework.util.PreparedStatementUtil.executeQuery(PreparedStatementUtil.java:48)

DBFlute習得中

DBFluteってぱっと見た目?導入が難しそうだけど、やってみると意外と簡単。後で知ったけどEMechaというEclipseプラグインを用いることで最初の設定を楽にしてくれるので、もうこのプラグインも必須ですね。

で、DBFluteを使って簡単なアプリを作ってみた(実際は客先向けの簡易DEMO)けど、かなりかゆいところに手が届いて楽しくコーディングできちゃいますね。(書きながら笑っちゃいました^_^;)

けど、本プロジェクトだとSequenceや外部キー、共通カラムを考えないといけないので、build.propertiesへの追加作業が発生。慣れるまでは時間を要しそう。

ただ、それに要した時間以上の時間を削減できそうなのでここはじっくりと行きたい。

DBFluteの機能でテーブルの再作成&Excelに記載したデータ投入ができるけど、データの投入がうまくいかない。
どうやらVARCHARのデータを入れるときにシングルクォーテで囲っていないのが原因でDB(Posgre,DB2)がエラーを返しているらしい。となるとエクセルの各セルにシングルクォーテをつけて(VARCHARのカラム)書いておかないといけないのかな?
それともエクセルへの入力方法が間違ってる?

iReport2.0.2は表現力に限界?

商品リストをPDF出力する機能があって、これをiReportを使用してテンプレートを作成しているけど・・・なんかしょぼい。
センスの問題もあるけど、ライン(枠)を太くしたいがどこで設定したらいいのかわからない・・・。日本語だと太字にチェックしても太字として出力してくれない・・・。
それほど複雑なものでないから簡単に済ませたいが、こうも表現力に限界を感じると代替案を考えるしかないかなー。

DB2 V9.5インストール

今回のプロジェクトでは、DB2を使用。ということで先日リリースされたDB2 V9.5をダウンロードしてインストール。

CPU数限定ながら、ほとんどの機能が使えて無料。開発者にとってはうれしい限りですな。
IBM Software | IBM

オートコンプリートの無効化

お客さんからの要望でセキュリティ強化の一環でオートコンプリートを無効にしたいとのこと。

ということでformに以下の設定を追加


<form name="login" autocomplete="off" >

これを適用したら利用者からパスワードの問合せがたくさん来たそうな。