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