001/* 002 * Copyright (c) 2009 The openGion Project. 003 * 004 * Licensed under the Apache License, Version 2.0 (the "License"); 005 * you may not use this file except in compliance with the License. 006 * You may obtain a copy of the License at 007 * 008 * http://www.apache.org/licenses/LICENSE-2.0 009 * 010 * Unless required by applicable law or agreed to in writing, software 011 * distributed under the License is distributed on an "AS IS" BASIS, 012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, 013 * either express or implied. See the License for the specific language 014 * governing permissions and limitations under the License. 015 */ 016package org.opengion.hayabusa.taglib; 017 018import org.opengion.hayabusa.common.HybsSystem; 019import org.opengion.hayabusa.common.HybsSystemException; 020 021import org.opengion.fukurou.util.StringUtil; 022import static org.opengion.fukurou.util.StringUtil.nval ; 023 024/** 025 * Where句を作成するための条件を指定します。 026 * 027 * このタグのvalue 値に、{@XXXX} 変数が含まれている場合、そのリクエスト値が 028 * ない場合は、このタグそのものがなにも出力しません。(つまり条件から消えます。) 029 * startKeyは、value を連結する場合の頭に置かれる文字列で、where句の最初には表示されず、 030 * それ以降について、表示されます。(つまり、where VALUE1 and VALUE2 and VALUE3 … です。) 031 * startKey の初期値は、"and" です。 032 * multi は、{@XXXX} 変数に、値が複数含まれている場合の処理を規定します。 033 * 複数の値とは、同一nameでチェックボックス指定や、メニューでの複数指定した場合、 034 * リクエストが配列で送られます。multi="true" とすると、'xx1','xx2','xx3', ・・・ という 035 * 形式に変換されます。 036 * 具体的には、"where PN in ( {@PN} )" という文字列に対して、 037 * "where PN in ( 'xx1','xx2','xx3' )" を作成することができます。 038 * multi の初期値は、"false" です。 039 * SystemData の USE_SQL_INJECTION_CHECK が true か、quotCheck 属性が true の場合は、 040 * SQLインジェクション対策用のクォーティションチェックを行います。リクエスト引数に 041 * クォーティション(')が含まれると、エラーになります。 042 * 同様にUSE_XSS_CHECKがtrueか、xssCheck属性がtrueの場合は、 043 * クロスサイトススクリプティング(XSS)対策のためless/greater than signのチェックを行います。 044 * 045 * 各属性は、{@XXXX} 変数が使用できます。 046 * これは、ServletRequest から、XXXX をキーに値を取り出し,この変数に割り当てます。 047 * つまり、このXXXXをキーにリクエストすれば、この変数に値をセットすることができます。 048 * 049 * @og.formSample 050 * ●形式:<og:and startKey="[and|or|…]" value="…" multi="[false|true]" /> 051 * ●body:あり(EVAL_BODY_BUFFERED:BODYを評価し、{@XXXX} を解析します) 052 * 053 * ●Tag定義: 054 * <og:and 055 * startKey 【TAG】SQL条件句の最初の演算子を指定します(初期値:and) 056 * value 【TAG】条件の値を セットします 057 * multi 【TAG】複数の引数に対して処理するかどうか[true/false]を設定します(初期値:false) 058 * separator 【TAG】multi アクション時の文字列を分割する項目区切り文字をセットします 059 * quotCheck 【TAG】リクエスト情報の クォーティション(') 存在チェックを実施するかどうか[true/false]を設定します (初期値:USE_SQL_INJECTION_CHECK[=true]) 060 * instrVals 【TAG】スペースで区切られた複数の値すべてを含む条件を作成します 061 * instrType 【TAG】instrValsで複数の値を条件にする際の方法を指定します(初期値:and) 062 * xssCheck 【TAG】リクエスト情報の HTMLTag開始/終了文字(><) 存在チェックを実施するかどうか[true/false]を設定します (初期値:USE_XSS_CHECK[=true]) 063 * caseKey 【TAG】このタグ自体を利用するかどうかの条件キーを指定します(初期値:null) 064 * caseVal 【TAG】このタグ自体を利用するかどうかの条件値を指定します(初期値:null) 065 * caseNN 【TAG】指定の値が、null/ゼロ文字列 でない場合(Not Null=NN)は、このタグは使用されます(初期値:true) 066 * caseNull 【TAG】指定の値が、null/ゼロ文字列 の場合は、このタグは使用されます(初期値:true) 067 * debug 【TAG】デバッグ情報を出力するかどうか[true/false]を指定します(初期値:false) 068 * > ... Body ... 069 * </og:and> 070 * 071 * ●使用例 072 * <og:query command="NEW"> 073 * select PN,YOBI,NMEN,HINM from XX01 074 * <og:where> 075 * <og:and value="PN = '{@PN}'" /> 076 * <og:and value="YOBI like '{@YOBI}%'" /> 077 * </og:where> 078 * order by PN 079 * </og:query> 080 * 081 * ・検索条件が入力された時(PN=AAA , YOBI=BBB) 082 * 作成されるSQL文⇒select PN,YOBI,NMEN,HINM from XX01 where PN = 'AAA' and YOBI like 'BBB%' order by PN 083 * 084 * ・検索条件が片方入力されなかった時(PNがNULLのとき, YOBI=BBB) 085 * 作成されるSQL文⇒select PN,YOBI,NMEN,HINM from XX01 where YOBI like 'BBB%' order by PN 086 * 087 * ・検索条件が入力されなかった時(PNがNULL, YOBIがNULL) WHERE句がなくなる。 088 * 作成されるSQL文⇒select PN,YOBI,NMEN,HINM from XX01 order by PN 089 * 090 * 注意:WhereTagを使わない場合に、検索条件が入力されなかった場合は、下記のようになります。 091 * select PN,YOBI,NMEN,HINM from XX01 where PN = '' and YOBI like '%' order by PN 092 * 093 * -------------------------------------------------------------------------------------------------------------- 094 * 095 * <og:query command="NEW"> 096 * select PN,YOBI,NMEN,HINM from XX01 where PN="11111" 097 * <og:where startKey="and"> 098 * <og:and value="YOBI in ({@YOBI})" multi="true" /> 099 * <og:and value="HINM like '{@HINM}%'" /> 100 * </og:where> 101 * order by PN 102 * </og:query> 103 * 104 * ・YOBI を複数選択し、in で検索する時(YOBI=AA,BB,CC を選択) 105 * 作成されるSQL文⇒select PN,YOBI,NMEN,HINM from XX01 where PN = '11111' 106 * and YOBI in ( 'AA','BB','CC' ) and HINM like 'BBB%' order by PN 107 * 108 * @og.group 画面部品 109 * 110 * @version 4.0 111 * @author Kazuhiko Hasegawa 112 * @since JDK5.0, 113 */ 114public class SqlAndTag extends CommonTagSupport { 115 //* このプログラムのVERSION文字列を設定します。 {@value} */ 116 private static final String VERSION = "5.5.1.1 (2012/04/06)" ; 117 118 private static final long serialVersionUID = 551120120406L ; 119 120 private String startKey = "and"; 121 private String value = ""; 122 private String instrVals = null; // 3.8.8.1 (2007/01/06) 123 private String instrType = "and"; // 5.4.1.0 (2011/11/01) 124 private boolean multi = false; 125 private boolean quotCheck = HybsSystem.sysBool( "USE_SQL_INJECTION_CHECK" ); // 4.0.0 (2005/08/31) 126 private boolean xssCheck = HybsSystem.sysBool( "USE_XSS_CHECK" ); // 5.0.0.2 (2009/09/15) 127 128 private boolean allNull = false; // 5.0.0.2 (2009/09/15) 129 130// private String matchKey = null; // 5.1.9.0 (2010/08/01) ⇒ 5.2.2.0 (2010/11/01) 廃止(caseKey,caseVal属性を使用してください。) 131 132// private String matchVal = null; // 5.1.9.0 (2010/08/01) ⇒ 5.2.2.0 (2010/11/01) 廃止(caseKey,caseVal属性を使用してください。) 133 134 private String separator = null; // 5.2.2.0 (2010/11/01) 項目区切り文字 135 136 /** 137 * Taglibの開始タグが見つかったときに処理する doStartTag() を オーバーライドします。 138 * 139 * @og.rev 4.0.0.0 (2006/12/05) BODY 部の値を value に使用する機能追加 140 * @og.rev 4.0.0.0 (2005/08/31) useQuotCheck() によるSQLインジェクション対策 141 * @og.rev 5.0.0.2 (2009/09/15) XSS対策 142 * @og.rev 5.2.2.0 (2010/11/01) caseKey 、caseVal 属性対応 143 * 144 * @return 後続処理の指示 145 */ 146 @Override 147 public int doStartTag() { 148 // 5.2.2.0 (2010/11/01) caseKey 、caseVal 属性対応 149 if( useTag() ) { 150 useQuotCheck( quotCheck ); 151 // 5.0.0.2 (2009/09/15) XSS対策 152 useXssCheck( xssCheck ); 153 154 value = getRequestParameter( value ); 155 156 if( value == null || value.isEmpty() ) { 157 return( EVAL_BODY_BUFFERED ); // Body を評価する。( extends BodyTagSupport 時) 158 } 159 160 // if( value != null && value.length() > 0 ) { 161 // return( SKIP_BODY ); // Body を評価しない 162 // } 163 // else { 164 // return( EVAL_BODY_BUFFERED ); // Body を評価する。( extends BodyTagSupport 時) 165 // } 166 } 167 return( SKIP_BODY ); // Body を評価しない 168 } 169 170 /** 171 * Taglibのタグ本体を処理する doAfterBody() を オーバーライドします。 172 * 173 * @og.rev 4.0.0.0 (2006/12/05) BODY 部の値を value に使用する機能追加 174 * 175 * @return 後続処理の指示(SKIP_BODY) 176 */ 177 @Override 178 public int doAfterBody() { 179 value = getBodyString(); 180 return(SKIP_BODY); 181 } 182 183 /** 184 * Taglibの終了タグが見つかったときに処理する doEndTag() を オーバーライドします。 185 * 186 * @og.rev 3.1.1.2 (2003/04/04) Tomcat4.1 対応。release2() を doEndTag()で呼ぶ。 187 * @og.rev 3.8.8.1 (2007/01/06) makeInstrVals を加味する。 188 * @og.rev 5.0.0.2 (2009/09/15) multi時のallNull対応 189 * @og.rev 5.1.9.0 (2010/08/01) matchKey 、matchVal 対応 ⇒ 5.2.2.0 (2010/11/01) 廃止 190 * @og.rev 5.2.2.0 (2010/11/01) caseKey 、caseVal 属性対応 191 * 192 * @return 後続処理の指示 193 */ 194 @Override 195 public int doEndTag() { 196 debugPrint(); // 4.0.0 (2005/02/28) 197 // 5.2.2.0 (2010/11/01) caseKey 、caseVal 属性対応 198 if( useTag() ) { 199 SqlWhereTag where = (SqlWhereTag)findAncestorWithClass( this,SqlWhereTag.class ); 200 if( where == null ) { 201// String errMsg = "<b>このタグは、where タグの内部におく必要があります。</b>"; 202 String errMsg = "<b>" + getTagName() + "タグは、where タグの内部におく必要があります。</b>"; 203 throw new HybsSystemException( errMsg ); 204 } 205 206 // 5.1.9.0 (2010/08/01) matchKey 、matchVal 対応 ⇒ 5.2.2.0 (2010/11/01) 廃止 207 // boolean flag = (matchKey == null) || (matchVal == null) || matchKey.matches( matchVal ) ; 208 209 // if( ! isNull() ) { 210 // if( ! isNull() && ! allNull ) { // 5.0.0.2 (2009/09/15) 211 // if( ! isNull() && ! allNull && flag ) { // 5.1.9.0 (2010/08/01) 212 if( ! isNull() && ! allNull ) { // 5.2.2.0 (2010/11/01) 213// value = makeInstrVals( instrVals,value ); // 3.8.8.1 (2007/01/06) 214 value = makeInstrVals( instrVals,instrType,value ); // 5.4.1.0 (2011/11/01) 215 if( value != null ) { 216 set( "keyWord", startKey ); 217 set( "value" , value ); 218 where.setAttributes( getAttributes() ); 219 } 220 } 221 } 222 return(EVAL_PAGE); 223 } 224 225 /** 226 * タグリブオブジェクトをリリースします。 227 * キャッシュされて再利用されるので、フィールドの初期設定を行います。 228 * 229 * @og.rev 2.0.0.4 (2002/09/27) カスタムタグの release() メソッドを、追加 230 * @og.rev 3.1.1.2 (2003/04/04) Tomcat4.1 対応。release2() を doEndTag()で呼ぶ。 231 * @og.rev 3.8.8.1 (2007/01/06) instrVals 属性追加 232 * @og.rev 4.0.0.0 (2005/08/31) quotCheck 属性の追加 233 * @og.rev 5.0.0.2 (2009/09/15) XSS対応 234 * @og.rev 5.0.0.2 (2009/09/15) multi時のallNull対応 235 * @og.rev 5.1.9.0 (2010/08/01) matchKey、matchVal 属性の追加 236 * @og.rev 5.2.2.0 (2010/11/01) separator , isMatch 属性の追加 237 * @og.rev 5.2.2.0 (2010/11/01) matchKey、matchVal 属性廃止(caseKey,caseVal属性を使用してください。) 238 * @og.rev 5.4.1.0 (2011/11/01) instrType属性追加 239 */ 240 @Override 241 protected void release2() { 242 super.release2(); 243 startKey = "and"; 244 value = ""; 245 instrVals = null; // 3.8.8.1 (2007/01/06) 246 instrType = "and"; // 5.4.1.0 (2011/11/01) 247 multi = false; 248 quotCheck = HybsSystem.sysBool( "USE_SQL_INJECTION_CHECK" ); // 4.0.0 (2005/08/31) 249 xssCheck = HybsSystem.sysBool( "USE_XSS_CHECK" ); // 5.0.0.2 (2009/09/15) 250 allNull = false; // 5.0.0.2 (2009/09/15) 251// matchKey = null; // 5.1.9.0 (2010/08/01) 新規追加 252// matchVal = null; // 5.1.9.0 (2010/08/01) 新規追加 253 separator = null; // 5.2.2.0 (2010/11/01) 項目区切り文字 254 } 255 256 /** 257 * リクエスト情報の文字列を取得します。 258 * 259 * これは、通常のgetRequestParameter 処理の中で呼ばれる getRequestValue を 260 * オーバーライトしています。 261 * 262 * @og.rev 5.0.0.2 (2009/09/15) valuesの全NULL/空文字をisNull扱いにする 263 * @og.rev 5.3.8.0 (2011/08/01) Attribute等からも値が取得できるようにする。の対応時の特殊処理 264 * 265 * @param key キー 266 * 267 * @return リクエスト情報の文字列 268 */ 269 @Override 270 protected String getRequestValue( final String key ) { 271 String rtn = ""; 272 273 if( multi ) { 274 // 5.3.8.0 (2011/08/01) getRequestValues の中で、getRequestValue を呼び出すためこのままでは 275 // 再帰呼び出しが永遠に続くので、2回目以降は、再帰しないように、強制的に multi の値を書き換えます。 276 multi = false; // 5.3.8.0 (2011/08/01) 再帰しないように、強制的に値を書き換え 277 String[] array = getRequestValues( key ); 278 allNull = true; // 5.0.0.2 (2009/09/15) arrayの内容が全てnull/空文字か 279 if( ! isNull() ) { 280 // 5.0.0.2 (2009/09/15) 全てnull/空文字の場合はnullと扱い 281 for( int i = 0; i < array.length; i++ ) { 282 if( array[i] != null && array[i].length() > 0 ) { 283 allNull = false; 284 break; 285 } 286 } 287 if( ! allNull ){ 288 rtn = makeCSVvalue( array ); 289 } 290 } 291 multi = true; // 5.3.8.0 (2011/08/01) 強制的に書き換えた値を元に戻す。 292 } 293 else { 294 rtn = super.getRequestValue( key ); 295 } 296 return rtn ; 297 } 298 299 /** 300 * 複数の値を 'xx1','xx2','xx3', ・・・ という形式に変換します。 301 * 302 * この処理は、in などで使用するためのリクエストを配列で受け取って処理 303 * する場合の文字列を加工します。 304 * 305 * @og.rev 5.2.2.0 (2010/11/01) separator 対応 306 * 307 * @param array 元の配列文字列 308 * 309 * @return 連結後の文字列 310 */ 311 private String makeCSVvalue( final String[] array ) { 312 if( array == null || array.length == 0 ) { 313 String errMsg = "array 引数に、null や、サイズゼロの配列は使用できません。"; 314 throw new HybsSystemException( errMsg ); 315 } 316 317 StringBuilder buf = new StringBuilder( HybsSystem.BUFFER_MIDDLE ); 318 319 if( separator != null ) { 320 for(int i=0; i < array.length; i++) { 321 String[] ary = array[i].split( separator ); 322 for( int j=0; j<ary.length; j++ ) { 323 buf.append( "'" ); 324 buf.append( ary[j] ); 325 buf.append( "'," ); 326 } 327 } 328 buf.deleteCharAt( buf.length()-1 ); // 最後の ピリオドを削除する。 329 } 330 else { 331 for(int i=0; i < array.length; i++) { 332 buf.append( "'" ); 333 buf.append( array[i] ); 334 buf.append( "'," ); 335 } 336 buf.deleteCharAt( buf.length()-1 ); // 最後の ピリオドを削除する。 337 } 338// buf.append( "'" ); 339// buf.append( array[0] ); 340// buf.append( "'" ); 341// for(int i=1; i < array.length; i++) { 342// buf.append( ",'" ); 343// buf.append( array[i] ); 344// buf.append( "'" ); 345// } 346 return buf.toString(); 347 } 348 349 /** 350 * スペースで区切られた複数の値を and 接続で連結します。 351 * 352 * value="CLM" instrVals="ABC DEF GHI" と指定すると、 353 * value="CLM LIKE '%ABC%' AND CLM LIKE '%DEF%' AND CLM LIKE '%GHI%' " 354 * という文字列を作成します。 355 * 個別にLIKE検索項目を AND 連結する為、現れる場所に依存しません。 356 * 逆に、現れる順序を指定する場合は、ABC%DEF の様に指定可能です。 357 * ただし、columnMarker の instrVals で、複数文字のマーカーを行う場合、 358 * ABC%DEF という文字列は、オリジナルでないので、マークアップされません。 359 * 360 * @og.rev 5.4.1.0 (2011/11/01) instrType属性対応 361 * @og.rev 5.5.1.1 (2012/04/06) notin対応 362 * 363 * @param instrVals 繰返し処理を行う 値 364 * @param instrType 連結方法 365 * @param value 繰返し処理を行う value 366 * 367 * @return 連結後の文字列 368 * @see #setInstrVals( String ) 369 * @see ColumnMarkerTag#setInstrVals( String ) 370 */ 371 private String makeInstrVals( final String instrVals, final String instrType , final String value ) { 372 if( instrVals == null || instrVals.length() == 0 ) { return value; } 373 374 String reqVals = nval( getRequestParameter( instrVals ),null ); 375 if( reqVals == null || reqVals.length() == 0 ) { return null; } 376 377 final String[] vals ; 378 if( multi ) { 379 // multi のときは、makeCSVvalue で加工された値になっている。 380 vals = StringUtil.csv2Array( reqVals,',' ); 381 // 前後の ' はずし 382 for( int i=0; i<vals.length; i++ ) { 383 vals[i] = vals[i].substring( 1,vals[i].length()-1 ); 384 } 385 } 386 else { 387 vals = StringUtil.csv2Array( reqVals,' ' ); 388 } 389 390 if( vals == null || vals.length == 0 ) { return null; } 391 392 StringBuilder buf = new StringBuilder( HybsSystem.BUFFER_SMALL ); 393 394// buf.append( value ); 395// buf.append( " LIKE '%" ); 396// buf.append( vals[0] ); 397// buf.append( "%'" ); 398 399 buf.append( " (" ); 400 // 条件:and ⇒ 各値をandのlike条件で結合(%あり) 401 if( instrType.startsWith( "a" ) ) { 402 for(int i=0; i < vals.length; i++) { 403 if( i > 0 ) { buf.append( " and " ); } 404 buf.append( value ); 405 buf.append( " LIKE '%" ).append( vals[i] ).append( "%'" ); 406 } 407 } 408 // 条件:or ⇒ 各値をorのlike条件で結合(%あり) 409 else if( instrType.startsWith( "o" ) ) { 410 for(int i=0; i < vals.length; i++) { 411 if( i > 0 ) { buf.append( " or " ); } 412 buf.append( value ); 413 buf.append( " LIKE '%" ).append( vals[i] ).append( "%'" ); 414 } 415 } 416 // 条件:in ⇒ 各値をorのlike条件で結合(%なし) 417 else if( instrType.startsWith( "i" ) ) { 418 for(int i=0; i < vals.length; i++) { 419 if( i > 0 ) { buf.append( " or " ); } 420 buf.append( value ); 421 buf.append( " LIKE '" ).append( vals[i] ).append( "'" ); 422 } 423 } 424 // 条件:notin ⇒ 各値をandのnot like条件で結合(%なし) 5.5.1.1(2012/04/05) 425 else if( instrType.startsWith( "n" ) ) { 426 for(int i=0; i < vals.length; i++) { 427 if( i > 0 ) { buf.append( " and " ); } 428 buf.append( value ); 429 buf.append( " NOT LIKE '" ).append( vals[i] ).append( "'" ); 430 } 431 } 432 else { 433 String errMsg = "instrTypeには、'and','or','in','notin'のいずれかを指定して下さい。instrType=[" + instrType + "]"; 434 throw new HybsSystemException( errMsg ); 435 } 436 buf.append( ") " ); 437 438 return buf.toString(); 439 } 440 441 /** 442 * 【TAG】SQL条件句の最初の演算子を指定します(初期値:and)。 443 * 444 * @og.tag 445 * value を連結する場合の頭に置かれる文字列で、where句の最初には表示されず、 446 * それ以降について、表示されます。 447 * (つまり、where VALUE1 and VALUE2 and VALUE3 … です。) 448 * startKey の初期値は、"and" です。 449 * 450 * @param skey 条件句の最初の演算子 451 */ 452 public void setStartKey( final String skey ) { 453 if( skey != null && skey.length() > 0 ) { startKey = skey; } 454 } 455 456 /** 457 * 【TAG】条件の値を セットします。 458 * 459 * @og.tag 460 * 条件値に、{@XXXX} 変数が含まれている場合、そのリクエスト値がない場合は、 461 * このタグそのものがなにも出力しません。(つまり条件から消えます。) 462 * BODY 部に記述することが可能です。その場合は、条件属性になにも設定できません。 463 * 464 * @param val 条件値 465 */ 466 public void setValue( final String val ) { 467 value = val; 468 } 469 470 /** 471 * 【TAG】スペースで区切られた複数の値すべてを含む条件を作成します。 472 * 473 * @og.tag 474 * 通常、value="CLM LIKE 'ABC%'" という文字列を指定しますが、 475 * value="CLM" instrVals="ABC DEF GHI" と指定すると、 476 * value="CLM LIKE '%ABC%' AND CLM LIKE '%DEF%' AND CLM LIKE '%GHI%' " 477 * という文字列を作成します。 478 * これは、instrVals に指定した引数に対して、スペース区切りで分割し、 479 * 前方の value に複数のAND検索を同時に実現できるように指定します 480 * 個別にLIKE検索項目を AND 連結する為、現れる場所に依存しません。 481 * 逆に、現れる順序を指定する場合は、ABC%DEF の様に指定可能です。 482 * ただし、columnMarker の instrVals で、複数文字のマーカーを行う場合、 483 * ABC%DEF という文字列は、オリジナルでないので、マークアップされません。 484 * ※instrType属性の指定により条件の生成方法を変更することができます。 485 * 詳細については、instrType属性のドキュメントを参照下さい。 486 * 487 * @param val 複合条件作成のための設定値 488 * @see #setInstrType 489 * @see ColumnMarkerTag#setInstrVals( String ) 490 */ 491 public void setInstrVals( final String val ) { 492 instrVals = val; 493 } 494 495 /** 496 * 【TAG】instrValsで複数の値を条件にする際の方法を指定します(初期値:and)。 497 * 498 * @og.tag 499 * 通常、instrValsに指定された値は、スペース区切りで分割した各値をLIKE条件としてand結合します。 500 * しかし、instrType属性を変更することで、この条件式の生成方法を変更 501 * することができます。 502 * 具体的には、以下の通りです。 503 * @instrTypeに"and"が指定されている場合(初期値) 504 * タグの記述 : value="CLM" instrVals="ABC DEF GHI" 505 * 生成文字列 : "( CLM LIKE '%ABC%' AND CLM LIKE '%DEF%' AND CLM LIKE '%GHI%' )" 506 * AinstrTypeに"or"が指定されている場合 507 * タグの記述 : value="CLM" instrVals="ABC DEF GHI" 508 * 生成文字列 : "( CLM LIKE '%ABC%' OR CLM LIKE '%DEF%' OR CLM LIKE '%GHI%' )" 509 * BinstrTypeに"in"が指定されている場合 510 * タグの記述 : value="CLM" instrVals="ABC DEF GHI" 511 * 生成文字列 : "( CLM LIKE 'ABC' OR CLM LIKE 'DEF5' OR CLM LIKE 'GHI' )" 512 * CinstrTypeに"notin"が指定されている場合 513 * タグの記述 : value="CLM" instrVals="ABC DEF GHI" 514 * 生成文字列 : "( CLM NOT LIKE 'ABC' AND CLM NOT LIKE 'DEF5' AND CLM NOT LIKE 'GHI' )" 515 * ※この属性を指定しない場合は、@のLIKE条件でのand結合となります。 516 * ※BCについて、LIKE条件で%を自動付加しないことにより、画面からの入力値に応じて、 517 * 前方一致、後方一致、前後方一致の制御を行うことができます。 518 * 519 * @og.rev 5.5.1.1 (2012/04/06) notin対応(コメント修正) 520 * 521 * @param tp 条件方法[and/or/in/notin] 522 * @see #setInstrVals( String ) 523 */ 524 public void setInstrType( final String tp ) { 525 instrType = nval( getRequestParameter( tp ),tp ); 526 } 527 528 /** 529 * 【TAG】複数の引数に対して処理するかどうか[true/false]を設定します(初期値:false)。 530 * 531 * @og.tag 532 * {@XXXX} 変数に、値が複数含まれている場合の処理を規定します。 533 * multi="true" に設定すると、複数の引数は、'xx1','xx2','xx3', ・・・ という 534 * 形式に変換します。 535 * where 条件で言うと、 "where PN in ( {@PN} )" という文字列に対して、 536 * "where PN in ( 'xx1','xx2','xx3' )" を作成することになります。 537 * 初期値は、 false (マルチ変換しない) です。 538 * 539 * @param flag マルチ変換 [true:する/それ以外:しない 540 * @see #setSeparator( String ) 541 */ 542 public void setMulti( final String flag ) { 543 multi = nval( flag,multi ); 544 } 545 546 /** 547 * 【TAG】multi アクション時の文字列を分割する項目区切り文字をセットします。 548 * 549 * @og.tag 550 * multi="true" の場合、複数のリクエストを連結して、 in 句で問合せを行う文字列を 551 * 作成しますが、separator を指定すると、さらに、separator で文字列を分割して、 552 * in 句の引数を構築します。 553 * 具体的には、分割後の文字列が、複数の個々のリクエスト変数と同じ形式に加工されます。 554 * この機能は、multi="true" を指定した場合のみ有効になります。 555 * 初期値は、null です。つまり、分割処理は行いません。 556 * 557 * @og.rev 5.2.2.0 (2010/11/01) 新規追加 558 * 559 * @param sepa 項目区切り文字 560 * @see #setMulti( String ) 561 */ 562 public void setSeparator( final String sepa ) { 563 separator = nval( getRequestParameter( sepa ),separator ); 564 } 565 566 /** 567 * 【TAG】リクエスト情報の クォーティション(') 存在チェックを実施するかどうか[true/false]を設定します 568 * (初期値:USE_SQL_INJECTION_CHECK[={@og.value org.opengion.hayabusa.common.SystemData#USE_SQL_INJECTION_CHECK}])。 569 * 570 * @og.tag 571 * SQLインジェクション対策の一つとして、暫定的ではありますが、SQLのパラメータに 572 * 渡す文字列にクォーティション(') を許さない設定にすれば、ある程度は防止できます。 573 * 数字タイプの引数には、 or 5=5 などのクォーティションを使用しないコードを埋めても、 574 * 数字チェックで検出可能です。文字タイプの場合は、必ず (')をはずして、 575 * ' or 'A' like 'A のような形式になる為、(')チェックだけでも有効です。 576 * (') が含まれていたエラーにする(true)/かノーチェックか(false)を指定します。 577 * (初期値:システム定数のUSE_SQL_INJECTION_CHECK[={@og.value org.opengion.hayabusa.common.SystemData#USE_SQL_INJECTION_CHECK}])。 578 * 579 * @og.rev 4.0.0.0 (2005/08/31) 新規追加 580 * 581 * @param flag クォーティションチェック [true:する/それ以外:しない] 582 * @see org.opengion.hayabusa.common.SystemData#USE_SQL_INJECTION_CHECK 583 */ 584 public void setQuotCheck( final String flag ) { 585 quotCheck = nval( getRequestParameter( flag ),quotCheck ); 586 } 587 588 /** 589 * 【TAG】リクエスト情報の HTMLTag開始/終了文字(><) 存在チェックを実施するかどうか[true/false]を設定します 590 * (初期値:USE_XSS_CHECK[={@og.value org.opengion.hayabusa.common.SystemData#USE_XSS_CHECK}])。 591 * 592 * @og.tag 593 * クロスサイトスクリプティング(XSS)対策の一環としてless/greater than signについてのチェックを行います。 594 * (><) が含まれていたエラーにする(true)/かノーチェックか(false)を指定します。 595 * (初期値:システム定数のUSE_XSS_CHECK[={@og.value org.opengion.hayabusa.common.SystemData#USE_XSS_CHECK}])。 596 * 597 * @og.rev 5.0.0.2 (2009/09/15) 新規追加 598 * 599 * @param flag XSSチェック [true:する/false:しない] 600 * @see org.opengion.hayabusa.common.SystemData#USE_XSS_CHECK 601 */ 602 public void setXssCheck( final String flag ) { 603 xssCheck = nval( getRequestParameter( flag ),xssCheck ); 604 } 605 606 /** 607 * 【TAG】このタグ自体を利用するかどうかの条件キーを指定します。 608 * 609 * @og.tag 610 * matchKey.matches( matchVal ) の値が、true の場合は、このタグは使用されます。 611 * false の場合は、このタグは使用されません。 612 * value 値に、{@XXXX} 変数が含まれている場合と同じ効果を得られます。 613 * 何も指定しない場合、または、引数が null の場合は、true と同じで使用されます。 614 * 615 * @og.rev 5.1.9.0 (2010/08/01) 新規追加 616 * @og.rev 5.2.2.0 (2010/11/01) 廃止(caseKey,caseVal属性を使用してください。) 617 * 618 * @param mkey String 619 */ 620// public void setMatchKey( final String mkey ) { 621// matchKey = nval( getRequestParameter( mkey ),matchKey ); 622// } 623 624 /** 625 * 【TAG】このタグ自体を利用するかどうかの条件値を指定します。 626 * 627 * @og.tag 628 * matchKey.matches( matchVal ) の値が、true の場合は、このタグは使用されます。 629 * false の場合は、このタグは使用されません。 630 * value 値に、{@XXXX} 変数が含まれている場合と同じ効果を得られます。 631 * 何も指定しない場合、または、引数が null の場合は、true と同じで使用されます。 632 * 633 * @og.rev 5.1.9.0 (2010/08/01) 新規追加 634 * @og.rev 5.2.2.0 (2010/11/01) 廃止(caseKey,caseVal属性を使用してください。) 635 * 636 * @param mval String 637 */ 638// public void setMatchVal( final String mval ) { 639// matchVal = nval( getRequestParameter( mval ),matchVal ); 640// } 641 642 /** 643 * タグの名称を、返します。 644 * 自分自身のクラス名より、自動的に取り出せないため、このメソッドをオーバーライドします。 645 * 646 * @og.rev 4.0.0.0 (2005/01/31) 新規追加 647 * 648 * @return タグの名称 649 */ 650 @Override 651 protected String getTagName() { 652 return "and" ; 653 } 654 655 /** 656 * このオブジェクトの文字列表現を返します。 657 * 基本的にデバッグ目的に使用します。 658 * 659 * @return このクラスの文字列表現 660 */ 661 @Override 662 public String toString() { 663 return org.opengion.fukurou.util.ToString.title( this.getClass().getName() ) 664 .println( "VERSION" ,VERSION ) 665 .println( "startKey" ,startKey ) 666 .println( "value" ,value ) 667 .println( "instrVals" ,instrVals ) 668 .println( "multi" ,multi ) 669 .println( "quotCheck" ,quotCheck ) 670 .println( "Other..." ,getAttributes().getAttribute() ) 671 .fixForm().toString() ; 672 } 673}