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 * instrVals 【TAG】スペースで区切られた複数の値すべてを含む条件を作成します 060 * instrType 【TAG】instrValsで複数の値を条件にする際の方法を指定します(初期値:and) 061 * quotCheck 【TAG】リクエスト情報の クォーティション(') 存在チェックを実施するかどうか[true/false]を設定します (初期値:USE_SQL_INJECTION_CHECK[=true]) 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 separator = null; // 5.2.2.0 (2010/11/01) 項目区切り文字 131 132 /** 133 * Taglibの開始タグが見つかったときに処理する doStartTag() を オーバーライドします。 134 * 135 * @og.rev 4.0.0.0 (2006/12/05) BODY 部の値を value に使用する機能追加 136 * @og.rev 4.0.0.0 (2005/08/31) useQuotCheck() によるSQLインジェクション対策 137 * @og.rev 5.0.0.2 (2009/09/15) XSS対策 138 * @og.rev 5.2.2.0 (2010/11/01) caseKey 、caseVal 属性対応 139 * 140 * @return 後続処理の指示 141 */ 142 @Override 143 public int doStartTag() { 144 // 5.2.2.0 (2010/11/01) caseKey 、caseVal 属性対応 145 if( useTag() ) { 146 useQuotCheck( quotCheck ); 147 // 5.0.0.2 (2009/09/15) XSS対策 148 useXssCheck( xssCheck ); 149 150 value = getRequestParameter( value ); 151 152 if( value == null || value.isEmpty() ) { 153 return EVAL_BODY_BUFFERED ; // Body を評価する。( extends BodyTagSupport 時) 154 } 155 156 // if( value != null && value.length() > 0 ) { 157 // return( SKIP_BODY ); // Body を評価しない 158 // } 159 // else { 160 // return EVAL_BODY_BUFFERED ; // Body を評価する。( extends BodyTagSupport 時) 161 // } 162 } 163 return SKIP_BODY ; // Body を評価しない 164 } 165 166 /** 167 * Taglibのタグ本体を処理する doAfterBody() を オーバーライドします。 168 * 169 * @og.rev 4.0.0.0 (2006/12/05) BODY 部の値を value に使用する機能追加 170 * 171 * @return 後続処理の指示(SKIP_BODY) 172 */ 173 @Override 174 public int doAfterBody() { 175 value = getBodyString(); 176 return SKIP_BODY ; 177 } 178 179 /** 180 * Taglibの終了タグが見つかったときに処理する doEndTag() を オーバーライドします。 181 * 182 * @og.rev 3.1.1.2 (2003/04/04) Tomcat4.1 対応。release2() を doEndTag()で呼ぶ。 183 * @og.rev 3.8.8.1 (2007/01/06) makeInstrVals を加味する。 184 * @og.rev 5.0.0.2 (2009/09/15) multi時のallNull対応 185 * @og.rev 5.1.9.0 (2010/08/01) matchKey 、matchVal 対応 ⇒ 5.2.2.0 (2010/11/01) 廃止 186 * @og.rev 5.2.2.0 (2010/11/01) caseKey 、caseVal 属性対応 187 * 188 * @return 後続処理の指示 189 */ 190 @Override 191 public int doEndTag() { 192 debugPrint(); // 4.0.0 (2005/02/28) 193 // 5.2.2.0 (2010/11/01) caseKey 、caseVal 属性対応 194 if( useTag() ) { 195 SqlWhereTag where = (SqlWhereTag)findAncestorWithClass( this,SqlWhereTag.class ); 196 if( where == null ) { 197 String errMsg = "<b>" + getTagName() + "タグは、where タグの内部におく必要があります。</b>"; 198 throw new HybsSystemException( errMsg ); 199 } 200 201 // 5.1.9.0 (2010/08/01) matchKey 、matchVal 対応 ⇒ 5.2.2.0 (2010/11/01) 廃止 202 if( ! isNull() && ! allNull ) { // 5.2.2.0 (2010/11/01) 203 value = makeInstrVals( instrVals,instrType,value ); // 5.4.1.0 (2011/11/01) 204 if( value != null ) { 205 set( "keyWord", startKey ); 206 set( "value" , value ); 207 where.setAttributes( getAttributes() ); 208 } 209 } 210 } 211 return EVAL_PAGE ; 212 } 213 214 /** 215 * タグリブオブジェクトをリリースします。 216 * キャッシュされて再利用されるので、フィールドの初期設定を行います。 217 * 218 * @og.rev 2.0.0.4 (2002/09/27) カスタムタグの release() メソッドを、追加 219 * @og.rev 3.1.1.2 (2003/04/04) Tomcat4.1 対応。release2() を doEndTag()で呼ぶ。 220 * @og.rev 3.8.8.1 (2007/01/06) instrVals 属性追加 221 * @og.rev 4.0.0.0 (2005/08/31) quotCheck 属性の追加 222 * @og.rev 5.0.0.2 (2009/09/15) XSS対応 223 * @og.rev 5.0.0.2 (2009/09/15) multi時のallNull対応 224 * @og.rev 5.1.9.0 (2010/08/01) matchKey、matchVal 属性の追加 225 * @og.rev 5.2.2.0 (2010/11/01) separator , isMatch 属性の追加 226 * @og.rev 5.2.2.0 (2010/11/01) matchKey、matchVal 属性廃止(caseKey,caseVal属性を使用してください。) 227 * @og.rev 5.4.1.0 (2011/11/01) instrType属性追加 228 */ 229 @Override 230 protected void release2() { 231 super.release2(); 232 startKey = "and"; 233 value = ""; 234 instrVals = null; // 3.8.8.1 (2007/01/06) 235 instrType = "and"; // 5.4.1.0 (2011/11/01) 236 multi = false; 237 quotCheck = HybsSystem.sysBool( "USE_SQL_INJECTION_CHECK" ); // 4.0.0 (2005/08/31) 238 xssCheck = HybsSystem.sysBool( "USE_XSS_CHECK" ); // 5.0.0.2 (2009/09/15) 239 allNull = false; // 5.0.0.2 (2009/09/15) 240 separator = null; // 5.2.2.0 (2010/11/01) 項目区切り文字 241 } 242 243 /** 244 * リクエスト情報の文字列を取得します。 245 * 246 * これは、通常のgetRequestParameter 処理の中で呼ばれる getRequestValue を 247 * オーバーライトしています。 248 * 249 * @og.rev 5.0.0.2 (2009/09/15) valuesの全NULL/空文字をisNull扱いにする 250 * @og.rev 5.3.8.0 (2011/08/01) Attribute等からも値が取得できるようにする。の対応時の特殊処理 251 * 252 * @param key キー 253 * 254 * @return リクエスト情報の文字列 255 */ 256 @Override 257 protected String getRequestValue( final String key ) { 258 String rtn = ""; 259 260 if( multi ) { 261 // 5.3.8.0 (2011/08/01) getRequestValues の中で、getRequestValue を呼び出すためこのままでは 262 // 再帰呼び出しが永遠に続くので、2回目以降は、再帰しないように、強制的に multi の値を書き換えます。 263 multi = false; // 5.3.8.0 (2011/08/01) 再帰しないように、強制的に値を書き換え 264 String[] array = getRequestValues( key ); 265 allNull = true; // 5.0.0.2 (2009/09/15) arrayの内容が全てnull/空文字か 266 if( ! isNull() ) { 267 // 5.0.0.2 (2009/09/15) 全てnull/空文字の場合はnullと扱い 268 for( int i = 0; i < array.length; i++ ) { 269 if( array[i] != null && array[i].length() > 0 ) { 270 allNull = false; 271 break; 272 } 273 } 274 if( ! allNull ){ 275 rtn = makeCSVvalue( array ); 276 } 277 } 278 multi = true; // 5.3.8.0 (2011/08/01) 強制的に書き換えた値を元に戻す。 279 } 280 else { 281 rtn = super.getRequestValue( key ); 282 } 283 return rtn ; 284 } 285 286 /** 287 * 複数の値を 'xx1','xx2','xx3', ・・・ という形式に変換します。 288 * 289 * この処理は、in などで使用するためのリクエストを配列で受け取って処理 290 * する場合の文字列を加工します。 291 * 292 * @og.rev 5.2.2.0 (2010/11/01) separator 対応 293 * 294 * @param array 元の配列文字列 295 * 296 * @return 連結後の文字列 297 */ 298 private String makeCSVvalue( final String[] array ) { 299 if( array == null || array.length == 0 ) { 300 String errMsg = "array 引数に、null や、サイズゼロの配列は使用できません。"; 301 throw new HybsSystemException( errMsg ); 302 } 303 304 StringBuilder buf = new StringBuilder( HybsSystem.BUFFER_MIDDLE ); 305 306 if( separator != null ) { 307 for(int i=0; i < array.length; i++) { 308 String[] ary = array[i].split( separator ); 309 for( int j=0; j<ary.length; j++ ) { 310 buf.append( "'" ); 311 buf.append( ary[j] ); 312 buf.append( "'," ); 313 } 314 } 315 buf.deleteCharAt( buf.length()-1 ); // 最後の ピリオドを削除する。 316 } 317 else { 318 for(int i=0; i < array.length; i++) { 319 buf.append( "'" ); 320 buf.append( array[i] ); 321 buf.append( "'," ); 322 } 323 buf.deleteCharAt( buf.length()-1 ); // 最後の ピリオドを削除する。 324 } 325 326 return buf.toString(); 327 } 328 329 /** 330 * スペースで区切られた複数の値を and 接続で連結します。 331 * 332 * value="CLM" instrVals="ABC DEF GHI" と指定すると、 333 * value="CLM LIKE '%ABC%' AND CLM LIKE '%DEF%' AND CLM LIKE '%GHI%' " 334 * という文字列を作成します。 335 * 個別にLIKE検索項目を AND 連結する為、現れる場所に依存しません。 336 * 逆に、現れる順序を指定する場合は、ABC%DEF の様に指定可能です。 337 * ただし、columnMarker の instrVals で、複数文字のマーカーを行う場合、 338 * ABC%DEF という文字列は、オリジナルでないので、マークアップされません。 339 * 340 * @og.rev 5.4.1.0 (2011/11/01) instrType属性対応 341 * @og.rev 5.5.1.1 (2012/04/06) notin対応 342 * 343 * @param instrVals 繰返し処理を行う 値 344 * @param instrType 連結方法 345 * @param value 繰返し処理を行う value 346 * 347 * @return 連結後の文字列 348 * @see #setInstrVals( String ) 349 * @see ColumnMarkerTag#setInstrVals( String ) 350 */ 351 private String makeInstrVals( final String instrVals, final String instrType , final String value ) { 352 if( instrVals == null || instrVals.length() == 0 ) { return value; } 353 354 String reqVals = nval( getRequestParameter( instrVals ),null ); 355 if( reqVals == null || reqVals.length() == 0 ) { return null; } 356 357 final String[] vals ; 358 if( multi ) { 359 // multi のときは、makeCSVvalue で加工された値になっている。 360 vals = StringUtil.csv2Array( reqVals,',' ); 361 // 前後の ' はずし 362 for( int i=0; i<vals.length; i++ ) { 363 vals[i] = vals[i].substring( 1,vals[i].length()-1 ); 364 } 365 } 366 else { 367 vals = StringUtil.csv2Array( reqVals,' ' ); 368 } 369 370 if( vals == null || vals.length == 0 ) { return null; } 371 372 StringBuilder buf = new StringBuilder( HybsSystem.BUFFER_SMALL ); 373 374 buf.append( " (" ); 375 // 条件:and ⇒ 各値をandのlike条件で結合(%あり) 376 if( instrType.startsWith( "a" ) ) { 377 for(int i=0; i < vals.length; i++) { 378 if( i > 0 ) { buf.append( " and " ); } 379 buf.append( value ); 380 buf.append( " LIKE '%" ).append( vals[i] ).append( "%'" ); 381 } 382 } 383 // 条件:or ⇒ 各値をorのlike条件で結合(%あり) 384 else if( instrType.startsWith( "o" ) ) { 385 for(int i=0; i < vals.length; i++) { 386 if( i > 0 ) { buf.append( " or " ); } 387 buf.append( value ); 388 buf.append( " LIKE '%" ).append( vals[i] ).append( "%'" ); 389 } 390 } 391 // 条件:in ⇒ 各値をorのlike条件で結合(%なし) 392 else if( instrType.startsWith( "i" ) ) { 393 for(int i=0; i < vals.length; i++) { 394 if( i > 0 ) { buf.append( " or " ); } 395 buf.append( value ); 396 buf.append( " LIKE '" ).append( vals[i] ).append( "'" ); 397 } 398 } 399 // 条件:notin ⇒ 各値をandのnot like条件で結合(%なし) 5.5.1.1(2012/04/05) 400 else if( instrType.startsWith( "n" ) ) { 401 for(int i=0; i < vals.length; i++) { 402 if( i > 0 ) { buf.append( " and " ); } 403 buf.append( value ); 404 buf.append( " NOT LIKE '" ).append( vals[i] ).append( "'" ); 405 } 406 } 407 else { 408 String errMsg = "instrTypeには、'and','or','in','notin'のいずれかを指定して下さい。instrType=[" + instrType + "]"; 409 throw new HybsSystemException( errMsg ); 410 } 411 buf.append( ") " ); 412 413 return buf.toString(); 414 } 415 416 /** 417 * 【TAG】SQL条件句の最初の演算子を指定します(初期値:and)。 418 * 419 * @og.tag 420 * value を連結する場合の頭に置かれる文字列で、where句の最初には表示されず、 421 * それ以降について、表示されます。 422 * (つまり、where VALUE1 and VALUE2 and VALUE3 … です。) 423 * startKey の初期値は、"and" です。 424 * 425 * @param skey 条件句の最初の演算子 426 */ 427 public void setStartKey( final String skey ) { 428 if( skey != null && skey.length() > 0 ) { startKey = skey; } 429 } 430 431 /** 432 * 【TAG】条件の値を セットします。 433 * 434 * @og.tag 435 * 条件値に、{@XXXX} 変数が含まれている場合、そのリクエスト値がない場合は、 436 * このタグそのものがなにも出力しません。(つまり条件から消えます。) 437 * BODY 部に記述することが可能です。その場合は、条件属性になにも設定できません。 438 * 439 * @param val 条件値 440 */ 441 public void setValue( final String val ) { 442 value = val; 443 } 444 445 /** 446 * 【TAG】スペースで区切られた複数の値すべてを含む条件を作成します。 447 * 448 * @og.tag 449 * 通常、value="CLM LIKE 'ABC%'" という文字列を指定しますが、 450 * value="CLM" instrVals="ABC DEF GHI" と指定すると、 451 * value="CLM LIKE '%ABC%' AND CLM LIKE '%DEF%' AND CLM LIKE '%GHI%' " 452 * という文字列を作成します。 453 * これは、instrVals に指定した引数に対して、スペース区切りで分割し、 454 * 前方の value に複数のAND検索を同時に実現できるように指定します 455 * 個別にLIKE検索項目を AND 連結する為、現れる場所に依存しません。 456 * 逆に、現れる順序を指定する場合は、ABC%DEF の様に指定可能です。 457 * ただし、columnMarker の instrVals で、複数文字のマーカーを行う場合、 458 * ABC%DEF という文字列は、オリジナルでないので、マークアップされません。 459 * ※instrType属性の指定により条件の生成方法を変更することができます。 460 * 詳細については、instrType属性のドキュメントを参照下さい。 461 * 462 * @param val 複合条件作成のための設定値 463 * @see #setInstrType 464 * @see ColumnMarkerTag#setInstrVals( String ) 465 */ 466 public void setInstrVals( final String val ) { 467 instrVals = val; 468 } 469 470 /** 471 * 【TAG】instrValsで複数の値を条件にする際の方法を指定します(初期値:and)。 472 * 473 * @og.tag 474 * 通常、instrValsに指定された値は、スペース区切りで分割した各値をLIKE条件としてand結合します。 475 * しかし、instrType属性を変更することで、この条件式の生成方法を変更 476 * することができます。 477 * 具体的には、以下の通りです。 478 * ①instrTypeに"and"が指定されている場合(初期値) 479 * タグの記述 : value="CLM" instrVals="ABC DEF GHI" 480 * 生成文字列 : "( CLM LIKE '%ABC%' AND CLM LIKE '%DEF%' AND CLM LIKE '%GHI%' )" 481 * ②instrTypeに"or"が指定されている場合 482 * タグの記述 : value="CLM" instrVals="ABC DEF GHI" 483 * 生成文字列 : "( CLM LIKE '%ABC%' OR CLM LIKE '%DEF%' OR CLM LIKE '%GHI%' )" 484 * ③instrTypeに"in"が指定されている場合 485 * タグの記述 : value="CLM" instrVals="ABC DEF GHI" 486 * 生成文字列 : "( CLM LIKE 'ABC' OR CLM LIKE 'DEF5' OR CLM LIKE 'GHI' )" 487 * ④instrTypeに"notin"が指定されている場合 488 * タグの記述 : value="CLM" instrVals="ABC DEF GHI" 489 * 生成文字列 : "( CLM NOT LIKE 'ABC' AND CLM NOT LIKE 'DEF5' AND CLM NOT LIKE 'GHI' )" 490 * ※この属性を指定しない場合は、①のLIKE条件でのand結合となります。 491 * ※③④について、LIKE条件で%を自動付加しないことにより、画面からの入力値に応じて、 492 * 前方一致、後方一致、前後方一致の制御を行うことができます。 493 * 494 * @og.rev 5.5.1.1 (2012/04/06) notin対応(コメント修正) 495 * 496 * @param tp 条件方法[and/or/in/notin] 497 * @see #setInstrVals( String ) 498 */ 499 public void setInstrType( final String tp ) { 500 instrType = nval( getRequestParameter( tp ),tp ); 501 } 502 503 /** 504 * 【TAG】複数の引数に対して処理するかどうか[true/false]を設定します(初期値:false)。 505 * 506 * @og.tag 507 * {@XXXX} 変数に、値が複数含まれている場合の処理を規定します。 508 * multi="true" に設定すると、複数の引数は、'xx1','xx2','xx3', ・・・ という 509 * 形式に変換します。 510 * where 条件で言うと、 "where PN in ( {@PN} )" という文字列に対して、 511 * "where PN in ( 'xx1','xx2','xx3' )" を作成することになります。 512 * 初期値は、 false (マルチ変換しない) です。 513 * 514 * @param flag マルチ変換 [true:する/それ以外:しない 515 * @see #setSeparator( String ) 516 */ 517 public void setMulti( final String flag ) { 518 multi = nval( flag,multi ); 519 } 520 521 /** 522 * 【TAG】multi アクション時の文字列を分割する項目区切り文字をセットします。 523 * 524 * @og.tag 525 * multi="true" の場合、複数のリクエストを連結して、 in 句で問合せを行う文字列を 526 * 作成しますが、separator を指定すると、さらに、separator で文字列を分割して、 527 * in 句の引数を構築します。 528 * 具体的には、分割後の文字列が、複数の個々のリクエスト変数と同じ形式に加工されます。 529 * この機能は、multi="true" を指定した場合のみ有効になります。 530 * 初期値は、null です。つまり、分割処理は行いません。 531 * 532 * @og.rev 5.2.2.0 (2010/11/01) 新規追加 533 * 534 * @param sepa 項目区切り文字 535 * @see #setMulti( String ) 536 */ 537 public void setSeparator( final String sepa ) { 538 separator = nval( getRequestParameter( sepa ),separator ); 539 } 540 541 /** 542 * 【TAG】リクエスト情報の クォーティション(') 存在チェックを実施するかどうか[true/false]を設定します 543 * (初期値:USE_SQL_INJECTION_CHECK[={@og.value org.opengion.hayabusa.common.SystemData#USE_SQL_INJECTION_CHECK}])。 544 * 545 * @og.tag 546 * SQLインジェクション対策の一つとして、暫定的ではありますが、SQLのパラメータに 547 * 渡す文字列にクォーティション(') を許さない設定にすれば、ある程度は防止できます。 548 * 数字タイプの引数には、 or 5=5 などのクォーティションを使用しないコードを埋めても、 549 * 数字チェックで検出可能です。文字タイプの場合は、必ず (')をはずして、 550 * ' or 'A' like 'A のような形式になる為、(')チェックだけでも有効です。 551 * (') が含まれていたエラーにする(true)/かノーチェックか(false)を指定します。 552 * (初期値:システム定数のUSE_SQL_INJECTION_CHECK[={@og.value org.opengion.hayabusa.common.SystemData#USE_SQL_INJECTION_CHECK}])。 553 * 554 * @og.rev 4.0.0.0 (2005/08/31) 新規追加 555 * 556 * @param flag クォーティションチェック [true:する/それ以外:しない] 557 * @see org.opengion.hayabusa.common.SystemData#USE_SQL_INJECTION_CHECK 558 */ 559 public void setQuotCheck( final String flag ) { 560 quotCheck = nval( getRequestParameter( flag ),quotCheck ); 561 } 562 563 /** 564 * 【TAG】リクエスト情報の HTMLTag開始/終了文字(><) 存在チェックを実施するかどうか[true/false]を設定します 565 * (初期値:USE_XSS_CHECK[={@og.value org.opengion.hayabusa.common.SystemData#USE_XSS_CHECK}])。 566 * 567 * @og.tag 568 * クロスサイトスクリプティング(XSS)対策の一環としてless/greater than signについてのチェックを行います。 569 * (><) が含まれていたエラーにする(true)/かノーチェックか(false)を指定します。 570 * (初期値:システム定数のUSE_XSS_CHECK[={@og.value org.opengion.hayabusa.common.SystemData#USE_XSS_CHECK}])。 571 * 572 * @og.rev 5.0.0.2 (2009/09/15) 新規追加 573 * 574 * @param flag XSSチェック [true:する/false:しない] 575 * @see org.opengion.hayabusa.common.SystemData#USE_XSS_CHECK 576 */ 577 public void setXssCheck( final String flag ) { 578 xssCheck = nval( getRequestParameter( flag ),xssCheck ); 579 } 580 581 /** 582 * タグの名称を、返します。 583 * 自分自身のクラス名より、自動的に取り出せないため、このメソッドをオーバーライドします。 584 * 585 * @og.rev 4.0.0.0 (2005/01/31) 新規追加 586 * 587 * @return タグの名称 588 */ 589 @Override 590 protected String getTagName() { 591 return "and" ; 592 } 593 594 /** 595 * このオブジェクトの文字列表現を返します。 596 * 基本的にデバッグ目的に使用します。 597 * 598 * @return このクラスの文字列表現 599 */ 600 @Override 601 public String toString() { 602 return org.opengion.fukurou.util.ToString.title( this.getClass().getName() ) 603 .println( "VERSION" ,VERSION ) 604 .println( "startKey" ,startKey ) 605 .println( "value" ,value ) 606 .println( "instrVals" ,instrVals ) 607 .println( "multi" ,multi ) 608 .println( "quotCheck" ,quotCheck ) 609 .println( "Other..." ,getAttributes().getAttribute() ) 610 .fixForm().toString() ; 611 } 612}