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.hayabusa.resource.GUIInfo; 021import org.opengion.hayabusa.resource.LabelInterface; 022import org.opengion.fukurou.system.OgBuilder ; // 6.4.4.1 (2016/03/18) 023import org.opengion.fukurou.util.XHTMLTag; 024import org.opengion.fukurou.util.ToString; // 6.1.1.0 (2015/01/17) 025import org.opengion.fukurou.util.StringUtil ; 026import org.opengion.fukurou.util.ArraySet; // 6.4.3.4 (2016/03/11) 027 028import static org.opengion.fukurou.util.StringUtil.nval ; 029 030import java.util.Locale ; 031import java.util.Set; // 6.4.3.4 (2016/03/11) 032 033/** 034 * サブミットボタンを表示するHTML拡張タグです(forward.jsp の commonForward タグと同時に使用します)。 035 * 036 * このタグは、value に指定された値+".jsp" の画面へサブミットします。 037 * その際、command に設定された値を 送信します。 038 * 従来は、value に、copy/modify/delete など、処理するJSPを個別に設定していましたので、 039 * command と lbl が未設定時には、value の値を使用していました。(下位互換性のため残しています) 040 * Ver5 になって、update.jsp ですべての処理を行う方向で開発するに当たり、 041 * command と lbl を記述する必要がでてきました。 042 * そこで、現在最新版では、action 属性を用意し、command を記述するだけで良くなりました。 043 * 044 * [action属性] [初期設定されるパラメータ郡] 045 * INSERT value="update" command="INSERT" lbl="INSERT" accesskey="I" 046 * COPY value="update" command="COPY" lbl="COPY" accesskey="C" 047 * MODIFY value="update" command="MODIFY" lbl="MODIFY" accesskey="M" 048 * DELETE value="update" command="DELETE" lbl="DELETE" accesskey="Z" 049 * VIEW value="update" command="VIEW" lbl="VIEW" accesskey="V" 6.3.9.1 (2015/11/27) 追加 050 * ENTRY value="entry" command="ENTRY" lbl="ENTRY" accesskey="E" 051 * RESET value="reset" command="RESET" lbl="ENTRY" accesskey="R" 052 * 053 * 7.4.2.1 (2021/05/21) 054 * システム定数 USE_ACCESSKEY を false に設定すると、accesskey は使用されません。 055 * 056 * columnWritable , noWritable の属性追加(5.2.2.0 (2010/11/01)) 057 * これは、各コマンドごとに、次ページの view のカラム属性の設定に利用する属性です。 058 * Ver4 では、keys,vals の一般引数として設定していましたが、ここでは、専用属性として 059 * 用意しています。 060 * 061 * @og.formSample 062 * ●形式:<og:submit value="…" lbl="…" /> 063 * ●body:なし 064 * 065 * ●Tag定義: 066 * <og:submit 067 * action 【TAG】アクション(INSERT,COPY,MODIFY,DELETE,VIEW,ENTRY,RESET)を指定します 068 * value 【TAG】forward したいJSPファイル名を記述します(例:insert,copy,modify,delete など) 069 * command 【TAG】処理コマンドを登録します(初期値:大文字の value 属性値[INSERT,COPY,MODIFY,DELETE など]) 070 * gamenId 【TAG】gamenId 属性を登録します 071 * lbl 【TAG】ラベルリソースのラベルIDを指定します 072 * target 【TAG】サブミット先の文書を表示させるフレーム、またはウィンドウの名前を指定します 073 * keys 【TAG】ボタン専用のリクエストキーをCSV形式で複数指定します 074 * vals 【TAG】ボタン専用のリクエスト値をCSV形式で複数指定します 075 * roles 【TAG】ロールをセットします 076 * dbkeys 【TAG】commonForward の dbkeys にカラム指定を行います 077 * optionAttributes 【TAG】JavaScript などの HTML基本タグ以外の属性を、そのままタグとして使用します 078 * columnWritable 【TAG】書き込み可能カラム名を、CSV形式で与えます 079 * noWritable 【TAG】書き込み不可カラム名を、CSV形式で与えます 080 * caseKey 【TAG】このタグ自体を利用するかどうかの条件キーを指定します(初期値:null) 081 * caseVal 【TAG】このタグ自体を利用するかどうかの条件値を指定します(初期値:null) 082 * caseNN 【TAG】指定の値が、null/ゼロ文字列 でない場合(Not Null=NN)は、このタグは使用されます(初期値:判定しない) 083 * caseNull 【TAG】指定の値が、null/ゼロ文字列 の場合は、このタグは使用されます(初期値:判定しない) 084 * caseIf 【TAG】指定の値が、true/TRUE文字列の場合は、このタグは使用されます(初期値:判定しない) 085 * id 【HTML】要素に対して固有の名前(id)をつける場合に設定します 086 * lang 【HTML】要素の内容と他の属性値の言語(lang,xml:lang)を指定します 087 * dir 【HTML】文字表記の方向(dir)を指定します 088 * title 【HTML】要素に対する補足的情報(title)を設定します 089 * style 【HTML】この要素に対して適用させるスタイルシート(style)を設定します 090 * readonly 【TAG】その部品に対して変更が出来ないように(readonly)指定します(サーバーに送信される) 091 * disabled 【TAG】その部品に対して、選択や変更が出来ないように(disabled)指定します(サーバーに送信されない) 092 * tabindex 【HTML】タブの移動順(tabindex)を指定します(0 ~ 32767) 093 * accesskey 【HTML】アクセスキー(alt+キーで直接指定)を割り当てます 094 * clazz 【HTML】要素に対して class 属性を設定します 095 * language 【TAG】タグ内部で使用する言語コード[ja/en/zh/…]を指定します 096 * onClick 【HTML】JavaScriptのイベント onClick を設定します(例:onClick="renew('query.jsp','QUERY');") 097 * onBlur 【HTML】JavaScriptのイベント onBlur を設定します(例:onBlur="this.value=value.toUpperCase();") 098 * onFocus 【HTML】JavaScriptのイベント onFocus を設定します 099 * ondblClick 【HTML】JavaScriptのイベント ondblClick を設定します 100 * onMouseDown 【HTML】JavaScriptのイベント onMouseDown を設定します 101 * onMouseUp 【HTML】JavaScriptのイベント onMouseUp を設定します 102 * onMouseMove 【HTML】JavaScriptのイベント onMouseMove を設定します 103 * onMouseOut 【HTML】JavaScriptのイベント onMouseOut を設定します 104 * onMouseOver 【HTML】JavaScriptのイベント onMouseOver を設定します 105 * autofocus 【HTML5】指定した入力欄にカーソルが当たって自動的にフォーカスされます。 106 * img 【TAG】画像ボタンを作る場合の、画像ファイルを指定します 107 * debug 【TAG】デバッグ情報を出力するかどうか[true/false]を指定します(初期値:false) 108 * /> 109 * 110 * ●使用例 111 * Ver5 推奨ケース:指定の action 属性に設定された値に応じた、value , command , lbl , accesskey を初期化します。 112 * (5.2.2.0 (2010/11/01)以降) 113 * <og:writeCheck> 114 * <og:submit action="COPY" noWritable="FGJ,UNIQ" /> 115 * <og:submit action="MODIFY" noWritable="CLM,FGJ,UNIQ" /> 116 * <og:submit action="DELETE" columnWritable="null" /> 117 * <og:submit gamenId="GF9110" value="index" dbkeys="SYSTEM_ID,LANG,CLM" command="NEW" lbl="GF9100" target="CONTENTS" /> 118 * <br /> 119 * </og:writeCheck> 120 * 121 * Ver4 一般的なケース:value は共通になったため、command と lbl の設定が必要(下位互換性のための設定) 122 * <og:writeCheck> 123 * <og:submit value="update" command="COPY" lbl="COPY" accesskey="C" /> 124 * <og:submit value="update" command="MODIFY" lbl="MODIFY" accesskey="M" /> 125 * <og:submit value="update" command="DELETE" lbl="DELETE" accesskey="Z" /> 126 * <og:submit gamenId="GF9110" value="index" dbkeys="SYSTEM_ID,LANG,CLM" command="NEW" lbl="GF9100" target="CONTENTS" /> 127 * <br /> 128 * </og:writeCheck> 129 * 130 * 従来のケース:value に設定された値JSPに対してサブミットされます。(下位互換性のための設定) 131 * <og:writeCheck> 132 * <og:submit value="copy" lbl="MSG0035" accesskey="C" /> 133 * <og:submit value="modify" lbl="MSG0036" accesskey="M" /> 134 * <og:submit value="delete" lbl="MSG0037" accesskey="Z" /> 135 * <og:submit gamenId="GF9110" value="index" dbkeys="SYSTEM_ID,LANG,CLM" command="NEW" lbl="GF9100" target="CONTENTS" /> 136 * <br /> 137 * </og:writeCheck> 138 * 139 * @og.rev 3.1.1.0 (2003/03/28) 新規作成 140 * @og.group 画面制御 141 * 142 * @version 4.0 143 * @author Kazuhiko Hasegawa 144 * @since JDK5.0, 145 */ 146public class SubmitTag extends HTMLTagSupport { 147 /** このプログラムのVERSION文字列を設定します。 {@value} */ 148 private static final String VERSION = "7.4.2.1 (2021/05/21)" ; 149 private static final long serialVersionUID = 742120210521L ; 150 151 // 5.2.2.0 (2010/11/01) 新規追加 152 /** command 引数に渡す事の出来る コマンド 新規 {@value} */ 153 public static final String ACT_INSERT = "INSERT" ; 154 /** command 引数に渡す事の出来る コマンド 複写 {@value} */ 155 public static final String ACT_COPY = "COPY" ; 156 /** command 引数に渡す事の出来る コマンド 変更 {@value} */ 157 public static final String ACT_MODIFY = "MODIFY" ; 158 /** command 引数に渡す事の出来る コマンド 削除 {@value} */ 159 public static final String ACT_DELETE = "DELETE" ; 160 /** 6.3.9.1 (2015/11/27) command 引数に渡す事の出来る コマンド 表示 {@value} */ 161 public static final String ACT_VIEW = "VIEW" ; 162 /** command 引数に渡す事の出来る コマンド エントリー {@value} */ 163 public static final String ACT_ENTRY = "ENTRY" ; 164 /** command 引数に渡す事の出来る コマンド リセット {@value} */ 165 public static final String ACT_RESET = "RESET" ; 166 167 // 6.4.3.4 (2016/03/11) String配列 から、Setに置き換えます。 168 private static final Set<String> ACTION_SET = new ArraySet<>( ACT_INSERT , ACT_COPY , ACT_MODIFY , ACT_DELETE , ACT_VIEW , ACT_ENTRY , ACT_RESET ); 169 170 // 7.4.2.1 (2021/05/21) accesskey の設定の有効(true)/無効(false)を設定します(要再起動) 171 private static final boolean useAccessKey = HybsSystem.sysBool( "USE_ACCESSKEY" ); 172 173 /** 174 * enum 定義 175 * 176 * @og.rev 5.2.2.0 (2010/11/01) 新規追加 177 */ 178 private enum ENUM_ACTION { 179 // action value command lbl accesskey 180 INSERT( "update" , "INSERT" , "INSERT" , "I" ), 181 COPY ( "update" , "COPY" , "COPY" , "C" ), 182 MODIFY( "update" , "MODIFY" , "MODIFY" , "M" ), 183 DELETE( "update" , "DELETE" , "DELETE" , "Z" ), 184 VIEW ( "update" , "VIEW" , "VIEW" , "V" ), // 6.3.9.1 (2015/11/27) 185 ENTRY ( "entry" , "ENTRY" , "ENTRY" , "E" ), 186 RESET ( "reset" , "RESET" , "RESET" , "R" ) ; 187 188 private final String defVal ; 189 private final String defCmd ; 190 private final String defLbl ; 191 private final String defKey ; 192 193 /** 194 * enum のコンストラクタ 195 * 196 * @param val デフォルトの値(飛び先) 197 * @param cmd デフォルトのコマンド 198 * @param lbl デフォルトのラベル 199 * @param key デフォルトのaccesskey 200 */ 201 ENUM_ACTION( final String val , final String cmd , final String lbl , final String key ) { 202 defVal = val; 203 defCmd = cmd; 204 defLbl = lbl; 205 defKey = key; 206 } 207 208 /** 209 * デフォルトの値(飛び先) を返します。 210 * 211 * @return デフォルトの値(飛び先) 212 */ 213 public String getDefVal() { return defVal; } 214 215 /** 216 * デフォルトのコマンド を返します。 217 * 218 * @return デフォルトのコマンド 219 */ 220 public String getDefCmd() { return defCmd; } 221 222 /** 223 * デフォルトのラベル を返します。 224 * 225 * @return デフォルトのラベル 226 */ 227 public String getDefLbl() { return defLbl; } 228 229 /** 230 * デフォルトのaccesskey を返します。 231 * 232 * @return デフォルトのaccesskey 233 */ 234 public String getDefKey() { return defKey; } 235 } 236 237 private static final String TYPE = "submit" ; 238 private static final String NAME = "command" ; 239 private static final String MARGIN = "<span style=\"width: 3px;\" ></span>" ; 240 241 private static final String IMG_PRE = "background: url("; // 5.5.0.0 (2012/03/01) 242 private static final String IMG_SUF = ") center center no-repeat;"; // 6.2.4.2 (2015/05/29) 243 244 private String action ; // 5.2.2.0 (2010/11/01) 245 private String command ; 246 private String value ; 247 private String gamenId ; 248 private String target ; // 3.5.5.2 (2004/04/02) 249 private String dbkeys ; // 4.0.0 (2007/05/23) 250 251 private String columnWritable ; // 5.2.2.0 (2010/11/01) 252 private String noWritable ; // 5.2.2.0 (2010/11/01) 253 254 private String bgImg ; // 5.5.0.0 (2012/03/01) 255 256 private String[] keys ; // 3.5.5.5 (2004/04/23) 257 private String[] vals ; // 3.5.5.5 (2004/04/23) 258 259 /** 260 * デフォルトコンストラクター 261 * 262 * @og.rev 6.4.2.0 (2016/01/29) PMD refactoring. Each class should declare at least one constructor. 263 */ 264 public SubmitTag() { super(); } // これも、自動的に呼ばれるが、空のメソッドを作成すると警告されるので、明示的にしておきます。 265 266 /** 267 * Taglibの開始タグが見つかったときに処理する doStartTag() を オーバーライドします。 268 * 269 * @og.rev 5.2.2.0 (2010/11/01) 新規追加 270 * @og.rev 7.4.2.1 (2021/05/21) accesskey の設定の有効(true)/無効(false)を設定 271 * 272 * @return 後続処理の指示( SKIP_BODY ) 273 */ 274 @Override 275 public int doStartTag() { 276 // 5.2.2.0 (2010/11/01) caseKey 、caseVal 属性対応 277 if( useTag() ) { 278 // 5.1.8.0 (2010/07/01) 同時設定不可(columnWritable,noWritable) チェック 279 if( columnWritable != null && noWritable != null ) { 280 final String errMsg = "columnWritable と noWritable は同時に指定できません。" 281 + "columnWritable = [" + columnWritable 282 + "] , noWritable = [" + noWritable 283 + "]"; 284 throw new HybsSystemException( errMsg ); 285 } 286 287 // 5.2.2.0 (2010/11/01) action 属性による初期値の設定 288 if( action != null ) { 289 final ENUM_ACTION eact = ENUM_ACTION.valueOf( action ); 290 if( value == null ) { value = eact.getDefVal(); } 291 if( command == null ) { command = eact.getDefCmd(); } 292 if( getMsglbl() == null ) { setLbl( eact.getDefLbl() ); } 293// if( get( "accesskey" ) == null ) { set( "accesskey",eact.getDefKey() ); } 294 if( useAccessKey && get( "accesskey" ) == null ) { set( "accesskey",eact.getDefKey() ); } 295 } 296 } 297 return SKIP_BODY ; 298 } 299 300 /** 301 * タグリブオブジェクトをリリースします。 302 * キャッシュされて再利用されるので、フィールドの初期設定を行います。 303 * 304 * @og.rev 3.1.1.2 (2003/04/04) Tomcat4.1 対応。release2() を doEndTag()で呼ぶ。 305 * @og.rev 3.5.5.2 (2004/04/02) target 属性の追加 306 * @og.rev 3.5.5.5 (2004/04/23) keys,vals 属性の追加 307 * @og.rev 5.2.2.0 (2010/11/01) action,columnWritable,noWritable 属性の追加 308 * @og.rev 5.5.0.0 (2012/03/01) bgImg追加 309 */ 310 @Override 311 protected void release2() { 312 super.release2(); 313 action = null; // 5.2.2.0 (2010/11/01) 314 command = null; 315 value = null; 316 gamenId = null; 317 target = null; // 3.5.5.2 (2004/04/02) 318 keys = null; // 3.5.5.5 (2004/04/23) 319 vals = null; // 3.5.5.5 (2004/04/23) 320 dbkeys = null; // 4.0.0 (2007/05/23) 321 columnWritable = null; // 5.2.2.0 (2010/11/01) 322 noWritable = null; // 5.2.2.0 (2010/11/01) 323 bgImg = null; // 5.5.0.0 (2012/03/01) 324 } 325 326 /** 327 * サブミットボタンを作成します。 328 * 329 * @og.rev 3.3.1.1 (2003/07/03) ForwardManager クラスの廃止。飛び先のキャッシュを廃止します。 330 * @og.rev 3.5.5.2 (2004/04/02) target 属性の追加 331 * @og.rev 3.5.5.9 (2004/06/07) target 属性を、set ではなく add で追加。 332 * @og.rev 3.5.5.9 (2004/06/07) target 属性を、set ではなく add で追加。 333 * @og.rev 4.0.0.0 (2005/11/30) title 属性が未設定時の処理追加 334 * @og.rev 5.5.0.0 (2012/03/01) bgImg対応 335 * @og.rev 5.6.0.3 (2012/01/24) accesskey に ゼロ文字列を指定した場合、カッコ()だけが残ってしまう。 336 * @og.rev 6.2.4.2 (2015/05/29) スタイル属性追加時は、一番初めにする。 337 * @og.rev 6.4.4.1 (2016/03/18) StringBuilderの代わりに、OgBuilderを使用する。 338 * @og.rev 7.4.2.1 (2021/05/21) accesskey の設定の有効(true)/無効(false)を設定 339 * 340 * @return サブミットボタンタグ 341 * @og.rtnNotNull 342 */ 343 @Override 344 protected String makeTag() { 345 346 if( value == null ) { 347 final String errMsg = "value に null がセットされています。"; 348 throw new HybsSystemException( errMsg ); 349 } 350 351 String lbl = nval( getMsglbl(), value.toUpperCase( Locale.JAPAN ) ); 352 if( useAccessKey ) { // 7.4.2.1 (2021/05/21) 353 final String accesskey = get( "accesskey" ); 354 if( accesskey != null && ! accesskey.isEmpty() ) { // 5.6.0.3 (2012/01/24) 355 lbl = lbl + "(" + accesskey + ")" ; 356 } 357 } 358 359 // キャッシュエントリ 360 command = nval( command,value.toUpperCase(Locale.JAPAN) ); 361 final String valueLink = getValueLink( gamenId , value ); 362 if( valueLink == null ) { return ""; } // アクセス不可時は null 363 364 set( "type",TYPE ); 365 set( "name",NAME ); 366 set( "value",lbl ); 367 368 // 3.5.5.2 (2004/04/02) target 属性の追加 369 if( target != null ) { 370 add( "onClick","this.form.target='" + target + "'",";" ); // 3.5.5.9 (2004/06/07) 371 } 372 373 // 4.0.0 (2005/11/30) title 属性が未設定時の処理追加 374 if( get( "title" ) == null ) { 375 final LabelInterface msglbl = getLabelInterface(); 376 if( msglbl != null ) { 377 final String desc = msglbl.getDescription(); 378 if( desc != null && desc.length() > 0 ) { 379 set( "title",desc ); 380 } 381 } 382 } 383 384 // 5.5.0.0 Img対応 スタイル属性に追加する。 385 // 6.2.4.2 (2015/05/29) スタイル属性追加時は、一番初めにする。 386 if( bgImg != null && bgImg.length() > 0 ){ 387 final String style = get( "style" ); 388 if( style == null || style.isEmpty() ) { set( "style",IMG_PRE+bgImg+IMG_SUF ); } 389 else { set( "style",IMG_PRE+bgImg+IMG_SUF + style ); } 390 } 391 392 // 6.4.4.1 (2016/03/18) HiddenTagの作成タイミングを後ろに持って行きます。 393 // 3.3.1.1 (2003/07/03) ForwardManager クラスの廃止。飛び先のキャッシュを廃止します。 394 return new OgBuilder() 395 .appendCR( getHiddenTag( command, lbl, valueLink ) ) 396 .appendCR( XHTMLTag.input( getAttributes() ) , MARGIN ) 397 .toString() ; 398 } 399 400 /** 401 * 画面IDとvalue から、指定のURLを作成します。 402 * 画面へのアクセス許可が与えられていない場合は、null を返します。 403 * 404 * @og.rev 3.5.5.0 (2004/03/12) URLを求めるのに、GUIInfo#getRealAddress() を使用する。 405 * @og.rev 4.0.0.0 (2005/01/31) GUIInfoの実アドレスのパラメータを考慮する。 406 * 407 * @param gamenId 画面ID 408 * @param value 飛ばし先(XXXX.jspのXXXX部分) 409 * 410 * @return URL文字列(アクセス不可時は null) 411 * @og.rtnNotNull 412 */ 413 private String getValueLink( final String gamenId,final String value ) { 414 String link = value + ".jsp"; 415 416 if( gamenId != null && gamenId.length() > 0 ) { 417 final GUIInfo guiInfo = getGUIInfo( gamenId ); // 4.0.0 (2005/01/31) 418 if( guiInfo == null ) { return null; } // 見つからない場合は、アクセス不可 419 420 final String address = guiInfo.getRealAddress( link ); 421 link = getRequestParameter( address ); 422 } 423 424 return link ; 425 } 426 427 /** 428 * 【TAG】アクション(INSERT,COPY,MODIFY,DELETE,ENTRY,RESET)を指定します。 429 * 430 * @og.tag 431 * Ver5 になって、update.jsp ですべての処理を行う方向で開発するに当たり、 432 * command と lbl を記述する必要がでてきました。 433 * そこで、現在最新版では、action 属性を用意し、command を記述するだけで良くなりました。 434 * 435 * [action属性] [初期設定されるパラメータ郡] 436 * INSERT value="update" command="INSERT" lbl="INSERT" accesskey="I" 437 * COPY value="update" command="COPY" lbl="COPY" accesskey="C" 438 * MODIFY value="update" command="MODIFY" lbl="MODIFY" accesskey="M" 439 * DELETE value="update" command="DELETE" lbl="DELETE" accesskey="Z" 440 * VIEW value="update" command="VIEW" lbl="VIEW" accesskey="V" 6.3.9.1 (2015/11/27) 追加 441 * ENTRY value="entry" command="ENTRY" lbl="ENTRY" accesskey="E" 442 * RESET value="reset" command="RESET" lbl="ENTRY" accesskey="R" 443 * 444 * 7.4.2.1 (2021/05/21) 445 * システム定数 USE_ACCESSKEY を false に設定すると、accesskey は使用されません。 446 * 447 * @og.rev 5.2.2.0 (2010/11/01) 新規追加 448 * @og.rev 6.3.4.0 (2015/08/01) Arrays.toString から String.join に置き換え。 449 * @og.rev 6.4.3.4 (2016/03/11) String配列 から、Setに置き換えます。 450 * 451 * @param act アクション文字列 452 * @see <a href="../../../../constant-values.html#org.opengion.hayabusa.taglib.SubmitTag.ACT_COPY">アクション定数</a> 453 */ 454 public void setAction( final String act ) { 455 action = getRequestParameter( act ); 456 457 if( ! check( action, ACTION_SET ) ) { 458 final String errMsg = "指定のアクションは実行できません。アクションエラー" + CR 459 + "action=[" + action + "] " + CR 460 + "actionList=" + String.join( ", " , ACTION_SET ) ; 461 throw new HybsSystemException( errMsg ); 462 } 463 } 464 465 /** 466 * 【TAG】forward したいJSPファイル名を記述します(例:insert,copy,modify,delete など)。 467 * 468 * @og.tag 469 * JSPファイル名は、標準で、insert,copy,modify,delete などと指定します。 470 * 実際には、各JSP画面(insert.jsp,copy.jsp,modify.jsp,delete.jsp )に 471 * リクエストが転送されます。 472 * このJSPファイル名は、同一画面ID内のフォルダに属している必要があります。 473 * ここのIDは、JSP画面そのものですので、大文字小文字は区別されます。 474 * 475 * @param val JSPファイル名 (insert,copy,modify,delete など) 476 */ 477 public void setValue( final String val ) { 478 value = nval( getRequestParameter( val ),value ); 479 if( value == null ) { 480 final String errMsg = "value に null がセットされています。"; 481 throw new HybsSystemException( errMsg ); 482 } 483 } 484 485 /** 486 * 【TAG】画面ID を指定します。 487 * 488 * @og.tag 489 * gamenId 属性は、別の画面にforward する場合に使用します。 490 * 実際は、forward ではなく、sendRedirect されます。 491 * 492 * @param id 画面ID 493 */ 494 public void setGamenId( final String id ) { 495 gamenId = nval( getRequestParameter( id ),gamenId ); 496 } 497 498 /** 499 * 隠し属性タグを取得します。 500 * 各ボタンに設定された値を、隠しフィールドに設定して受け渡しします。 501 * 502 * @og.rev 3.3.1.1 (2003/07/03) ForwardManager クラスの廃止。飛び先のキャッシュを廃止します。 503 * @og.rev 3.5.5.5 (2004/04/23) 余計なボタン関連情報を転送しない為に、キーを変更します。 504 * @og.rev 3.5.5.5 (2004/04/23) keys,vals 属性で指定した値を、出力します。 505 * @og.rev 3.5.5.5 (2004/04/23) hidden の出力に、XHTMLTag.hidden を使用します。 506 * @og.rev 3.8.0.8 (2005/10/03) gamenId が指定されている場合は、BACK_GAMENID を出力する。 507 * @og.rev 5.2.2.0 (2010/11/01) columnWritable,noWritable 属性の追加 508 * @og.rev 6.2.4.0 (2015/05/15) submitタグ毎に飛ばし先を変える為、GAMENIDをボタン単位に出力する。 509 * @og.rev 6.3.9.0 (2015/11/06) コンストラクタで初期化されていないフィールドを null チェックなしで利用している(findbugs) 510 * 511 * @param command コマンド 512 * @param lbl ラベルID 513 * @param valueLink 飛び先URL 514 * 515 * @return 隠し属性タグ 516 * @og.rtnNotNull 517 */ 518 private String getHiddenTag( final String command, final String lbl, final String valueLink ) { 519 520 final String prefix = HybsSystem.NO_XFER_KEY + lbl ; 521 522 final StringBuilder strRet = new StringBuilder( BUFFER_MIDDLE ) 523 .append( XHTMLTag.hidden( prefix ,valueLink ) ) // 3.5.5.5 (2004/04/23) 524 .append( XHTMLTag.hidden( prefix + "CMD",command ) ); // 3.5.5.5 (2004/04/23) 525 526 // 3.5.5.5 (2004/04/23) keys,vals 属性で指定した値を、出力します。 527 // 6.3.9.0 (2015/11/06) コンストラクタで初期化されていないフィールドを null チェックなしで利用している(findbugs) 528 if( keys != null && vals != null ) { 529 if( keys.length != vals.length ) { 530 final String errMsg = "SubmitTag の keys と vals の引数の個数が異なります。" + CR 531 + "keys=[" + StringUtil.array2csv( keys ) + "], vals=[" 532 + StringUtil.array2csv( vals ) + "]" ; 533 throw new HybsSystemException( errMsg ); 534 } 535 for( int i=0; i<keys.length; i++ ) { 536 strRet.append( XHTMLTag.hidden( prefix + "KEY_" + keys[i],vals[i] ) ); // 3.5.5.5 (2004/04/23) 537 } 538 } 539 540 // 4.0.0 (2007/05/23) dbkeys が指定されている場合 541 if( dbkeys != null && dbkeys.length() > 0 ) { 542 strRet.append( XHTMLTag.hidden( prefix + "KEY_dbkeys",dbkeys ) ); // 4.0.0 (2007/05/23) 543 } 544 545 // 3.8.0.8 (2005/10/03) gamenId が指定されている場合は、BACK_GAMENID を出力する。 546 // 6.2.4.0 (2015/05/15) submitタグ毎に飛ばし先を変える為、GAMENIDをボタン単位に出力する。 547 // GAMENID は、writeChectタグで hidden で出しているが、commonForward が hidden を拾えなかったため、問題なかった。 548 if( gamenId != null && gamenId.length() > 0 ) { 549 final String backGamenId = getGUIInfoAttri( "KEY" ); 550 strRet.append( XHTMLTag.hidden( prefix + "KEY_GAMENID" ,gamenId ) ) // 6.2.4.0 (2015/05/15) 551 .append( XHTMLTag.hidden( prefix + "KEY_BACK_GAMENID",backGamenId ) ); 552 } 553 554 // 5.2.2.0 (2010/11/01) columnWritable,noWritable 属性の追加 555 if( columnWritable != null ) { 556 strRet.append( XHTMLTag.hidden( prefix + "KEY_columnWritable",columnWritable ) ); 557 } 558 if( noWritable != null ) { 559 strRet.append( XHTMLTag.hidden( prefix + "KEY_noWritable" ,noWritable ) ); 560 } 561 562 return strRet.toString(); 563 } 564 565 /** 566 * 【TAG】処理コマンドを登録します(初期値:大文字の value 属性値[INSERT,COPY,MODIFY,DELETE など])。 567 * 568 * @og.tag 569 * command 属性を指定しない場合は、このvalue 属性値が、コマンドになります。 570 * value 属性に、insert,copy,modify,delete などと指定されていた場合は、 571 * それぞれ、INSERT,COPY,MODIFY,DELETE というコマンドになります。 572 * コマンドは、大文字です。 573 * 574 * @param cmd コマンド 575 */ 576 public void setCommand( final String cmd ) { 577 command = nval( getRequestParameter( cmd ),command ); 578 if( command != null ) { command = command.toUpperCase(Locale.JAPAN); } 579 } 580 581 /** 582 * 【TAG】サブミット先の文書を表示させるフレーム、またはウィンドウの名前を指定します。 583 * 584 * @og.tag サブミット先のフレーム名(ターゲット属性)を設定します。 585 * 586 * @og.rev 3.5.5.2 (2004/04/02) 新規追加 587 * 588 * @param name サブミット先の文書のフレーム名(ターゲット属性) 589 */ 590 public void setTarget( final String name ) { 591 target = nval( getRequestParameter( name ),target ); 592 } 593 594 /** 595 * 【TAG】ボタン専用のリクエストキーをCSV形式で複数指定します。 596 * 597 * @og.tag 598 * このサブミットボタンが押された場合のみ、転送されるリクエスト情報の 599 * キーを設定できます。CSV形式で複数指定できます。 600 * vals 属性には、キーに対応する値を、設定してください。 601 * 分解方法は、CSV変数を先に分解してから、getRequestParameter で値を取得します。 602 * こうしないとデータ自身にカンマを持っている場合に分解をミスる為です。 603 * 604 * @og.rev 3.5.5.5 (2004/04/23) 新規追加 605 * @og.rev 3.5.6.2 (2004/07/05) CommonTagSupport#getCSVParameter を使用 606 * 607 * @param key ボタンが押された時に転送するキー 608 */ 609 public void setKeys( final String key ) { 610 keys = getCSVParameter( key ); 611 } 612 613 /** 614 * 【TAG】ボタン専用のリクエスト値をCSV形式で複数指定します。 615 * 616 * @og.tag 617 * キーに対応した値を、CSV形式で複数指定出来ます。 618 * 指定順序は、キーと同じにしておいて下さい。 619 * 分解方法は、CSV変数を先に分解してから、getRequestParameter で値を取得します。 620 * こうしないとデータ自身にカンマを持っている場合に分解をミスる為です。 621 * 622 * @og.rev 3.5.5.5 (2004/04/23) 新規追加 623 * @og.rev 3.5.6.2 (2004/07/05) CommonTagSupport#getCSVParameter を使用 624 * 625 * @param val keys属性に対応する値 626 */ 627 public void setVals( final String val ) { 628 vals = getCSVParameter( val ); 629 } 630 631 /** 632 * 【TAG】commonForward の dbkeys にカラム指定を行います。 633 * 634 * @og.tag 635 * カラム指定は、CSV形式(CSV形式)で指定してください。 636 * なお、引数は、自動的に受けるのではなく、commonForward タグに、 637 * dbkeys="{@dbkeys}" の記述は必要です。 638 * 639 * @og.rev 4.0.0.0 (2007/05/23) 新規追加 640 * 641 * @param keys dbkeysのカラム指定 642 */ 643 public void setDbkeys( final String keys ) { 644 dbkeys = nval( getRequestParameter( keys ),dbkeys ); 645 } 646 647 /** 648 * 【TAG】書き込み可能カラム名を、CSV形式で与えます。 649 * 650 * @og.tag 651 * これは、書き込み不可カラム名の指定(noWritable)と同時にセットする 652 * ことは出来ません。 653 * なお、カラム名の代わりに、"null" を指定すると、なにも指定しないこと 654 * になります。つまり、noWritable にすべてのカラムを指定することと 655 * 同じになります。(デフォルトなので、あまり意味はありません。) 656 * "*" を指定すると、すべてのカラムを(columnWritable)指定したことになります。 657 * 658 * @og.rev 5.2.2.0 (2010/11/01) 新規追加 659 * 660 * @param columnName 書込可能カラム名(CSV形式) (例:"OYA,KO,HJO,SU,DYSET,DYUPD") 661 * @see #setNoWritable( String ) 662 */ 663 public void setColumnWritable( final String columnName ) { 664 columnWritable = nval( getRequestParameter(columnName),null ); 665 } 666 667 /** 668 * 【TAG】書き込み不可カラム名を、CSV形式で与えます。 669 * 670 * @og.tag 671 * これは、書き込み可能カラム名の指定(columnWritable)と同時にセットする 672 * ことは出来ません。 673 * なお、カラム名の代わりに、"null" を指定すると、なにも指定しないこと 674 * になります。つまり、columnWritable にすべてのカラムを指定することと 675 * 同じになります。 676 * "*" を指定すると、すべてのカラムを(noWritable)指定したことになります。 677 * 678 * @og.rev 5.2.2.0 (2010/11/01) 新規追加 679 * 680 * @param columnName 書込不可カラム名(CSV形式) (例:"OYA,KO,HJO,SU,DYSET,DYUPD") 681 * @see #setColumnWritable( String ) 682 */ 683 public void setNoWritable( final String columnName ) { 684 noWritable = nval( getRequestParameter(columnName),null ); 685 } 686 687 /** 688 * 【TAG】画像ボタンを作る場合の、画像ファイルを指定します。 689 * 690 * @og.tag 691 * 画像ボタン作成支援の属性です。 692 * inputタグでtype=imageにした場合、IEではname,valueのセットが 693 * 次の画面に渡されない仕様になっているためエンジンのsubmitでは 694 * 利用できません。(どのボタンが押されたか分からない) 695 * そこで、typeはsubmitのままcssの背景画像としてここで指定した 696 * 画像を配置します。 697 * 内部的にはbackground: url(imgFile) center center no-repeat; 698 * をstyleタグに書く事と同じです。 699 * 高さ、幅は把握できないため、別途style属性でhight,widthを指定して下さい。 700 * 701 * 6.2.4.2 (2015/05/29) 702 * 画像の配置を、left top から、center center に変更します。 703 * スタイル属性追加時は、一番初めにします。そうすることで、style属性で、これらの 704 * 設定を上書きできるようになります。 705 * 706 * @og.rev 5.5.0.0 (2012/03/01) 新規追加 707 * 708 * @param image ボタンの背景画像 709 */ 710 public void setImg( final String image ) { 711 bgImg = nval( getRequestParameter(image),null ); 712 } 713 714 /** 715 * このオブジェクトの文字列表現を返します。 716 * 基本的にデバッグ目的に使用します。 717 * 718 * @return このクラスの文字列表現 719 * @og.rtnNotNull 720 */ 721 @Override 722 public String toString() { 723 return ToString.title( this.getClass().getName() ) 724 .println( "VERSION" ,VERSION ) 725 .println( "command" ,command ) 726 .println( "value" ,value ) 727 .println( "gamenId" ,gamenId ) 728 .println( "target" ,target ) 729 .println( "keys" ,keys ) 730 .println( "vals" ,vals ) 731 .println( "Other..." ,getAttributes().getAttribute() ) 732 .fixForm().toString() ; 733 } 734}