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( useTag() && !isValue ) { 110 return EVAL_BODY_BUFFERED ; // Body を評価する。( extends BodyTagSupport 時) 111 } 112 return SKIP_BODY ; // Body を評価しない 113 } 114 115 /** 116 * Taglibのタグ本体を処理する doAfterBody() を オーバーライドします。 117 * 118 * @og.rev 3.0.0.0 (2002/12/25) BodyHiddenTag 廃止に伴う、機能拡張。 119 * @og.rev 3.1.1.0 (2003/03/28) ボディの内容を取得する処理を、CommonTagSupport で行う。 120 * @og.rev 3.5.5.5 (2004/04/23) value属性を追加 121 * 122 * @return 後続処理の指示(SKIP_BODY) 123 */ 124 @Override 125 public int doAfterBody() { 126 String val = getBodyString(); 127 128 if( val != null && val.length() > 0 ) { 129 value = StringUtil.replace( val,HybsSystem.CR," " ); 130 } 131 132 return SKIP_BODY ; 133 } 134 135 /** 136 * Taglibの終了タグが見つかったときに処理する doEndTag() を オーバーライドします。 137 * 138 * @og.rev 3.1.1.2 (2003/04/04) Tomcat4.1 対応。release2() を doEndTag()で呼ぶ。 139 * @og.rev 5.2.2.0 (2010/11/01) caseKey 、caseVal 属性対応 140 * 141 * @return 後続処理の指示 142 */ 143 @Override 144 public int doEndTag() { 145 debugPrint(); // 4.0.0 (2005/02/28) 146 // 5.2.2.0 (2010/11/01) caseKey 、caseVal 属性対応 147 if( useTag() ) { 148 jspPrint( makeTag() ); 149 } 150 return EVAL_PAGE ; 151 } 152 153 /** 154 * タグリブオブジェクトをリリースします。 155 * キャッシュされて再利用されるので、フィールドの初期設定を行います。 156 * 157 * @og.rev 3.0.0.0 (2002/12/25) BodyHiddenTag 廃止に伴う、機能拡張。 158 * @og.rev 3.0.1.0 (2003/03/03) names属性とvals属性を追加 159 * @og.rev 3.1.1.2 (2003/04/04) Tomcat4.1 対応。release2() を doEndTag()で呼ぶ。 160 * @og.rev 3.5.5.5 (2004/04/23) value属性を追加 161 * @og.rev 3.8.5.1 (2006/05/08) defaultVal 属性を追加 162 * 163 */ 164 @Override 165 protected void release2() { 166 super.release2(); 167 isValue = false; 168 name = null; 169 value = null; 170 keys = null; 171 vals = null; 172 defaultVal = null; // 3.8.5.1 (2006/05/08) defaultVal 属性を追加 173 } 174 175 /** 176 * 隠しフィールドを作成します。 177 * 178 * hidden( name ,value ) 179 * 180 * <input type="hidden" name="名前" value="隠し文字"> 181 * <input type="hidden" keys="名前1,名前2・・・" vals="値1,値2・・・"> 182 * 183 * @og.rev 3.0.1.0 (2003/03/03) names属性とvals属性を追加 184 * @og.rev 3.5.5.5 (2004/04/23) hidden の出力に、XHTMLTag.hidden を使用します。 185 * @og.rev 3.8.5.1 (2006/05/08) defaultVal 属性を追加 186 * 187 * @return 隠しフィールドタグ文字列 188 */ 189 protected String makeTag() { 190 191 checkName() ; 192 193 final String rtn ; 194 if( keys == null ) { 195 // 注意:互換性維持の為、defaultVal を使用した場合の設定では null がセット 196 // されないようにしています。使用しない場合は、null のままです。 197 // 3.8.5.1 (2006/05/08) defaultVal 属性を追加 198 if( defaultVal != null ) { 199 value = nval( value,defaultVal ); 200 } 201 rtn = XHTMLTag.hidden( name,value ); 202 } else { 203 StringBuilder buf = new StringBuilder( HybsSystem.BUFFER_MIDDLE ); 204 String[] nm = StringUtil.csv2Array( keys ); 205 for( int i=0; i<nm.length; i++ ) { 206 String nn = getRequestParameter( nm[i] ); 207 String vv = getRequestParameter( vals[i] ); 208 buf.append( XHTMLTag.hidden( nn,vv ) ).append( HybsSystem.CR ); 209 210 } 211 rtn = buf.toString(); 212 } 213 return rtn ; 214 } 215 216 /** 217 * name,value,keys,vals の相関関係をチェックします。 218 * 219 * name,value が、ペアで、keys,valsが、ペアです。 220 * name属性とkeys属性は同時には登録できません。 221 * 222 * @og.rev 4.0.0.0 (2007/06/06) 新規追加 223 */ 224 private void checkName() { 225 if( name != null && keys != null ) { 226 String errMsg = "name属性とkeys属性は同時には登録できません。: " + HybsSystem.CR 227 + "name=[" + name + "] keys=[" + keys + "]"; 228 throw new HybsSystemException( errMsg ); 229 } 230 231 if( name != null && vals != null ) { 232 String errMsg = "name属性とvals属性が設定されています。: " + HybsSystem.CR 233 + "name属性を指定する場合は、value属性を使用してください。" + HybsSystem.CR 234 + "name=[" + name + "] vals=[" + StringUtil.array2line( vals,"," ) + "]"; 235 throw new HybsSystemException( errMsg ); 236 } 237 238 if( keys != null && value != null ) { 239 String errMsg = "keys属性とvalue属性が設定されています。: " + HybsSystem.CR 240 + "keys属性を指定する場合は、vals属性を使用してください。" + HybsSystem.CR 241 + "keys=[" + keys + "] value=[" + value + "]"; 242 throw new HybsSystemException( errMsg ); 243 } 244 } 245 246 /** 247 * 【TAG】名前を指定します(name属性とkeys属性は同時には登録できません)。 248 * 249 * @og.tag 250 * 名前を指定します。 251 * name属性とkeys属性は同時には登録できません。 252 * 253 * @og.rev 3.0.1.0 (2003/03/03) names属性とvals属性を追加 254 * @og.rev 3.5.5.5 (2004/04/23) hidden の出力に、XHTMLTag.hidden を使用します。 255 * 256 * @param nm 名前 257 */ 258 public void setName( final String nm ) { 259 name = nval( getRequestParameter( nm ),name ); 260 } 261 262 /** 263 * 【TAG】値を指定します(この属性を使うとBODY部は無視されます)。 264 * 265 * @og.tag 266 * ここで値を設定した場合は、BODY 部の値は使用しません。 267 * value="{@value}" などとリクエスト変数を使用した場合に、その値が 268 * 設定されていないケースでも、この属性を使用したとみなされます。 269 * 270 * @og.rev 3.5.5.5 (2004/04/23) hidden の出力に、XHTMLTag.hidden を使用します。 271 * 272 * @param val 値 273 */ 274 public void setValue( final String val ) { 275 value = nval( getRequestParameter( val ),"" ); 276 isValue = true; 277 } 278 279 /** 280 * 【TAG】名前をCSV形式で複数指定します(name属性とkeys属性は同時には登録できません)。 281 * 282 * @og.tag 283 * 名前をCSV形式で複数指定します。 284 * name属性とkeys属性は同時には登録できません。 285 * 286 * @og.rev 3.0.1.0 (2003/03/03) names属性とvals属性を追加 287 * @og.rev 4.0.0.0 (2007/06/06) names属性をkeys属性に変更 288 * 289 * @param ns 名前(CSV形式) 290 */ 291 public void setKeys( final String ns ) { 292 keys = nval( getRequestParameter( ns ),keys ) ; 293 } 294 295 /** 296 * 【TAG】keys属性に対応する値をCSV形式で複数指定します。 297 * 298 * @og.tag 299 * keys属性に対応する値をCSV形式で複数指定します。 300 * keys属性が設定されている場合のみ、使用されます。 301 * 分解方法は、CSV変数を先に分解してから、getRequestParameter で値を取得します。 302 * こうしないとデータ自身にカンマを持っている場合に分解をミスる為です。 303 * 304 * @og.rev 3.0.1.0 (2003/03/03) names属性とvals属性を追加 305 * @og.rev 3.5.6.2 (2004/07/05) CommonTagSupport#getCSVParameter を使用 306 * 307 * @param val 値(CSV形式) 308 */ 309 public void setVals( final String val ) { 310 vals = getCSVParameter( val ); 311 } 312 313 /** 314 * 【TAG】value属性に値がセットされていないときに、初期値をセットします。 315 * 316 * @og.tag 317 * 注意:互換性維持の為、defaultVal を使用した場合の設定では null がセット 318 * されないようにしています。使用しない場合は、null のままです。 319 * 320 * @og.rev 3.8.5.1 (2006/05/08) defaultVal 属性を追加 321 * 322 * @param dv 初期値 323 */ 324 public void setDefaultVal( final String dv ) { 325 defaultVal = nval( getRequestParameter( dv ),"" ); // 特殊 326 } 327 328 /** 329 * このオブジェクトの文字列表現を返します。 330 * 基本的にデバッグ目的に使用します。 331 * 332 * @return このクラスの文字列表現 333 */ 334 @Override 335 public String toString() { 336 return org.opengion.fukurou.util.ToString.title( this.getClass().getName() ) 337 .println( "VERSION" ,VERSION ) 338 .println( "isValue" ,isValue ) 339 .println( "name" ,name ) 340 .println( "value" ,value ) 341 .println( "keys" ,keys ) 342 .println( "vals" ,vals ) 343 .println( "Other..." ,getAttributes().getAttribute() ) 344 .fixForm().toString() ; 345 } 346}