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 * <input:hidden name="PN" value="{@PN}" /> 066 * 067 * ・次画面で使用するPLSQLと引数を渡します。 068 * <input:hidden name="name" value="UNIQ,LKIS,KBLOYA,KBLKO,KBNGK,HJO,KBLKNM" /> 069 * <input: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 } 228 rtn = buf.toString(); 229 } 230 return rtn ; 231 } 232 233 /** 234 * name,value,keys,vals の相関関係をチェックします。 235 * 236 * name,value が、ペアで、keys,valsが、ペアです。 237 * name属性とkeys属性は同時には登録できません。 238 * 239 * @og.rev 4.0.0.0 (2007/06/06) 新規追加 240 */ 241 private void checkName() { 242 if( name != null && keys != null ) { 243 final String errMsg = "name属性とkeys属性は同時には登録できません。: " + CR 244 + "name=[" + name + "] keys=[" + keys + "]"; 245 throw new HybsSystemException( errMsg ); 246 } 247 248 if( name != null && vals != null ) { 249 final String errMsg = "name属性とvals属性が設定されています。: " + CR 250 + "name属性を指定する場合は、value属性を使用してください。" + CR 251 + "name=[" + name + "] vals=[" + StringUtil.array2line( vals,"," ) + "]"; 252 throw new HybsSystemException( errMsg ); 253 } 254 255 if( keys != null && value != null ) { 256 final String errMsg = "keys属性とvalue属性が設定されています。: " + CR 257 + "keys属性を指定する場合は、vals属性を使用してください。" + CR 258 + "keys=[" + keys + "] value=[" + value + "]"; 259 throw new HybsSystemException( errMsg ); 260 } 261 } 262 263 /** 264 * 【TAG】名前を指定します(name属性とkeys属性は同時には登録できません)。 265 * 266 * @og.tag 267 * 名前を指定します。 268 * name属性とkeys属性は同時には登録できません。 269 * ※ id属性は、name が使用されます。 270 * 271 * @og.rev 3.0.1.0 (2003/03/03) names属性とvals属性を追加 272 * @og.rev 3.5.5.5 (2004/04/23) hidden の出力に、XHTMLTag.hidden を使用します。 273 * 274 * @param nm 名前 275 */ 276 public void setName( final String nm ) { 277 name = nval( getRequestParameter( nm ),name ); 278 } 279 280 /** 281 * 【TAG】値を指定します(この属性を使うとBODY部は無視されます)。 282 * 283 * @og.tag 284 * ここで値を設定した場合は、BODY 部の値は使用しません。 285 * value="{@value}" などとリクエスト変数を使用した場合に、その値が 286 * 設定されていないケースでも、この属性を使用したとみなされます。 287 * 288 * @og.rev 3.5.5.5 (2004/04/23) hidden の出力に、XHTMLTag.hidden を使用します。 289 * 290 * @param val 値 291 */ 292 public void setValue( final String val ) { 293 value = nval( getRequestParameter( val ),"" ); 294 isValue = true; 295 } 296 297 /** 298 * 【TAG】名前をCSV形式で複数指定します(name属性とkeys属性は同時には登録できません)。 299 * 300 * @og.tag 301 * 名前をCSV形式で複数指定します。 302 * name属性とkeys属性は同時には登録できません。 303 * 304 * @og.rev 3.0.1.0 (2003/03/03) names属性とvals属性を追加 305 * @og.rev 4.0.0.0 (2007/06/06) names属性をkeys属性に変更 306 * 307 * @param ns 名前(CSV形式) 308 */ 309 public void setKeys( final String ns ) { 310 keys = nval( getRequestParameter( ns ),keys ) ; 311 } 312 313 /** 314 * 【TAG】keys属性に対応する値をCSV形式で複数指定します。 315 * 316 * @og.tag 317 * keys属性に対応する値をCSV形式で複数指定します。 318 * keys属性が設定されている場合のみ、使用されます。 319 * 分解方法は、CSV変数を先に分解してから、getRequestParameter で値を取得します。 320 * こうしないとデータ自身にカンマを持っている場合に分解をミスる為です。 321 * 322 * @og.rev 3.0.1.0 (2003/03/03) names属性とvals属性を追加 323 * @og.rev 3.5.6.2 (2004/07/05) CommonTagSupport#getCSVParameter を使用 324 * 325 * @param val 値(CSV形式) 326 */ 327 public void setVals( final String val ) { 328 vals = getCSVParameter( val ); 329 } 330 331 /** 332 * 【TAG】value属性に値がセットされていないとき使用する、初期値を指定します。 333 * 334 * @og.tag 335 * 注意:互換性維持の為、defaultVal を使用した場合の設定では null がセット 336 * されないようにしています。使用しない場合は、null のままです。 337 * 338 * @og.rev 3.8.5.1 (2006/05/08) defaultVal 属性を追加 339 * 340 * @param dv 初期値 341 */ 342 public void setDefaultVal( final String dv ) { 343 defaultVal = nval( getRequestParameter( dv ),"" ); // 特殊 344 } 345 346 /** 347 * 【TAG】formの外で使用する場合に、true にセットします(JavaScriptの変数受け渡し等)。 348 * 349 * @og.tag 350 * この属性は、formの外で使用hiddenタグであることを、JSP上で、明確にするためだけに使用する属性です。 351 * 例えば、JavaScriptに値を渡す場合に、form には入れませんが、hidden を使用することがあります。 352 * ただし、form に入っていないhiddenは、JSPチェックで、警告が出ます。 353 * そのため、JSPチェックで警告が出ないようにするために、この属性に、true をセットします。 354 * この属性は、パラメータ変数は、使用できません。true か、セットしないか、どちらかです。 355 * 356 * @og.rev 6.9.9.3 (2018/09/25) 新規追加 357 * 358 * @param flag JavaScriptの変数受け渡しに使用する場合は、true 359 */ 360 public void setNoForm( final String flag ) { 361 if( !"true".equalsIgnoreCase( flag ) ) { 362 final String errMsg = "noForm 属性は、formの外で使用する場合に、true に設定します。" + CR 363 + "例えば、JavaScriptの変数受け渡しに使う場合などです。" + CR 364 + "true以外の値(パラメータ変数も含めて)は使用できません。" + CR 365 + " noForm=[" + flag + "]" ; 366 throw new HybsSystemException( errMsg ); 367 } 368 } 369 370 /** 371 * このオブジェクトの文字列表現を返します。 372 * 基本的にデバッグ目的に使用します。 373 * 374 * @return このクラスの文字列表現 375 * @og.rtnNotNull 376 */ 377 @Override 378 public String toString() { 379 return ToString.title( this.getClass().getName() ) 380 .println( "VERSION" ,VERSION ) 381 .println( "isValue" ,isValue ) 382 .println( "name" ,name ) 383 .println( "value" ,value ) 384 .println( "keys" ,keys ) 385 .println( "vals" ,vals ) 386 .println( "Other..." ,getAttributes().getAttribute() ) 387 .fixForm().toString() ; 388 } 389}