http://www.javaroad.jp/opensource/js_struts14.htm
LookupDispatchActionクラスはフォーム画面内で、submitボタンが複数ある場合に使用するアクション・クラスです。submitボタンごとそれぞれの処理を実行することができます
仕事に関係する情報のメモ 技術、プロジェクト管理など
月曜日, 9月 29, 2008
火曜日, 8月 26, 2008
月曜日, 7月 21, 2008
水曜日, 6月 25, 2008
開発工程の略語(主にウォーターフォール型)
# 上工程(設計工程)
* 設計工程概要
* 基本設計(BD)BasicDesign
* 機能設計(FD)FunctionDesign
* 詳細設計(DD/PD)
* 製造設計(CD)
# 下工程(試験工程)
* 試験工程概要
* 単体試験(関数内試験) UT
* 単体試験(関数間) UT
* 機能試験(FT)
* 結合試験(IT)→CT コンビネーションテスト
* 試験工程補足
* 設計工程概要
* 基本設計(BD)BasicDesign
* 機能設計(FD)FunctionDesign
* 詳細設計(DD/PD)
* 製造設計(CD)
# 下工程(試験工程)
* 試験工程概要
* 単体試験(関数内試験) UT
* 単体試験(関数間) UT
* 機能試験(FT)
* 結合試験(IT)→CT コンビネーションテスト
* 試験工程補足
火曜日, 6月 10, 2008
JAVAScript 日付フォーマット(YYYYMMDD -> YYYY/MM/DD)
// 日付フォーマット
onblur="FormatDateYYYYMMDD(this, this.value, 8)"
で呼び出すと、YYYYMMDD -> YYYY/MM/DD となる
function FormatDateYYYYMMDD(obj, val, len){
str_val = val;
// ********** 半角数値チェック ********** //
checkFlg = 0;
arrNumber = new Array("1","2","3","4","5","6","7","8","9","0","/");
for(i = 0; i < str_val.length; i++) {
c_val = str_val.substring(i, i + 1);
for(j = 0; j < arrNumber.length; j++){
c_num = arrNumber[j];
if (c_val == c_num) {
checkFlg++;
}
}
}
if (str_val.length != checkFlg) {
obj.value = val;
return;
}
// ********** 半角数値チェック ********** //
// ********** 文字列から[/]を除去する ********** //
ret_val = '';
for(i = 0; i < val.length; i++){
c_val = val.substring(i, i + 1);
if (c_val == '/') {
c_dumy = '';
} else {
c_dumy = c_val;
}
ret_val = ret_val + c_dumy;
}
str_val = ret_val;
// ********** 文字列から[/]を除去する ********** //
// ********** 文字列長チェック ********** //
if (str_val.length != len) {
obj.value = val;
return;
}
// ********** 文字列長チェック ********** //
// ********** 日付チェック ********** //
n_y = str_val.substring(0,4);
n_m = str_val.substring(4,6);
n_d = str_val.substring(6,8);
monthEndDay = new Array(31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
cal = new Date;
n_day = 0;
// 月チェック
if ((n_m < 1) || (12 < n_m)) {
obj.value = val;
return;
}
// うるう年計算
cal.setYear(n_y);
cal.setMonth(n_m - 1);
n_day = monthEndDay[n_m - 1];
if ((n_m == 2)&&(((n_y%4 == 0)&&(n_y%100 != 0))||(n_y%400 == 0))){
n_day = 29;
}
if ((n_d < 0) || (n_day < n_d)) {
obj.value = val;
return;
}
// ********** 日付チェック ********** //
// ********** フォーマット文字列返還 ********** //
obj.value = n_y + "/" + n_m + "/" + n_d;
// ********** フォーマット文字列返還 ********** //
}
onblur="FormatDateYYYYMMDD(this, this.value, 8)"
で呼び出すと、YYYYMMDD -> YYYY/MM/DD となる
function FormatDateYYYYMMDD(obj, val, len){
str_val = val;
// ********** 半角数値チェック ********** //
checkFlg = 0;
arrNumber = new Array("1","2","3","4","5","6","7","8","9","0","/");
for(i = 0; i < str_val.length; i++) {
c_val = str_val.substring(i, i + 1);
for(j = 0; j < arrNumber.length; j++){
c_num = arrNumber[j];
if (c_val == c_num) {
checkFlg++;
}
}
}
if (str_val.length != checkFlg) {
obj.value = val;
return;
}
// ********** 半角数値チェック ********** //
// ********** 文字列から[/]を除去する ********** //
ret_val = '';
for(i = 0; i < val.length; i++){
c_val = val.substring(i, i + 1);
if (c_val == '/') {
c_dumy = '';
} else {
c_dumy = c_val;
}
ret_val = ret_val + c_dumy;
}
str_val = ret_val;
// ********** 文字列から[/]を除去する ********** //
// ********** 文字列長チェック ********** //
if (str_val.length != len) {
obj.value = val;
return;
}
// ********** 文字列長チェック ********** //
// ********** 日付チェック ********** //
n_y = str_val.substring(0,4);
n_m = str_val.substring(4,6);
n_d = str_val.substring(6,8);
monthEndDay = new Array(31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
cal = new Date;
n_day = 0;
// 月チェック
if ((n_m < 1) || (12 < n_m)) {
obj.value = val;
return;
}
// うるう年計算
cal.setYear(n_y);
cal.setMonth(n_m - 1);
n_day = monthEndDay[n_m - 1];
if ((n_m == 2)&&(((n_y%4 == 0)&&(n_y%100 != 0))||(n_y%400 == 0))){
n_day = 29;
}
if ((n_d < 0) || (n_day < n_d)) {
obj.value = val;
return;
}
// ********** 日付チェック ********** //
// ********** フォーマット文字列返還 ********** //
obj.value = n_y + "/" + n_m + "/" + n_d;
// ********** フォーマット文字列返還 ********** //
}
BETWEEN句の使い方について
例えば適用開始日(TEKIYO_FROM)と、適用終了日(TEKIYO_TO)を項目として持つレコードで日付を指定してピンポイントで検索したい場合、以下の文で検索可能。
? BETWEEN TEKIYO_FROM AND TEKIYO_TO
TEKIYO_FROM TEKIYO_TO
①20080101 20081231
②20090101 20091231
'20080505' BETWEEN TEKIYO_FROM AND TEKIYO_TO
で、①が抽出される
? BETWEEN TEKIYO_FROM AND TEKIYO_TO
TEKIYO_FROM TEKIYO_TO
①20080101 20081231
②20090101 20091231
'20080505' BETWEEN TEKIYO_FROM AND TEKIYO_TO
で、①が抽出される
金曜日, 6月 06, 2008
JAVAからPL/SQLのカーソル取り出し
ポイントは
cs.registerOutParameter(3,OracleTypes.CURSOR);
oracle.jdbc.driverパッケージにあるので、クラスパスに含めること。
【PL/SQL】
CREATE OR REPLACE PACKAGE BODY ABC.PKG_CRM0700TEST
IS
-- グローバル変数宣言
/* 変数名 データ型; */
-- プロシージャ、関数宣言
PROCEDURE GETCRE_NAME(
prm1 IN M_TAX.DATA_SYU%TYPE,
prm2 IN M_TAX.TEKIYO_FROM%TYPE,
retVal OUT EmpCurType
) IS
/* PROCEDURE 名前(引数...); */
/* FUNCTION 名前(引数...) RETURN データ型; */
BEGIN
OPEN retVal FOR SELECT * FROM M_TAX;
END GETCRE_NAME;
END PKG_CRM0700TEST;
/
【JAVA】
//★★ここから下は要らないので消すこと
sql = ("{call PKG_CRM0700TEST.GETCRE_NAME(?,?,?)}");
cs = conn.prepareCall(sql);
cs.setString(1, "A"); //データ種別
cs.setString(2, "20080801"); //適用開始日
cs.registerOutParameter(3,OracleTypes.CURSOR);
cs.executeUpdate();
rs = (ResultSet) cs.getObject(3);
while(rs.next()){
System.out.println(rs.getString(1)+":"+rs.getString(2));
}
cs.registerOutParameter(3,OracleTypes.CURSOR);
oracle.jdbc.driverパッケージにあるので、クラスパスに含めること。
【PL/SQL】
CREATE OR REPLACE PACKAGE BODY ABC.PKG_CRM0700TEST
IS
-- グローバル変数宣言
/* 変数名 データ型; */
-- プロシージャ、関数宣言
PROCEDURE GETCRE_NAME(
prm1 IN M_TAX.DATA_SYU%TYPE,
prm2 IN M_TAX.TEKIYO_FROM%TYPE,
retVal OUT EmpCurType
) IS
/* PROCEDURE 名前(引数...); */
/* FUNCTION 名前(引数...) RETURN データ型; */
BEGIN
OPEN retVal FOR SELECT * FROM M_TAX;
END GETCRE_NAME;
END PKG_CRM0700TEST;
/
【JAVA】
//★★ここから下は要らないので消すこと
sql = ("{call PKG_CRM0700TEST.GETCRE_NAME(?,?,?)}");
cs = conn.prepareCall(sql);
cs.setString(1, "A"); //データ種別
cs.setString(2, "20080801"); //適用開始日
cs.registerOutParameter(3,OracleTypes.CURSOR);
cs.executeUpdate();
rs = (ResultSet) cs.getObject(3);
while(rs.next()){
System.out.println(rs.getString(1)+":"+rs.getString(2));
}
JavaからPL/SQLをコールし、OUTパラメータを受け取る方法
【PL/SQL側】
CREATE OR REPLACE PACKAGE BODY ABC.PKG_CRM0700TEST
IS
-- グローバル変数宣言
/* 変数名 データ型; */
-- プロシージャ、関数宣言
PROCEDURE GETCRE_NAME(
prm1 IN M_TAX.DATA_SYU%TYPE,
prm2 IN M_TAX.TEKIYO_FROM%TYPE,
retVal OUT M_TAX.CRE_USER%TYPE
) IS
/* PROCEDURE 名前(引数...); */
/* FUNCTION 名前(引数...) RETURN データ型; */
BEGIN
SELECT CRE_USER INTO retVal FROM M_TAX WHERE DATA_SYU = prm1 AND TEKIYO_FROM = prm2;
END GETCRE_NAME;
END PKG_CRM0700TEST;
/
【JAVA側】
sql = ("{call PKG_CRM0700TEST.GETCRE_NAME(?,?,?)}");
cs = conn.prepareCall(sql);
cs.setString(1, "A"); //データ種別
cs.setString(2, "20080801"); //適用開始日
cs.registerOutParameter(3,java.sql.Types.VARCHAR);
cs.executeUpdate();
System.out.println("OUT_PARAM:" + cs.getString(3));
CREATE OR REPLACE PACKAGE BODY ABC.PKG_CRM0700TEST
IS
-- グローバル変数宣言
/* 変数名 データ型; */
-- プロシージャ、関数宣言
PROCEDURE GETCRE_NAME(
prm1 IN M_TAX.DATA_SYU%TYPE,
prm2 IN M_TAX.TEKIYO_FROM%TYPE,
retVal OUT M_TAX.CRE_USER%TYPE
) IS
/* PROCEDURE 名前(引数...); */
/* FUNCTION 名前(引数...) RETURN データ型; */
BEGIN
SELECT CRE_USER INTO retVal FROM M_TAX WHERE DATA_SYU = prm1 AND TEKIYO_FROM = prm2;
END GETCRE_NAME;
END PKG_CRM0700TEST;
/
【JAVA側】
sql = ("{call PKG_CRM0700TEST.GETCRE_NAME(?,?,?)}");
cs = conn.prepareCall(sql);
cs.setString(1, "A"); //データ種別
cs.setString(2, "20080801"); //適用開始日
cs.registerOutParameter(3,java.sql.Types.VARCHAR);
cs.executeUpdate();
System.out.println("OUT_PARAM:" + cs.getString(3));
金曜日, 5月 16, 2008
木曜日, 5月 15, 2008
これはスゴイ! JavaScript統合開発環境「Aptana」
eclipseベースのJavaScript開発環境。
プラグインではないらしい。
http://www.h2o-ajax.com/article253.html
プラグインではないらしい。
http://www.h2o-ajax.com/article253.html
火曜日, 5月 13, 2008
EBCDICコード変換
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=36576&forum=12&2
http://java.sun.com/j2se/1.5.0/ja/docs/ja/guide/intl/encoding.doc.html
http://java.sun.com/j2se/1.5.0/ja/docs/ja/guide/intl/encoding.doc.html
クロスサイトスクリプティング対策
[本文の場合]
本文で特殊文字となる文字は、「<」「>」「&」の3つである。「<」と「>」は本文とタグを区切る開始と終了という特別な意味を持つ特殊文字で、「&」は文字参照(character references)を記述するための開始文字という意味を持つ特殊文字である。
これらの3つの文字をサニタイジングするには、それぞれ「<」「>」「&」に変換する。
[タグの場合]
<input type="hidden" name="namae" value="kokubu">
上記「"hidden"」「"namae"」「"kokubu"」の部分(属性値と呼ぶ)に入力値を入れる場合で、正しくサニタイジングをする必要がある。
属性値は必ず「"(ダブルクオーテーション)」または「'(シングルクオーテーション)」で囲む。これはW3Cが推奨しているのと同時に、サニタイジングが必要な特殊文字を限定することになる
「"」で囲った場合の特殊文字は「"」だけとなる。同様に「'」で囲った場合は「'」だけとなる。それぞれ、「"」と「'」に変換することでサニタイジング完了となる。
こうすることで、「""><script>alert("test");</script>"」という入力がなされても、 「alert("test");< /script>">」となり、タグが無効となる。
<>が入力値と同じでなくとも良いのなら、以下のような方法もある。
・「<」と「>」を消してしまう
・「<」と「>」を全角「<」「>」にしてしまう
本文で特殊文字となる文字は、「<」「>」「&」の3つである。「<」と「>」は本文とタグを区切る開始と終了という特別な意味を持つ特殊文字で、「&」は文字参照(character references)を記述するための開始文字という意味を持つ特殊文字である。
これらの3つの文字をサニタイジングするには、それぞれ「<」「>」「&」に変換する。
[タグの場合]
<input type="hidden" name="namae" value="kokubu">
上記「"hidden"」「"namae"」「"kokubu"」の部分(属性値と呼ぶ)に入力値を入れる場合で、正しくサニタイジングをする必要がある。
属性値は必ず「"(ダブルクオーテーション)」または「'(シングルクオーテーション)」で囲む。これはW3Cが推奨しているのと同時に、サニタイジングが必要な特殊文字を限定することになる
「"」で囲った場合の特殊文字は「"」だけとなる。同様に「'」で囲った場合は「'」だけとなる。それぞれ、「"」と「'」に変換することでサニタイジング完了となる。
こうすることで、「""><script>alert("test");</script>"」という入力がなされても、 「alert("test");< /script>">」となり、タグが無効となる。
<>が入力値と同じでなくとも良いのなら、以下のような方法もある。
・「<」と「>」を消してしまう
・「<」と「>」を全角「<」「>」にしてしまう
月曜日, 5月 12, 2008
DJUnitでパッケージやプロジェクト単位でテスト実行
DJUnitは、作成したJUnitテストケースを実行した結果として、テスト対象のカバー率を表示することができるツールである。
作成したJUnitテストクラスを含むパッケージやプロジェクト単位でテストを行うには、以下のようにする。
①プロジェクトを右クリック
→②構成及び実行
→③表示されたWindowの右メニューでdjUnitを選択
→④"選択されたプロジェクト、パッケージ・・・のすべてのテストを実行"をチェックし、プロジェクト等を指定する。
あとは、djUnitのテストを行うと、選択したプロジェクト(パッケージ)のJUnitテストをすべて実行してくれる。
作成したJUnitテストクラスを含むパッケージやプロジェクト単位でテストを行うには、以下のようにする。
①プロジェクトを右クリック
→②構成及び実行
→③表示されたWindowの右メニューでdjUnitを選択
→④"選択されたプロジェクト、パッケージ・・・のすべてのテストを実行"をチェックし、プロジェクト等を指定する。
あとは、djUnitのテストを行うと、選択したプロジェクト(パッケージ)のJUnitテストをすべて実行してくれる。
金曜日, 5月 09, 2008
Windowsサービス登録
sc create SubversionServer binpath= "C:\Subversion\bin\svnserve.exe --service" displayname= "Subversion" depend= tcpip start= auto
水曜日, 5月 07, 2008
金曜日, 4月 25, 2008
登録:
投稿 (Atom)