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 java.io.IOException; 019 020import javax.mail.internet.MimeUtility; 021import javax.servlet.ServletException; 022import javax.servlet.http.HttpServletRequest; 023import javax.servlet.http.HttpServletResponse; 024 025import org.opengion.fukurou.system.LogWriter; 026import org.opengion.fukurou.util.StringUtil; 027import org.opengion.fukurou.util.XHTMLTag; 028import org.opengion.fukurou.util.ToString; // 6.1.1.0 (2015/01/17) 029import org.opengion.hayabusa.common.HybsSystem; 030import org.opengion.hayabusa.common.HybsSystemException; 031import org.opengion.hayabusa.db.DBTableModel; 032import org.opengion.hayabusa.resource.GUIInfo; 033 034import static org.opengion.fukurou.util.StringUtil.nval; 035 036/** 037 * 制御を別の画面にフォワードする場合に使用するタグです(通常は、entry.jsp で使用します)。 038 * 039 * フォワード時に、指定の引数をセットできます。 040 * 041 * @og.formSample 042 * ●形式:<og:forward page="…" gamenId="[…]" /> 043 * ●body:なし 044 * 045 * ●Tag定義: 046 * <og:forward 047 * gamenId 【TAG】gamenId 属性を登録します 048 * page ○【TAG】転送先URLを指定します(必須)。 049 * keys 【TAG】キーを CSV形式でセットします 050 * vals 【TAG】キーに対応する値を CSV形式でセットします 051 * dbkeys 【TAG】DBキーをCSV形式でセットします 052 * scope 【TAG】キャッシュする場合のスコープ[request/page/session/application]を指定します(初期値:session) 053 * useRedirect 【TAG】response.sendRedirect するかどうか[true/false]を指定します(初期値:false) 054 * target 【TAG】サブミット先の文書を表示させるフレーム、またはウィンドウの名前を指定します 055 * filename 【TAG】ファイル転送時にファイル名の別名を指定します(初期値:null) 056 * disposition 【TAG】ファイル転送時のヘッダー情報として、Content-Dispositionに設定する値を指定します(初期値:CONTENT_DISPOSITION[={@og.value SystemData#CONTENT_DISPOSITION}])。 057 * noTransition 【TAG】(通常は使いません)画面遷移を行わない形式の登録方法を使用するかを指定します 058 * useAjaxSubmit 【TAG】(通常は使いません)ajaxを利用したsubmitを利用するかどうかを指定します 059 * redirectEncode 【TAG】(通常は使いません)useRedirect=true時に 日本語を含む転送先(page)をバイナリ変換するときのコード名[UTF-8/Windows-31J]など(初期値:null) 060 * caseKey 【TAG】このタグ自体を利用するかどうかの条件キーを指定します(初期値:null) 061 * caseVal 【TAG】このタグ自体を利用するかどうかの条件値を指定します(初期値:null) 062 * caseNN 【TAG】指定の値が、null/ゼロ文字列 でない場合(Not Null=NN)は、このタグは使用されます(初期値:判定しない) 063 * caseNull 【TAG】指定の値が、null/ゼロ文字列 の場合は、このタグは使用されます(初期値:判定しない) 064 * caseIf 【TAG】指定の値が、true/TRUE文字列の場合は、このタグは使用されます(初期値:判定しない) 065 * debug 【TAG】デバッグ情報を出力するかどうか[true/false]を指定します(初期値:false) 066 * /> 067 * 068 * ※ 6.4.3.0 (2016/02/05) disposition 追加 069 * 以前は、inline 固定でしたが、引数で指定できるようにします。 070 * 071 * ●使用例 072 * <og:forward 073 * page = "転送先URLを指定します(必須)。" 074 * dbkeys = "DBキーをCSV形式でセットします。" 075 * keys = "キーを CSV形式でセットします。" 076 * vals = "キーに対応する値を CSV形式でセットします。" 077 * scope = "キャッシュする場合のスコープ(request,page,session,application)を指定します(初期値:session)。" 078 * gamenId = "gamenId 属性を登録します。" 079 * useRedirect = "useRedirect 属性を登録します。" 080 * filename = "ファイル転送時にファイル名を指定する場合に設定します。" 081 * target = "taregt 属性を登録します。" 082 * noTransition = "実際にforwardせずに、id="forwardUrl"属性のbody部分に遷移先のURLを出力します。(画面遷移なしモード時に使用します)" 083 * /> 084 * 085 * @og.group 画面制御 086 * 087 * @version 4.0 088 * @author Kazuhiko Hasegawa 089 * @since JDK5.0, 090 */ 091public class ForwardTag extends CommonTagSupport { 092 /** このプログラムのVERSION文字列を設定します。 {@value} */ 093 private static final String VERSION = "6.9.0.0 (2018/01/31)" ; 094 private static final long serialVersionUID = 690020180131L ; 095 096 private transient DBTableModel table ; 097 private String tableId = HybsSystem.TBL_MDL_KEY; 098 private String page ; 099 private String keys ; 100 private String dbkeys ; 101 private String[] vals ; 102 private String gamenId ; // 3.5.4.9 (2004/02/25) 追加 103 private boolean useRedirect ; // 3.5.6.6 (2004/08/23) 追加 104 private String target ; // 3.8.0.4 (2005/08/08) 追加 105 private String filename ; // 4.0.0 (2005/11/30) 追加 106 private String disposition = HybsSystem.sys( "CONTENT_DISPOSITION" ); // 6.4.3.0 (2016/02/05) 追加 107 private boolean noTransition; // 4.3.3.0 (2008/10/01) 追加 108 private boolean useAjaxSubmit ; // 4.3.8.0 (2009/08/01) 追加 109 private String redirectEncode ; // 5.6.5.0 (2013/06/07) 追加 110 111 /** 112 * デフォルトコンストラクター 113 * 114 * @og.rev 6.4.2.0 (2016/01/29) PMD refactoring. Each class should declare at least one constructor. 115 */ 116 public ForwardTag() { super(); } // これも、自動的に呼ばれるが、空のメソッドを作成すると警告されるので、明示的にしておきます。 117 118 /** 119 * Taglibの終了タグが見つかったときに処理する doEndTag() を オーバーライドします。 120 * 121 * @og.rev 2.1.0.0 (2002/10/11) 戻り値の先頭の "?" を追加しないように変更。 122 * @og.rev 3.0.1.3 (2003/03/11) 直接転送した場合の整合性を取る為の対応。 123 * @og.rev 3.1.1.2 (2003/04/04) Tomcat4.1 対応。release2() を doEndTag()で呼ぶ。 124 * @og.rev 3.1.2.0 (2003/04/07) ソースコード中の固定値を、定義ファイルを使用するように変更する。 125 * @og.rev 3.5.4.9 (2004/02/25) gamenId を指定して、フォワードできるようにします。 126 * @og.rev 3.5.6.6 (2004/08/23) useRedirect 属性を追加します。 127 * @og.rev 4.3.3.0 (2008/10/01) noTransition 属性を追加します。 128 * @og.rev 4.3.7.1 (2009/06/08) target属性に絶対パス及び"_"で始まる予約語を指定できるようにします。 129 * @og.rev 4.3.8.0 (2009/08/01) useAjaxSubmit対応、noTransition値取得メソッド名変更 130 * @og.rev 5.0.0.4 (2009/10/01) 画面遷移なし登録で戻った際に最終行が選択されるバグを修正 131 * @og.rev 5.1.3.0 (2010/02/01) noTransition、ajaxSubmitのコントロールは、requestで行う。 132 * @og.rev 5.1.6.0 (2010/05/01) IE以外は、MIMEエンコードする。(RFC2231に従う) 133 * @og.rev 5.1.7.0 (2010/06/01) 画面IDをパラメーターに付加する。 134 * @og.rev 5.1.7.0 (2010/06/01) 遷移先がJSP以外の場合は、フォワードページのキャッシュをしない。 135 * @og.rev 5.1.8.0 (2010/07/01) httpが指定されていた場合に、自身の画面IDが付加されるバグを修正 136 * @og.rev 5.3.8.0 (2011/08/01) ファイル名指定でIEの場合、URLエンコードすると途中で切れるため(IE7のバグ)、Shift_JIS(WIndows-31J)で直接指定する。 137 * @og.rev 5.6.5.0 (2013/06/07) redirectEncode 属性を追加します。 138 * @og.rev 5.7.4.1 (2014/03/14) 日本語ファイル名が正しく処理できない件を修正(IE11のMSIE関連) 139 * @og.rev 6.0.2.5 (2014/10/31) debug="true" を設定したときは、forward も sendRedirect も行わない。 140 * @og.rev 6.3.4.0 (2015/08/01) caseKey,caseVal,caseNN,caseNull,caseIf 属性対応 141 * @og.rev 6.4.0.2 (2015/12/11) 飛び先の画面が見つからない(アクセス権がない)場合、転送先URL を null にする。 142 * @og.rev 6.9.0.0 (2018/01/31) Windows10 の Edge で、ファイルの文字化け対応(FileDownload servletと同じ対応を入れます)。 143 * 144 * @return 後続処理の指示 145 */ 146 @Override 147 public int doEndTag() { 148 debugPrint(); // 4.0.0 (2005/02/28) 149 if( !useTag() ) { return EVAL_PAGE ; } // 6.3.4.0 (2015/08/01) 150 151 // noTransition = isNoTransitionRequest() || noTransition; // 4.3.3.0 (2008/10/01) 追加 152 noTransition = isNoTransitionRequest(); // 5.1.3.0 (2010/02/01) 153 useAjaxSubmit = isAjaxSubmitRequest(); // 5.1.3.0 (2010/02/01) 154 155 final String fwdUrl = makeGamenLink(); // 3.5.4.9 (2004/02/25) 156 if( fwdUrl == null ) { return EVAL_PAGE ; } // 6.4.0.2 (2015/12/11) 157 158 // 6.4.1.1 (2016/01/16) PMD refactoring. Avoid declaring a variable if it is unreferenced before a possible exit point. 159 final String urlEnc = getUrlEncode(); 160 final HttpServletResponse response = (HttpServletResponse)pageContext.getResponse(); 161 try { 162 String url = response.encodeRedirectURL( fwdUrl ); // 3.5.4.9 (2004/02/25) 163 // 5.1.7.0 (2010/06/01) 画面IDをパラメーターに付加する。 164 // 5.1.8.0 (2010/07/01) httpが指定されていた場合に、自身の画面IDが付加されるバグを修正 165 // 6.4.1.1 (2016/01/16) PMD refactoring. Avoid if (x != y) ..; else ..; 166 if( filename == null ) { 167 if( !page.startsWith( "http" ) && page.endsWith( ".jsp" ) ) { 168 if( keys == null || keys.isEmpty() || ( "," + keys + "," ).indexOf( ",GAMENID," ) < 0 ) { 169 if( gamenId != null && gamenId.length() > 0 ) { 170 url = XHTMLTag.addUrlEncode( url, "GAMENID=" + gamenId ); 171 } 172 // useRedirect=trueでGAMENIDを指定せず、../GF9100/index.jsp等と書かれている場合の対応 173 else if( !useRedirect ) { 174 url = XHTMLTag.addUrlEncode( url, "GAMENID=" + getGUIInfoAttri( "KEY" ) ); 175 } 176 } 177 } 178 } 179 else { 180 // 5.1.6.0 (2010/05/01) IE以外は、MIMEエンコードする。(RFC2231に従う) 181 // 5.7.4.1 (2014/03/14) 日本語ファイル名が正しく処理できない件を修正(IE11のMSIE関連) 182 // 条件を反転させた上でIE11対応を行う 183 final String reqHeader = ((HttpServletRequest)pageContext.getRequest()).getHeader( "User-Agent" ); 184// if( reqHeader.indexOf( "MSIE" ) >= 0 || reqHeader.indexOf( "Trident" ) >= 0 ) { 185 if( reqHeader.indexOf( "MSIE" ) >= 0 || reqHeader.indexOf( "Trident" ) >= 0 || reqHeader.indexOf( "Edge" ) >= 0 ) { // 6.9.0.0 (2018/01/31) 186 filename = new String( filename.getBytes("Windows-31J"), "ISO-8859-1" ); 187 } 188 else { 189 filename = MimeUtility.encodeWord( filename, "UTF-8", "B" ); 190 } 191 192 response.setHeader( "Content-Disposition",disposition + "; filename=\"" + filename + "\"" ); // 6.4.3.0 (2016/02/05) 193 } 194 195 // 3.5.6.6 (2004/08/23) useRedirect 属性を追加 196 String url2 = XHTMLTag.addUrlEncode( url , urlEnc ); 197 // 4.3.3.0 (2008/10/01) 追加 198 // if( noTransition ) { 199 if( noTransition || useAjaxSubmit ) { // 4.3.8.0 (2009/08/01) useAjaxSubmitと共用 200 // 5.0.0.4 (2009/10/01) 201 if( noTransition ) { 202 final int selRow = nval( getRequestValue( "SEL_ROW" ),-1 ); 203 if( selRow > 0 ) { 204 url2 = XHTMLTag.addUrlEncode( url2, "SEL_ROW=" + selRow ); 205 } 206 } 207 jspPrint( "<div id=\"noTransitionUrl\">" + url2 + "</div>" ); 208 jspPrint( "<div id=\"noTransitionTarget\">" + target + "</div>" ); 209 } 210 // 3.8.0.4 (2005/08/08) target 属性を追加します。 211 else if( target != null && target.length() > 0 ) { 212 // 4.3.7.1 (2009/06/08) 213 String src = null; 214 if( target.startsWith( "_b" ) ) { // "_blank" 215 src = "window.open(\"" + url2 + "\", \"_blank\") "; 216 } 217 else { 218 String frameTop = ""; 219 if( target.indexOf('.') < 0 ) { frameTop = "top."; } 220 src = frameTop + target + ".location.href=\"" + url2 + "\"" + CR; 221 } 222 final String script = "<script type=\"text/javascript\" ><!-- " + CR 223 + src + CR 224 + "// --></script>" ; 225 jspPrint( script ); 226 } 227 else if( useRedirect ) { 228 // 5.6.5.0 (2013/06/07) redirectEncode 属性追加 229 if( redirectEncode != null ) { 230 url2 = new String( url2.getBytes( redirectEncode ), "ISO-8859-1" ); 231 } 232 // 6.0.2.5 (2014/10/31) debug="true" を設定したときは、forward も sendRedirect も行わない。 233 if( isDebug() ) { 234 final String debugMsg = "<pre>debug=\"true\" 時には、forward も sendRedirect も行いません。" 235 + CR 236 + "Redirect URL=" + url2 + CR 237 + "</pre>" + CR; 238 jspPrint( debugMsg ); 239 } 240 else { 241 response.sendRedirect( url2 ); 242 } 243 } 244 else { 245 // 6.0.2.5 (2014/10/31) debug="true" を設定したときは、forward も sendRedirect も行わない。 246 if( isDebug() ) { 247 final String debugMsg = "<pre>debug=\"true\" 時には、forward も sendRedirect も行いません。" 248 + CR 249 + "Forward URL=" + url2 + CR 250 + "</pre>" + CR; 251 jspPrint( debugMsg ); 252 } 253 else { 254 pageContext.forward( url2 ); 255 } 256 } 257 } catch( final IOException ex ) { 258 final String errMsg = "フォワード/リダイレクトでIOエラーが発生しました。" 259 + CR 260 + fwdUrl + "?" + urlEnc ; 261 throw new HybsSystemException( errMsg,ex ); // 3.5.5.4 (2004/04/15) 引数の並び順変更 262 } catch( final ServletException ex) { 263 final String errMsg = "フォワード/リダイレクトでServletエラーが発生しました。" 264 + CR 265 + fwdUrl + "?" + urlEnc ; 266 throw new HybsSystemException( errMsg,ex ); // 3.5.5.4 (2004/04/15) 引数の並び順変更 267 } 268 269 // 3.0.1.3 (2003/03/11) forward で直接転送した場合の整合性を取る為の対応。 270 // 5.1.7.0 (2010/06/01) 遷移先がJSP以外の場合は、フォワードページのキャッシュをしない。 271 if( fwdUrl != null && fwdUrl.endsWith( ".jsp" ) ) { 272 setSessionAttribute( HybsSystem.FORWARD_PAGE_KEY, fwdUrl ); // 3.5.4.9 (2004/02/25) 273 } 274 275 return SKIP_PAGE ; // ページの残りの処理を行わない。 276 } 277 278 /** 279 * タグリブオブジェクトをリリースします。 280 * キャッシュされて再利用されるので、フィールドの初期設定を行います。 281 * 282 * @og.rev 2.0.0.4 (2002/09/27) カスタムタグの release() メソッドを、追加 283 * @og.rev 3.1.1.2 (2003/04/04) Tomcat4.1 対応。release2() を doEndTag()で呼ぶ。 284 * @og.rev 3.5.4.9 (2004/02/25) 画面ID属性(gamenId)を追加 285 * @og.rev 3.8.5.0 (2006/03/06) filename 属性を追加します。 286 * @og.rev 4.3.3.0 (2008/10/01) noTransition 属性を追加します。 287 * @og.rev 5.6.5.0 (2013/06/07) redirectEncode 属性を追加します。 288 * @og.rev 6.4.3.0 (2016/02/05) disposition属性、新規追加。 289 * 290 */ 291 @Override 292 protected void release2() { 293 super.release2(); 294 tableId = HybsSystem.TBL_MDL_KEY; 295 page = null; 296 keys = null; 297 dbkeys = null; 298 vals = null; 299 table = null; 300 gamenId = null; 301 useRedirect = false; // 3.5.6.6 (2004/08/23) 追加 302 target = null; // 3.8.0.4 (2005/08/08) 追加 303 filename = null; 304 disposition = HybsSystem.sys( "CONTENT_DISPOSITION" ); // 6.4.3.0 (2016/02/05) 追加 305 noTransition = false; // 4.3.3.0 (2008/10/01) 追加 306 useAjaxSubmit = false; // 4.3.8.0 (2009/08/01) 追加 307 redirectEncode = null; // 5.6.5.0 (2013/06/07) 追加 308 } 309 310 /** 311 * keys 属性 を元に、request情報より values の値を取り込む。 312 * 313 * keys属性は キー情報がCSV形式になっている為,ばらして 314 * values属性の配列に一つづつ設定していきます。 315 * 316 * @og.rev 3.1.7.0 (2003/05/02) 戻るボタン用のBACK_GAMENID を、引数に追加します。 317 * @og.rev 3.1.8.0 (2003/05/16) 戻るボタン用のBACK_GAMENID の自動登録を廃止します。 318 * @og.rev 4.0.0.0 (2005/01/31) getParameterRows() を使用するように変更 319 * @og.rev 6.3.9.0 (2015/11/06) コンストラクタで初期化されていないフィールドを null チェックなしで利用している(findbugs) 320 * 321 * @return URLエンコードされた文字列 322 */ 323 private String getUrlEncode() { 324 final String[] dbkey = StringUtil.csv2Array( dbkeys ); 325 final String[] key = StringUtil.csv2Array( keys ); 326 327 final int dbCount = dbkey.length; 328 final int count = key.length ; 329 330 String[] allKey = new String[ dbCount + count ]; 331 String[] allval = new String[ dbCount + count ]; 332 333 final int[] rowNo = getParameterRows(); // 4.0.0 (2005/01/31) 334 if( dbCount > 0 && dbkey[0] != null && dbkey[0].length() > 0 && rowNo.length > 0 ) { 335 table = (DBTableModel)getObject( tableId ); 336 if( table != null ) { 337 for( int i=0; i<dbCount; i++ ) { 338 allKey[i] = dbkey[i]; 339 allval[i] = table.getValue(rowNo[0],table.getColumnNo( dbkey[i] )); 340 } 341 } 342 } 343 344 // 6.3.9.0 (2015/11/06) コンストラクタで初期化されていないフィールドを null チェックなしで利用している(findbugs) 345 if( count > 0 && vals != null && vals.length == count ) { 346 for( int i=0; i<count; i++ ) { 347 allKey[i+dbCount] = key[i]; 348 allval[i+dbCount] = vals[i]; 349 } 350 } 351 352 return XHTMLTag.urlEncode( allKey,allval ); 353 } 354 355 /** 356 * 【TAG】転送先URLを指定します。 357 * 358 * @og.tag 転送先URLを指定します。 359 * 360 * @param url 転送先URL 361 */ 362 public void setPage( final String url ) { 363 page = getRequestParameter( url ); 364 } 365 366 /** 367 * 【TAG】DBキーをCSV形式でセットします。 368 * 369 * @og.tag 370 * URI の引数にセットするキーを CSV形式でセットします。 371 * ここの指定は,DBTableModel 上のデータを取り込みます。 372 * 373 * @param key DBキー(CSV形式) 374 */ 375 public void setDbkeys( final String key ) { 376 dbkeys = getRequestParameter( key ) ; 377 } 378 379 /** 380 * 【TAG】キーを CSV形式でセットします。 381 * 382 * @og.tag 383 * URI の引数にセットするキーを CSV形式でセットします。 384 * 385 * @param key キー(CSV形式) 386 */ 387 public void setKeys( final String key ) { 388 keys = getRequestParameter( key ) ; 389 } 390 391 /** 392 * 【TAG】キーに対応する値を CSV形式でセットします。 393 * 394 * @og.tag 395 * URI の引数にセットする値を CSV形式でセットします。 396 * 分解方法は、CSV変数を先に分解してから、getRequestParameter で値を取得します。 397 * こうしないとデータ自身にカンマを持っている場合に分解をミスる為です。 398 * 399 * @og.rev 3.5.6.2 (2004/07/05) CommonTagSupport#getCSVParameter を使用 400 * 401 * @param val 値(CSV形式) 402 */ 403 public void setVals( final String val ) { 404 vals = getCSVParameter( val ); 405 406 // 先に分解しないとデータ自身にカンマを持っている場合に分解をミスる。 407 } 408 409 /** 410 * 画面IDとpage から、フォワードするURLを作成します。 411 * page が null の場合は、index.jsp に転送されます。 412 * 413 * @og.rev 3.5.4.9 (2004/02/25) 新規追加 414 * @og.rev 3.5.5.0 (2004/03/12) URLを求めるのに、GUIInfo#getRealAddress() を使用する。 415 * @og.rev 4.0.0.0 (2005/01/31) GUIInfoの実アドレスのパラメータを考慮する。 416 * @og.rev 6.4.0.2 (2015/12/11) 飛び先の画面が見つからない(アクセス権がない)場合、転送先URL を null にする。 417 * 418 * @return フォワードするURL(転送先URL) 419 */ 420 private String makeGamenLink() { 421 if( page == null ) { page = "index.jsp"; } 422 423 if( gamenId == null || gamenId.isEmpty() ) { return page; } 424 425 final GUIInfo guiInfo = getGUIInfo( gamenId ); 426 if( guiInfo == null ) { // 見つからない場合は、転送しない 427 LogWriter.log( "Forward[" + gamenId + "]先にはアクセス不可です。" ); 428 return null; // 6.4.0.2 (2015/12/11) 429 } 430 431 final String address = guiInfo.getRealAddress( page ); 432 final String link = getRequestParameter( address ); 433 434 // Ver 4.0.0 (2007/06/12) gamenId を使用する場合は、useRedirect = true をセット 435 useRedirect = true; 436 return link; 437 } 438 439 /** 440 * 【TAG】画面ID を指定します。 441 * 442 * @og.tag 443 * gamenId 属性は、画面IDをキーに、実アドレスを求めるのに使用します。 444 * 画面IDが指定された場合は、実アドレスに変換する。指定されない場合は、 445 * page 属性をそのままリダイレクトアドレスとします。 446 * gamenId を指定した場合は、このuseRedirect属性に関係なく、Redirect されます。 447 * 448 * @og.rev 3.5.4.9 (2004/02/25) 新規追加 449 * 450 * @param id 画面ID 451 * @see #setUseRedirect( String ) 452 */ 453 public void setGamenId( final String id ) { 454 gamenId = nval( getRequestParameter( id ),gamenId ); 455 } 456 457 /** 458 * 【TAG】response.sendRedirect するかどうか[true/false]を指定します(初期値:false)。 459 * 460 * @og.tag 461 * useRedirect 属性は、URLの転送方式を指定できます。 462 * 通常は、pageContext.forward しますが、この属性に true を 463 * 設定すると、response.sendRedirect します。 464 * gamenId を指定した場合は、この属性に関係なく、Redirect されます。 465 * 初期値は、false (forward) です。 466 * 467 * @og.rev 3.5.6.6 (2004/08/23) 新規追加 468 * 469 * @param flag リダイレクト転送か [true:redirect/false:forwrd] 470 * @see #setGamenId( String ) 471 */ 472 public void setUseRedirect( final String flag ) { 473 useRedirect = nval( getRequestParameter( flag ),useRedirect ); 474 } 475 476 /** 477 * 【TAG】サブミット先の文書を表示させるフレーム、またはウィンドウの名前を指定します。 478 * 479 * @og.tag サブミット先のフレーム名(ターゲット属性)を設定します。 480 * 481 * @og.rev 3.8.0.4 (2005/08/08) 新規追加 482 * 483 * @param name フレーム名(ターゲット属性) 484 */ 485 public void setTarget( final String name ) { 486 target = nval( getRequestParameter( name ),target ); 487 } 488 489 /** 490 * 【TAG】ファイル転送時にファイル名の別名を指定します(初期値:null)。 491 * 492 * @og.tag 493 * ファイルを転送する場合に、オープンさせるファイル名を指定します。 494 * 指定しない場合は、フォラード前に呼び出されたアドレスがそのまま使用されます。 495 * 496 * ※ useRedirect="true"時(つまり、リダイレクトする場合)は、ファイル名の指定が 497 * できません。(少なくとも私の知識では出来ませんでした。) 498 * 499 * @param name ファイル名 500 */ 501 public void setFilename( final String name ) { 502 filename = nval( getRequestParameter( name ),filename ); 503 } 504 505 /** 506 * 【TAG】ファイルダウンロードさせる場合に、Content-Disposition に設定する値 507 * (初期値:CONTENT_DISPOSITION[={@og.value SystemData#CONTENT_DISPOSITION}])。 508 * 509 * @og.tag 510 * inline(そのまま開く) を指定すると、PDF などは直接ダウンロードが始まります。 511 * attachment(ダウンロードダイアログを表示する) を指定すると、保存のダイアログを表示しますが 512 * EXCEL などの場合、inline にしても、ダイアログが表示され、開くをクリックしても 513 * ダウンロードが始まらなかったり、EXCELが開いたあと、ブラウザの操作が出来なくなったり、 514 * よくわからないため、選択できるようにします。 515 * (初期値:システム定数のCONTENT_DISPOSITION[={@og.value SystemData#CONTENT_DISPOSITION}])。 516 * 517 * @og.rev 6.4.3.0 (2016/02/05) disposition属性、新規追加。 518 * 519 * @param dispos Content-Dispositionに設定する値(inline/attachment) 520 */ 521 public void setDisposition( final String dispos ) { 522 final String temp = nval( getRequestParameter( dispos ),disposition ); 523 524 if( "inline".equals( temp ) || "attachment".equals( temp ) ) { 525 disposition = temp; 526 } 527 else { 528 final String errMsg = "disposition 属性は、[inline/attachment] から、指定してください。" 529 + " disposition=[" + dispos + "]" + CR ; 530 throw new HybsSystemException( errMsg ); 531 } 532 } 533 534 /** 535 * 【TAG】(通常は使いません)画面遷移を行わない形式の登録方法を使用するかを指定します。 536 * 537 * @og.tag 538 * 画面遷移なしの登録を行うかどうかを指定します。 539 * trueが指定された場合、forwardタグでは、実際の画面遷移は行わずに、forward先の 540 * URLを<div id="noTransitionUrl">[URL]</div>の形でHTMLとして出力し、JavaScript側で 541 * 実際の画面遷移を発生させます。target属性は<div id="noTransitionTarget">[TARGET]</div>で 542 * 出力されます。 543 * 544 * この値は、og:headタグで設定値、または前画面からの値を継承するため、通常、この属性ではセットしません。 545 * 546 * @og.rev 4.3.3.0 (2008/10/01) 新規追加 547 * @og.rev 5.1.3.0 (2010/02/01) noTransition、ajaxSubmitのコントロールは、requestで行う。 548 * 549 * @param noTrnstn 画面遷移を行わない登録か [true:画面遷移を伴わない/false:伴う] 550 */ 551 public void setNoTransition( final String noTrnstn ) { 552 setNoTransitionRequest( nval( getRequestParameter( noTrnstn ), isNoTransitionRequest() ) ); 553 } 554 555 /** 556 * 【TAG】(通常は使いません)ajaxを利用したsubmitを利用するかどうか[true:利用する/false:利用しない]を指定します。 557 * 558 * @og.tag 559 * ajaxを利用したSubmit処理を行うかどうかを指定します。 560 * setNoTransitionをtrueにした場合と同様の処理を行います。 561 * (forwardせずにURLをDIVタグで出力する) 562 * 563 * この値は、og:headタグで設定値、または前画面からの値を継承するため、通常、この属性ではセットしません。 564 * 565 * @og.rev 4.3.8.0 (2009/08/01) 新規追加 566 * @og.rev 5.1.3.0 (2010/02/01) noTransition、ajaxSubmitのコントロールは、requestで行う。 567 * 568 * @param ajaxSubmit ajaxを利用したsubmitを利用するか [true:利用する/false:利用しない] 569 */ 570 public void setUseAjaxSubmit( final String ajaxSubmit ) { 571 setAjaxSubmitRequest( nval( getRequestParameter( ajaxSubmit ), isAjaxSubmitRequest() ) ); 572 } 573 574 /** 575 * 【TAG】(通常は使いません)useRedirect=true時に 日本語を含む転送先(page)をバイナリ変換するときのコード名[UTF-8/Windows-31J]など(初期値:null)。 576 * 577 * @og.tag 578 * 日本語ファイル名を持つ URL を useRedirect で転送する場合に、転送先(page)をバイナリ変換しないと、転送できないケースがあります。 579 * このあたりは、ブラウザにも依存するので、既存の処理に影響しない様に、このパラメータを使用する場合のみ 580 * 処理を実行します。 581 * IEでの日本語ファイル転送で、うまくいかない場合の、暫定処置です。 582 * IEの場合は、redirectEncode="UTF-8" で、日本語ファイルを転送できます。 583 * ただし、useRedirect=true時に filename 属性によるファイル名の書き換え処理はできませんので、ご注意ください。 584 * 初期値は、null で、バイナリエンコードしません。(互換性ありの状態です。) 585 * 586 * @og.rev 5.6.5.0 (2013/06/07) 新規追加 587 * 588 * @param redEnc 転送先(page)の変換文字コード名 (UTF-8/Windows-31Jなど) 589 */ 590 public void setRedirectEncode( final String redEnc ) { 591 redirectEncode = nval( getRequestParameter( redEnc ), redirectEncode ); 592 } 593 594 /** 595 * このオブジェクトの文字列表現を返します。 596 * 基本的にデバッグ目的に使用します。 597 * 598 * @return このクラスの文字列表現 599 * @og.rtnNotNull 600 */ 601 @Override 602 public String toString() { 603 return ToString.title( this.getClass().getName() ) 604 .println( "VERSION" ,VERSION ) 605 .println( "tableId" ,tableId ) 606 .println( "page" ,page ) 607 .println( "keys" ,keys ) 608 .println( "dbkeys" ,dbkeys ) 609 .println( "vals" ,vals ) 610 .println( "gamenId" ,gamenId ) 611 .println( "useRedirect" ,useRedirect ) 612 .println( "target" ,target ) 613 .println( "filename" ,filename ) 614 .println( "disposition" ,disposition ) 615 .println( "noTransition" ,noTransition ) 616 .println( "useAjaxSubmit" ,useAjaxSubmit ) 617 .println( "redirectEncode" ,redirectEncode ) 618 .println( "Other..." ,getAttributes().getAttribute() ) 619 .fixForm().toString() ; 620 } 621}