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.HybsSystemException; 019import org.opengion.fukurou.util.XHTMLTag; 020import org.opengion.fukurou.util.StringUtil; 021import org.opengion.fukurou.util.ToString; // 6.1.1.0 (2015/01/17) 022 023import static org.opengion.fukurou.util.StringUtil.nval ; 024 025/** 026 * 隠しフィールドを作成するタグです(bodyHidden は廃止しました)。 027 * name属性をキーにvalue属性をセットします。 028 * 通常のhiddenタグの他に、BODY部に記述した値を送信することができます。 029 * BODY部に記述した値は、リターンコードが取り除かれます。 030 * また、keys属性、vals属性を指定することで、複数のキー+値を同時に設定できます。 031 * 032 * ※ id属性は、name が使用されます。 033 * 034 * 6.9.9.3 (2018/09/25) 035 * JSPチェック専用の、noForm属性は、formに含まれない hidden タグをエラーにしません。 036 * 037 * @og.formSample 038 * ●形式: 039 * ・<og:hidden name="…" value="…" /> 040 * ・<og:hidden keys="…" vals="…" /> 041 * ・<og:hidden name="…" /> 042 * ・・・ 043 * </og:hidden> 044 * ●body:あり(EVAL_BODY_BUFFERED:BODYを評価し、{@XXXX} を解析します) 045 * 046 * ●Tag定義: 047 * <og:hidden 048 * name 【TAG】名前を指定します(name属性とkeys属性は同時には登録できません) 049 * value 【TAG】値を指定します(この属性を使うとBODY部は無視されます) 050 * keys 【TAG】名前をCSV形式で複数指定します(name属性とkeys属性は同時には登録できません) 051 * vals 【TAG】keys属性に対応する値をCSV形式で複数指定します 052 * defaultVal 【TAG】value属性に値がセットされていないときに、初期値をセットします 053 * noForm 【TAG】formの外で使用する場合に、true にセットします(JavaScriptの変数受け渡し等) 6.9.9.3 (2018/09/25) 054 * caseKey 【TAG】このタグ自体を利用するかどうかの条件キーを指定します(初期値:null) 055 * caseVal 【TAG】このタグ自体を利用するかどうかの条件値を指定します(初期値:null) 056 * caseNN 【TAG】指定の値が、null/ゼロ文字列 でない場合(Not Null=NN)は、このタグは使用されます(初期値:判定しない) 057 * caseNull 【TAG】指定の値が、null/ゼロ文字列 の場合は、このタグは使用されます(初期値:判定しない) 058 * caseIf 【TAG】指定の値が、true/TRUE文字列の場合は、このタグは使用されます(初期値:判定しない) 059 * debug 【TAG】デバッグ情報を出力するかどうか[true/false]を指定します(初期値:false) 060 * > ... Body ... 061 * </og:hidden> 062 * 063 * ●使用例 064 * ・次画面にPNという名前で{@PN}に入っている値を渡します。 065 * <og:hidden name="PN" value="{@PN}" /> 066 * 067 * ・次画面で使用するPLSQLと引数を渡します。 068 * <og:hidden name="name" value="UNIQ,LKIS,KBLOYA,KBLKO,KBNGK,HJO,KBLKNM" /> 069 * <og:hidden name="SQL" value="{ call RKP0011B.RK0011B( ?,?,?,?,? ) }" /> 070 * ↓ 071 * <og:plsqlUpdate 072 * command = "{@command}" 073 * names = "{@names}" 074 * dbType = "RK0011ARG" 075 * queryType = "JDBCPLSQL" > 076 * {@SQL} 077 * </og:plsqlUpdate> 078 * 079 * ・次画面にSQLという名前でBodyに記述した値を渡します。 080 * <og:hidden name="SQL" 081 * SELECT AAA 082 * FROM RK01 083 * WHERE UNIQ = ? 084 * </og:hidden> 085 * 086 * @og.group 画面部品 087 * 088 * @version 4.0 089 * @author Kazuhiko Hasegawa 090 * @since JDK5.0, 091 */ 092public class HiddenTag extends CommonTagSupport { 093 /** このプログラムのVERSION文字列を設定します。 {@value} */ 094 private static final String VERSION = "6.9.9.3 (2018/09/25)" ; 095 private static final long serialVersionUID = 699320180925L ; 096 097 private String name ; 098 private String value ; // 3.5.5.5 (2004/04/23) value属性を追加 099 private String keys ; 100 private String[] vals ; 101 private String defaultVal ; // 3.8.5.1 (2006/05/08) defaultVal 属性を追加 102 103 private boolean isValue ; // この属性を使うとBODY部は無視されます 104 105 /** 106 * デフォルトコンストラクター 107 * 108 * @og.rev 6.4.2.0 (2016/01/29) PMD refactoring. Each class should declare at least one constructor. 109 */ 110 public HiddenTag() { super(); } // これも、自動的に呼ばれるが、空のメソッドを作成すると警告されるので、明示的にしておきます。 111 112 /** 113 * Taglibの開始タグが見つかったときに処理する doStartTag() を オーバーライドします。 114 * 115 * @og.rev 3.0.0.0 (2002/12/25) BodyHiddenTag 廃止に伴う、機能拡張。 116 * @og.rev 5.2.2.0 (2010/11/01) caseKey 、caseVal 属性対応 117 * 118 * @return 後続処理の指示 119 */ 120 @Override 121 public int doStartTag() { 122 // 5.2.2.0 (2010/11/01) caseKey 、caseVal 属性対応 123 // 6.4.1.1 (2016/01/16) PMD refactoring. A method should have only one exit point, and that should be the last statement in the method 124 return useTag() && !isValue 125 ? EVAL_BODY_BUFFERED // Body を評価する。( extends BodyTagSupport 時) 126 : SKIP_BODY ; // Body を評価しない 127 } 128 129 /** 130 * Taglibのタグ本体を処理する doAfterBody() を オーバーライドします。 131 * 132 * @og.rev 3.0.0.0 (2002/12/25) BodyHiddenTag 廃止に伴う、機能拡張。 133 * @og.rev 3.1.1.0 (2003/03/28) ボディの内容を取得する処理を、CommonTagSupport で行う。 134 * @og.rev 3.5.5.5 (2004/04/23) value属性を追加 135 * 136 * @return 後続処理の指示(SKIP_BODY) 137 */ 138 @Override 139 public int doAfterBody() { 140 final String val = getBodyString(); 141 142 if( val != null && val.length() > 0 ) { 143 value = StringUtil.replace( val,CR," " ); 144 } 145 146 return SKIP_BODY ; 147 } 148 149 /** 150 * Taglibの終了タグが見つかったときに処理する doEndTag() を オーバーライドします。 151 * 152 * @og.rev 3.1.1.2 (2003/04/04) Tomcat4.1 対応。release2() を doEndTag()で呼ぶ。 153 * @og.rev 5.2.2.0 (2010/11/01) caseKey 、caseVal 属性対応 154 * 155 * @return 後続処理の指示 156 */ 157 @Override 158 public int doEndTag() { 159 debugPrint(); // 4.0.0 (2005/02/28) 160 // 5.2.2.0 (2010/11/01) caseKey 、caseVal 属性対応 161 if( useTag() ) { 162 jspPrint( makeTag() ); 163 } 164 return EVAL_PAGE ; 165 } 166 167 /** 168 * タグリブオブジェクトをリリースします。 169 * キャッシュされて再利用されるので、フィールドの初期設定を行います。 170 * 171 * @og.rev 3.0.0.0 (2002/12/25) BodyHiddenTag 廃止に伴う、機能拡張。 172 * @og.rev 3.0.1.0 (2003/03/03) names属性とvals属性を追加 173 * @og.rev 3.1.1.2 (2003/04/04) Tomcat4.1 対応。release2() を doEndTag()で呼ぶ。 174 * @og.rev 3.5.5.5 (2004/04/23) value属性を追加 175 * @og.rev 3.8.5.1 (2006/05/08) defaultVal 属性を追加 176 * 177 */ 178 @Override 179 protected void release2() { 180 super.release2(); 181 name = null; 182 id = null; // 6.9.9.3 (2018/09/25) 183 value = null; 184 keys = null; 185 vals = null; 186 defaultVal = null; // 3.8.5.1 (2006/05/08) defaultVal 属性を追加 187 isValue = false; 188 } 189 190 /** 191 * 隠しフィールドを作成します。 192 * 193 * hidden( name ,value ) 194 * 195 * <input type="hidden" name="名前" value="隠し文字"> 196 * <input type="hidden" keys="名前1,名前2・・・" vals="値1,値2・・・"> 197 * 198 * @og.rev 3.0.1.0 (2003/03/03) names属性とvals属性を追加 199 * @og.rev 3.5.5.5 (2004/04/23) hidden の出力に、XHTMLTag.hidden を使用します。 200 * @og.rev 3.8.5.1 (2006/05/08) defaultVal 属性を追加 201 * @og.rev 6.3.9.0 (2015/11/06) コンストラクタで初期化されていないフィールドを null チェックなしで利用している(findbugs) 202 * 203 * @return 隠しフィールドタグ文字列 204 * @og.rtnNotNull 205 */ 206 protected String makeTag() { 207 208 checkName() ; 209 210 final String rtn ; 211 if( keys == null || vals == null ) { // 6.3.9.0 (2015/11/06) 212 // 注意:互換性維持の為、defaultVal を使用した場合の設定では null がセット 213 // されないようにしています。使用しない場合は、null のままです。 214 // 3.8.5.1 (2006/05/08) defaultVal 属性を追加 215 if( defaultVal != null ) { 216 value = nval( value,defaultVal ); 217 } 218 rtn = XHTMLTag.hidden( name,value ); 219 } else { 220 final StringBuilder buf = new StringBuilder( BUFFER_MIDDLE ); 221 final String[] nm = StringUtil.csv2Array( keys ); 222 for( int i=0; i<nm.length; i++ ) { 223 final String nn = getRequestParameter( nm[i] ); 224 final String vv = getRequestParameter( vals[i] ); 225 buf.append( XHTMLTag.hidden( nn,vv ) ).append( CR ); 226 } 227 rtn = buf.toString(); 228 } 229 return rtn ; 230 } 231 232 /** 233 * name,value,keys,vals の相関関係をチェックします。 234 * 235 * name,value が、ペアで、keys,valsが、ペアです。 236 * name属性とkeys属性は同時には登録できません。 237 * 238 * @og.rev 4.0.0.0 (2007/06/06) 新規追加 239 */ 240 private void checkName() { 241 if( name != null && keys != null ) { 242 final String errMsg = "name属性とkeys属性は同時には登録できません。: " + CR 243 + "name=[" + name + "] keys=[" + keys + "]"; 244 throw new HybsSystemException( errMsg ); 245 } 246 247 if( name != null && vals != null ) { 248 final String errMsg = "name属性とvals属性が設定されています。: " + CR 249 + "name属性を指定する場合は、value属性を使用してください。" + CR 250 + "name=[" + name + "] vals=[" + StringUtil.array2line( vals,"," ) + "]"; 251 throw new HybsSystemException( errMsg ); 252 } 253 254 if( keys != null && value != null ) { 255 final String errMsg = "keys属性とvalue属性が設定されています。: " + CR 256 + "keys属性を指定する場合は、vals属性を使用してください。" + CR 257 + "keys=[" + keys + "] value=[" + value + "]"; 258 throw new HybsSystemException( errMsg ); 259 } 260 } 261 262 /** 263 * 【TAG】名前を指定します(name属性とkeys属性は同時には登録できません)。 264 * 265 * @og.tag 266 * 名前を指定します。 267 * name属性とkeys属性は同時には登録できません。 268 * ※ id属性は、name が使用されます。 269 * 270 * @og.rev 3.0.1.0 (2003/03/03) names属性とvals属性を追加 271 * @og.rev 3.5.5.5 (2004/04/23) hidden の出力に、XHTMLTag.hidden を使用します。 272 * 273 * @param nm 名前 274 */ 275 public void setName( final String nm ) { 276 name = nval( getRequestParameter( nm ),name ); 277 } 278 279 /** 280 * 【TAG】値を指定します(この属性を使うとBODY部は無視されます)。 281 * 282 * @og.tag 283 * ここで値を設定した場合は、BODY 部の値は使用しません。 284 * value="{@value}" などとリクエスト変数を使用した場合に、その値が 285 * 設定されていないケースでも、この属性を使用したとみなされます。 286 * 287 * @og.rev 3.5.5.5 (2004/04/23) hidden の出力に、XHTMLTag.hidden を使用します。 288 * 289 * @param val 値 290 */ 291 public void setValue( final String val ) { 292 value = nval( getRequestParameter( val ),"" ); 293 isValue = true; 294 } 295 296 /** 297 * 【TAG】名前をCSV形式で複数指定します(name属性とkeys属性は同時には登録できません)。 298 * 299 * @og.tag 300 * 名前をCSV形式で複数指定します。 301 * name属性とkeys属性は同時には登録できません。 302 * 303 * @og.rev 3.0.1.0 (2003/03/03) names属性とvals属性を追加 304 * @og.rev 4.0.0.0 (2007/06/06) names属性をkeys属性に変更 305 * 306 * @param ns 名前(CSV形式) 307 */ 308 public void setKeys( final String ns ) { 309 keys = nval( getRequestParameter( ns ),keys ) ; 310 } 311 312 /** 313 * 【TAG】keys属性に対応する値をCSV形式で複数指定します。 314 * 315 * @og.tag 316 * keys属性に対応する値をCSV形式で複数指定します。 317 * keys属性が設定されている場合のみ、使用されます。 318 * 分解方法は、CSV変数を先に分解してから、getRequestParameter で値を取得します。 319 * こうしないとデータ自身にカンマを持っている場合に分解をミスる為です。 320 * 321 * @og.rev 3.0.1.0 (2003/03/03) names属性とvals属性を追加 322 * @og.rev 3.5.6.2 (2004/07/05) CommonTagSupport#getCSVParameter を使用 323 * 324 * @param val 値(CSV形式) 325 */ 326 public void setVals( final String val ) { 327 vals = getCSVParameter( val ); 328 } 329 330 /** 331 * 【TAG】value属性に値がセットされていないとき使用する、初期値を指定します。 332 * 333 * @og.tag 334 * 注意:互換性維持の為、defaultVal を使用した場合の設定では null がセット 335 * されないようにしています。使用しない場合は、null のままです。 336 * 337 * 8.4.3.0 (2023/03/31) defaultVal の設定値の取り扱い(変更なし) 338 * {@XXXX} は、リクエスト変数 ⇒ valueタグセット値 を確認 339 * 値がなければ、""(空文字列) となる。 340 * 通常の固定値は、そのまま使用される(""(空文字列)も有効 341 * defaultVal属性を使用しない場合は、 342 * null のままで、初期値として使用されません。 343 * 344 * @og.rev 3.8.5.1 (2006/05/08) defaultVal 属性を追加 345 * 346 * @param dv 初期値 347 */ 348 public void setDefaultVal( final String dv ) { 349 defaultVal = nval( getRequestParameter( dv ),"" ); // 特殊 350 } 351 352 /** 353 * 【TAG】formの外で使用する場合に、true にセットします(JavaScriptの変数受け渡し等)。 354 * 355 * @og.tag 356 * この属性は、formの外で使用hiddenタグであることを、JSP上で、明確にするためだけに使用する属性です。 357 * 例えば、JavaScriptに値を渡す場合に、form には入れませんが、hidden を使用することがあります。 358 * ただし、form に入っていないhiddenは、JSPチェックで、警告が出ます。 359 * そのため、JSPチェックで警告が出ないようにするために、この属性に、true をセットします。 360 * この属性は、パラメータ変数は、使用できません。true か、セットしないか、どちらかです。 361 * 362 * @og.rev 6.9.9.3 (2018/09/25) 新規追加 363 * 364 * @param flag JavaScriptの変数受け渡しに使用する場合は、true 365 */ 366 public void setNoForm( final String flag ) { 367 if( !"true".equalsIgnoreCase( flag ) ) { 368 final String errMsg = "noForm 属性は、formの外で使用する場合に、true に設定します。" + CR 369 + "例えば、JavaScriptの変数受け渡しに使う場合などです。" + CR 370 + "true以外の値(パラメータ変数も含めて)は使用できません。" + CR 371 + " noForm=[" + flag + "]" ; 372 throw new HybsSystemException( errMsg ); 373 } 374 } 375 376 /** 377 * このオブジェクトの文字列表現を返します。 378 * 基本的にデバッグ目的に使用します。 379 * 380 * @return このクラスの文字列表現 381 * @og.rtnNotNull 382 */ 383 @Override 384 public String toString() { 385 return ToString.title( this.getClass().getName() ) 386 .println( "VERSION" ,VERSION ) 387 .println( "isValue" ,isValue ) 388 .println( "name" ,name ) 389 .println( "value" ,value ) 390 .println( "keys" ,keys ) 391 .println( "vals" ,vals ) 392 .println( "Other..." ,getAttributes().getAttribute() ) 393 .fixForm().toString() ; 394 } 395}