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 */ 016 package org.opengion.hayabusa.taglib; 017 018 import org.opengion.hayabusa.common.HybsSystem; 019 import org.opengion.hayabusa.common.HybsSystemException; 020 import static org.opengion.fukurou.util.StringUtil.nval ; 021 022 import javax.servlet.http.HttpServletResponse ; 023 import java.io.IOException; 024 025 /** 026 * レスポンスヘッ????をセ?するタグです? 027 * 028 * レスポンスヘッ??には、キャ?ュコントロール?フレ?ュ(ペ?ジ自動転?などを行う 029 * ヘッ????をセ?することで、HTML の振る??制御することができます? 030 * 031 * @og.formSample 032 * ●形式?lt;og:responseHeader cacheKey="[???]" /> 033 * ●body?な? 034 * 035 * ●Tag定義?? 036 * <og:responseHeader 037 * cacheControl 【TAG】レスポンスヘッ?に、Cache-Control の値を設定しま?初期値:"max-age=0") 038 * contentType 【TAG】レスポンスヘッ?に、content-Type の値を設定しま? 039 * refresh 【TAG】レスポンスヘッ?に、refresh の値を設定しま? 040 * refreshURL 【TAG】レスポンスヘッ?に、refresh の値を設定するときに、指定?URLをロードしま? 041 * redirect 【TAG】指定されたURLへ??リ?レクトレスポンスを?信しま? 042 * status 【TAG】ス??タスコードを設定しま? 043 * location 【TAG】レスポンスヘッ?に、location の値を設定しま? 044 * debug 【TAG】デバッグ??を?力するかど?[true/false]を指定しま?初期値:false) 045 * /> 046 * 047 * ●使用? 048 * 049 * @og.rev 3.1.3.0 (2003/04/10) ResponseHeaderTag ?新規作?しました? 050 * @og.group 画面制御 051 * 052 * @version 4.0 053 * @author Kazuhiko Hasegawa 054 * @since JDK5.0, 055 */ 056 public class ResponseHeaderTag extends CommonTagSupport { 057 //* こ?プログラ??VERSION??を設定します? {@value} */ 058 private static final String VERSION = "4.0.0.0 (2005/08/31)" ; 059 060 private static final long serialVersionUID = 400020050831L ; 061 062 private String pragma = null; 063 private String cacheControl = "max-age=0"; 064 private String contentType = null; 065 private int refresh = -1; 066 private String refreshURL = null; 067 private String redirect = null; 068 private int status = -1; 069 private String location = null; 070 071 /** 072 * Taglibの終?グが見つかったときに処??doEndTag() ?オーバ?ライドします? 073 * 074 * @og.rev 3.1.9.0 (2003/05/16) refresh 属?を設定した?合?、?ージの残りを??な??変更? 075 * 076 * @return 後続???? 077 */ 078 @Override 079 public int doEndTag() { 080 debugPrint(); // 4.0.0 (2005/02/28) 081 int rtn = EVAL_PAGE; // ペ?ジの残りを評価する? 082 083 HttpServletResponse response = (HttpServletResponse)pageContext.getResponse(); 084 085 if( pragma != null ) { 086 response.setHeader( "Pragma",pragma ); 087 } 088 089 if( cacheControl != null ) { 090 response.setHeader( "Cache-Control",cacheControl ); 091 } 092 093 if( contentType != null ) { 094 response.setContentType( contentType ); 095 } 096 097 if( refresh >= 0 ) { 098 if( refreshURL != null ) { 099 StringBuilder ref = new StringBuilder(); 100 ref.append( refresh ); 101 ref.append( "; URL=" ); 102 ref.append( response.encodeRedirectURL( refreshURL ) ); 103 response.setHeader( "Refresh",ref.toString() ); 104 } 105 else { 106 response.setIntHeader( "Refresh",refresh ); 107 } 108 rtn = SKIP_PAGE; // ペ?ジの残りの処?行わな?? 109 } 110 111 if( redirect != null ) { 112 try { 113 response.sendRedirect( response.encodeRedirectURL( redirect ) ); 114 } 115 catch( IOException ex ) { 116 String errMsg = "sendRedirect に失敗しました? + HybsSystem.CR 117 + " URL=" + redirect + HybsSystem.CR 118 + ex.getMessage(); // 5.1.8.0 (2010/07/01) errMsg 修正 119 throw new HybsSystemException( errMsg,ex ); // 3.5.5.4 (2004/04/15) 引数の並び?更 120 } 121 } 122 123 if( status >= 0 ) { 124 response.setStatus( status ); 125 } 126 127 if( location != null ) { 128 response.setHeader( "Location",location ); 129 } 130 131 return rtn ; 132 } 133 134 /** 135 * タグリブオブジェクトをリリースします? 136 * キャ?ュされて再利用される?で、フィールド?初期設定を行います? 137 * 138 */ 139 @Override 140 protected void release2() { 141 super.release2(); 142 pragma = null; 143 cacheControl = "max-age=0"; 144 contentType = null; 145 refresh = -1; 146 refreshURL = null; 147 redirect = null; 148 status = -1; 149 location = null; 150 } 151 152 /** 153 * 【TAG】レスポンスヘッ?に、Cache-Control の値を設定しま?初期値:"max-age=0")? 154 * 155 * @og.tag 156 * こ?ヘッ??、クライアントに対してドキュメントをキャ?ュする場合? 157 * 条件を伝えます?初期値は、max-age=0 に設定して?す? 158 * ?する?は、以下?どれかです? 159 * 160 * public : ドキュメントをキャ?ュして良? 161 * private : ドキュメントが共有されな??ライベ?ト?中なら?キャ?ュして良?? 162 * no-cache : ドキュメントをキャ?ュしては?な?? 163 * no-store : ドキュメント?キャ?ュ???スク上??ファイルも禁止する? 164 * must-revalidate 165 * : クライアント?、ドキュメントをプロキシではなく?本来の 166 * サーバ?に確認する?がある? 167 * proxy-revalidate 168 * : must-revalidate と同じであるが?共有キャ?ュに対してのみ 169 * 適用される? 170 * max-age=xxx : ドキュメントが、xxx秒後に陳腐化する?xpires より優先される? 171 * s-max-age=xxx : 共有キャ?ュは、ドキュメントが、xxx秒後に陳腐化する? 172 * 173 * @og.rev 3.1.5.1 (2003/04/24) 初期値を?"max-age=0" に変更? 174 * @param cc Cache-Control 175 */ 176 public void setCacheControl( final String cc ) { 177 cacheControl = nval( getRequestParameter( cc ),cacheControl ); 178 if( "no-cache".equals( cacheControl ) ) { 179 pragma = "no-cache"; 180 } 181 } 182 183 /** 184 * 【TAG】レスポンスヘッ?に、content-Type の値を設定します? 185 * 186 * @og.tag 187 * こ?ヘッ??、これから返すドキュメント?MIMEタイプを与えます? 188 * MIMEタイプ?詳しい規?は、RFC1521 と、RFC1522 です? 189 * <a href="http://www.isi.edu/in-notes/iana/assignments/media-types/media-types" >?リス?/a> 190 * <a href="http://www.ltsw.se/knbase/internet/mime.htp">未登録タイ?x-タイ?</a> 191 * 192 * @param ct content-Type 193 */ 194 public void setContentType( final String ct ) { 195 contentType = nval( getRequestParameter( ct ),contentType ); 196 } 197 198 /** 199 * 【TAG】レスポンスヘッ?に、refresh の値を設定します? 200 * 201 * @og.tag 202 * こ?ヘッ??、更新された?ージをブラウザが今から何秒後にリクエストすれ?よい? 203 * と?ことを伝えます? 204 * 205 * @param ref 再リクエストさせる秒数 206 */ 207 public void setRefresh( final String ref ) { 208 refresh = nval( getRequestParameter( ref ),refresh ); 209 } 210 211 /** 212 * 【TAG】レスポンスヘッ?に、refresh の値を設定するときに、指定?URLをロードします? 213 * 214 * @og.tag 215 * こ?ヘッ??、refresh と共に使用され、リクエストする?合?URLを指定します? 216 * 217 * @og.rev 3.1.4.0 (2003/04/18) 属?名変更?refreshUrl ?refreshURL) 218 * 219 * @param refurl 再リクエストさせるURL 220 */ 221 public void setRefreshURL( final String refurl ) { 222 refreshURL = nval( getRequestParameter( refurl ),refreshURL ); 223 } 224 225 /** 226 * 【TAG】指定されたURLへ??リ?レクトレスポンスを?信します? 227 * 228 * @og.tag 229 * ?されたリ?レクト?のURLを用??クライアントに?? 230 * リ?レクトレスポンスを?信します? 231 * URLとしては相対URLを指定することができます? 232 * 233 * @og.rev 3.6.0.0 (2004/09/17) \\\\hn51d4 などのネットワーク名への対? 234 * 235 * @param rd リ?レクするURL 236 */ 237 public void setRedirect( final String rd ) { 238 redirect = nval( getRequestParameter( rd ),redirect ); 239 if( redirect != null && redirect.startsWith( "\\\\" ) ) { 240 redirect = "file://" + redirect; 241 } 242 } 243 244 /** 245 * 【TAG】ス??タスコードを設定します? 246 * 247 * @og.tag 248 * ス??タスコードを設定します? 249 * 100 ??199 ?00番台はおしらせ???です? 250 * 200 ??299 ?00番台はリクエストが成功したことを表します? 251 * 300 ??399 ?00番台はファイルが移動したことを表します? 252 * 400 ??499 ?00番台はクライアント?のエラーを表します? 253 * 500 ??599 ?00番台はサーバ?側のエラーを表します? 254 * 255 * @param st status ス??タスコー? 256 */ 257 public void setStatus( final String st ) { 258 status = nval( getRequestParameter( st ),status ); 259 } 260 261 /** 262 * 【TAG】レスポンスヘッ?に、location の値を設定します? 263 * 264 * @og.tag 265 * こ?ヘッ??、ドキュメント?アドレスを?知します? 266 * ?00番台のス??タスコードには、このヘッ??付随する?があります? 267 * 268 * @param lo ドキュメント?アドレス(ロケーション) 269 */ 270 public void setLocation( final String lo ) { 271 location = nval( getRequestParameter( lo ),location ); 272 } 273 274 /** 275 * こ?オブジェクト???表現を返します? 276 * 基本???目?使用します? 277 * 278 * @return こ?クラスの??表現 279 */ 280 @Override 281 public String toString() { 282 return org.opengion.fukurou.util.ToString.title( this.getClass().getName() ) 283 .println( "VERSION" ,VERSION ) 284 .println( "pragma" ,pragma ) 285 .println( "cacheControl",cacheControl ) 286 .println( "contentType" ,contentType ) 287 .println( "refresh" ,refresh ) 288 .println( "refreshURL" ,refreshURL ) 289 .println( "redirect" ,redirect ) 290 .println( "status" ,status ) 291 .println( "location" ,location ) 292 .println( "Other..." ,getAttributes().getAttribute() ) 293 .fixForm().toString() ; 294 } 295 }