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 org.opengion.hayabusa.db.DBTableModel;
021 import org.opengion.fukurou.util.ErrorMessage;
022 import org.opengion.fukurou.util.XHTMLTag;
023 import org.opengion.fukurou.util.StringUtil;
024
025 import static org.opengion.fukurou.util.StringUtil.nval ;
026
027 import javax.servlet.http.HttpServletRequest;
028 import javax.servlet.http.HttpServletResponse;
029 import javax.servlet.http.HttpSession;
030 import javax.servlet.ServletException;
031 import java.io.IOException;
032 import java.io.ObjectInputStream;
033 import java.io.ObjectOutputStream;
034 import java.util.Enumeration;
035 import java.util.Map;
036 import java.util.HashMap;
037
038 /**
039 * submitタグを用ã�?�¦ペã?ジ転送するタグでã�?forward.jsp で使用)ã€?
040 *
041 * 通常、forward は、ã?ージå†?»¢é€?サーバã?å†?ƒ¨での転é€?のため、別画面への遷移には
042 * 使用できません。これã?、別画面では、index.jsp 等でフレーãƒ??割する際ã?基準フォルãƒ??ã€?
043 * forward の場合ã?クライアントã?ç�?§£してã�?�ªã�?�Ÿめã?もうä¸?º¦先ã?フォルãƒ?�«対する
044 * フレーãƒ??割を行おã�?�¨するためですã?
045 * (よく、index.jsp の frame タグに、src="../XXXX/query.jsp" などと、è?åˆ??身のフォルãƒ?��ã‚?
046 * 記述したペã?ジを見かけますが、これã?、フォルãƒ?‚’またがる転送に、forward を使用する
047 * 為の悪ã�?¯¾策ですã?)
048 * 実際は、forward ではなくã?redirect を使ã�?�¹きですã?redirect は、指定ã?アドレス要求をã€?
049 * ä¸?—¦クライアントに投げてそこから再度要求しなおしてもらã�?–¹式ã?ため、このようにフォルãƒ?‚’
050 * またがる転送も正常に処ç�?�§きますã?
051 * こã?、commonForward タグでは、画面遷移の条件に応じて、forward ã�?redirect の自å‹?
052 * 判定を行いã€?�©åˆ?�«処ç�?�—てã�?�¾すã?
053 * 判定条件は、拡張子やã€?�¸択件数などを加味して以下ã?判定をé ?¬¡ãƒ?‚¹トしますã?
054 *
055 * FORWARD :
056 * アドレスがã? null(自åˆ??身) かã?.jsp を含みã€?/" がå?ってã�?�ªã�??å�?
057 * REDIRECT:
058 * アドレスがã?.jsp を含まなã�?�‹ã€?
059 * それ以å¤?.jsp を含みã€?/" も含ã‚?でã€?�¸択数が1件のみの場å�?
060 * もしくã?useRedirectCheck="false"の場å�?
061 * COUNT_0 :
062 * それ以外でã€?�¸択数が0件の場å�?
063 * COUNT_N :
064 * それ以外でã€?�¸択数が1件以上ã?場合ã?またã?、その他ã?
065 *
066 * ここで、COUNT_0 の場合ã?、未選択エラー、COUNT_N は、è¤?•°選択エラーをè?動的に返しますã?
067 *
068 * @og.formSample
069 * ●形式ï¼?lt;og:commonForward />
070 * ●body?šなã�?
071 *
072 * ●Tag定義??
073 * <og:commonForward
074 * dbkeys 【TAG】DBキーをCSV 形式でセãƒ?ƒˆしまã�?
075 * tableId 【TAGã€?通常使ã�?�¾せん)sessionからæ‰?¾—すã‚?DBTableModelオブジェクトã? ID
076 * debug 【TAG】デバッグæƒ??をå?力するかどã�?�‹[true/false]を指定しまã�?初期値:false)
077 * useRedirectCheck 【TAG】非選択状態ã?場合にforwardを許可するかどã�?�‹[true/false]を指定しまã�?初期値:true)
078 * />
079 *
080 * ●使用ä¾?
081 * フォワードキャãƒ?‚·ュによりペã?ジ転送しますã?
082 * <og:commonForward dbkeys="{@dbkeys}" />
083 *
084 * @og.group 画面制御
085 *
086 * @version 4.0
087 * @author Masaharu Endo
088 * @since JDK5.0,
089 */
090 public class CommonForwardTag extends CommonTagSupport {
091 //* こã?プログラãƒ??VERSIONæ–?—å?を設定しますã? {@value} */
092 private static final String VERSION = "5.3.6.0 (2011/06/01)" ;
093
094 private static final long serialVersionUID = 536020110601L ; // 5.3.6.0 (2011/06/01)
095
096 // 3.5.5.3 (2004/04/09) 共通アドレスでæŒ?®šすることで、クライアントキャãƒ?‚·ュを有効利用するã€?
097 private static final String DUMMY_HTML = "/" + HybsSystem.getContextName() + "/jsp/common/dummy.html";
098
099 // 3.8.5.1 (2006/04/28) dbkeys ã�?null の場合に全件取得するかどã�?�‹ã‚?COMMON_FORWARD_DBKEYS_NULL_ALL でæŒ?®šしますã?
100
101 private static final int FORWARD = 0;
102 private static final int REDIRECT = 1;
103 private static final int COUNT_0 = 2;
104 private static final int COUNT_N = 3;
105
106 // 3.5.5.2 (2004/04/02) 選択行がã€?¼‘行ã?みかã?そうでなã�?�‹
107 private int rowCount = -1;
108
109 // 3.5.5.2 (2004/04/02) 選択行ã? DBTableModel ãƒ??タを引数に使用するかどã�?�‹ã€?
110 // private boolean useTableData = HybsSystem.sysBool( "COMMON_FORWARD_USE_TABLE_DATA" );
111 // private String tableId = HybsSystem.TBL_MDL_KEY;
112 private int rowNo = -1;
113
114 // 3.5.5.5 (2004/04/23) URLに連結するDBTableModelのカラãƒ?‚’CSV形式でæŒ?®šしますã?
115 private String dbkeys = null;
116
117 // 3.5.5.8 (2004/05/20) submitタグの keys,vals を扱ã�?仮想リクエスãƒ?ap
118 // private String useTableTemp = null;
119 private String tableIdTemp = null;
120 private String dbkeysTemp = null;
121 private transient Map<String,String> submitRequestMap = new HashMap<String,String>(); // 3.5.6.2 (2004/07/05)
122 private transient Map<String,String> submitTableMap = new HashMap<String,String>(); // 3.8.5.1 (2006/04/28)
123
124 // 4.0.0.0 (2007/11/09) 非選択状態でのforwardのための属æ?追åŠ?
125 private boolean isRedirectCheck = true;
126
127 /**
128 * Taglibの終äº?‚¿グが見つかったときに処ç�?�™ã‚?doEndTag() ã‚?オーバã?ライドしますã?
129 *
130 * @og.rev 3.3.1.1 (2003/07/03) ?µ?²?¬にリクエスト情報をU?²?¬エンコードして追åŠ?�—ますã?
131 * @og.rev 3.5.5.2 (2004/04/02) フォルãƒ?¤–転送時はã€?¼‘行以外選択ã?、エラーとしますã?
132 * @og.rev 3.5.5.3 (2004/04/09) ãƒ?ƒ�ãƒ?‚°時ã?、転送しなã�?‚ˆã�?�«しますã?
133 * @og.rev 3.8.0.4 (2005/08/08) requestUrlEncode å»?¢
134 * @og.rev 3.8.0.8 (2005/10/03) dbkeys ã�?null の場合に全件取得してã�?�Ÿ処ç�?‚’復活しますã?
135 * @og.rev 4.0.0.0 (2007/11/09) 非選択状態からã?遷移を許可するフラグを追åŠ?11/12に振りå?けå?ç�?‚’selectResponseMethodに移å‹?
136 * @og.rev 5.0.0.2 (2009/09/15) XSS対応â�çチェãƒ?‚¯する
137 * @og.rev 5.3.6.0 (2011/06/01) エラーメãƒ?‚»ージ変更(URLの振りå?けå?ç�?™‚に...のメãƒ?‚»ージは出力しなã�?
138 *
139 * @return 後続å?ç�??æŒ?¤º
140 */
141 @Override
142 public int doEndTag() {
143 debugPrint(); // 4.0.0 (2005/02/28)
144
145 // useXssCheck( false ); // 5.0.0.2 (2009/09/15)
146
147 HttpServletRequest request = ((HttpServletRequest)getRequest());
148 HttpSession session = pageContext.getSession();
149 String page = getForwardURI( request, session );
150
151 // 3.5.5.8 (2004/05/20) å†?ƒ¨仮想リクエスãƒ?ap より値を取å¾?
152 // useTableData = nval( getSubmitRequestParameter( useTableTemp ),useTableData );
153 // tableId = nval( getSubmitRequestParameter( tableIdTemp ),tableId );
154 dbkeys = nval( getSubmitRequestParameter( dbkeysTemp ),dbkeys );
155
156 HttpServletResponse response = (HttpServletResponse)pageContext.getResponse();
157
158 String errMsgKey = null;
159 try {
160 // 3.5.5.2 (2004/04/02) 振りå?け条件を判定するメソãƒ?ƒ‰をé?しますã?
161 // こã?メソãƒ?ƒ‰により、useTableData がå?設定されますã?処ç�??に注æ„?
162 int flag = selectResponseMethod( page );
163
164 // 3.8.0.8 (2005/10/03) dbkeys ã�?null の場合に全件取得してã�?�Ÿ処ç�?‚’復活しますã?
165 // if( rowCount == 1 && useTableData ) {
166 if( rowCount == 1 && dbkeys != null ) {
167 page = XHTMLTag.addUrlEncode( page,getTableUrlData() );
168 }
169
170 String url = response.encodeRedirectURL( page );
171 // 3.8.0.8 (2005/10/03) GET時ã? URL の長さ制限チェãƒ?‚¯(æœ?¤§æ–?—数は 2,083 æ–??
172 if( url != null && url.length() >= HybsSystem.MAX_GET_LENGTH ) {
173 String errMsg = "GET時ã? URL の長さã?,æœ?¤§2,083 æ–?—ですã?"
174 + " URL.length=" + url.length() + " , MAX_LENGTH=" + HybsSystem.MAX_GET_LENGTH ;
175 throw new HybsSystemException( errMsg );
176 }
177
178 switch( flag ) {
179 case FORWARD: if( isDebug() ) { jspPrint( "FORWARD URL = [" + url + "]" ); }
180 else { pageContext.forward( url ); }
181 break;
182 case REDIRECT: // url = requestUrlEncode( url ); // 3.8.0.4 (2005/08/08)
183 if( isDebug() ) { jspPrint( "REDIRECT URL = [" + url + "]" ); }
184 else { response.sendRedirect( url ); }
185 break;
186 case COUNT_0:
187 // if( isDebug() ) {
188 // jspPrint( "RedirectCheck = [" + isRedirectCheck + "]" );
189 // jspPrint( "FORWARD URL = [" + url + "]" );
190 // }
191 // if( isRedirectCheck ) { errMsgKey = "ERR0028" ; } // 選択されてã�?�¾せん。もã�?¸?º¦ã€?�¸択しなおして下さã�??
192 // else{ response.sendRedirect( url );} // 4.0.0.0 (2007/11/09) 非選択状態é?移フラグ追åŠ?
193 errMsgKey = "ERR0028" ; // 選択されてã�?�¾せん。もã�?¸?º¦ã€?�¸択しなおして下さã�??
194 break;
195 default: errMsgKey = "ERR0029" ; // è¤?•°選択されました。1件のみ選択しなおして下さã�??
196 break;
197 }
198
199 } catch ( IOException ex ) {
200 // 5.3.6.0 (2011/06/01) エラーメãƒ?‚»ージ表示変更
201 // String errMsg = "URLの振りå?けå?ç�?™‚に IOException が発生しましたã€?" + HybsSystem.CR
202 // + ex.getMessage(); // 5.1.8.0 (2010/07/01) errMsg 修正
203 String errMsg = ex.getMessage(); // 5.1.8.0 (2010/07/01) errMsg 修正
204 throw new HybsSystemException( errMsg,ex ); // 3.5.5.4 (2004/04/15) 引数の並びé ?¤‰更
205 } catch ( ServletException ex ) {
206 // 5.3.6.0 (2011/06/01) エラーメãƒ?‚»ージ表示変更
207 // String errMsg = "URLの振りå?けå?ç�?™‚に ServletException が発生しましたã€?" + HybsSystem.CR
208 // + ex.getMessage(); // 5.1.8.0 (2010/07/01) errMsg 修正
209 String errMsg = ex.getMessage(); // 5.1.8.0 (2010/07/01) errMsg 修正
210 throw new HybsSystemException( errMsg,ex ); // 3.5.5.4 (2004/04/15) 引数の並びé ?¤‰更
211 }
212
213 // 3.5.5.2 (2004/04/02) フォルãƒ?¤–転送時はã€?¼‘行以外選択ã?、エラーとしますã?
214 if( errMsgKey != null ) {
215 ErrorMessage errMsg = new ErrorMessage( "Row Count Error Maximal Error!" );
216 errMsg.addMessage( 0,ErrorMessage.NG,errMsgKey );
217
218 jspPrint( TaglibUtil.makeHTMLErrorTable( errMsg,getResource() ) );
219 }
220
221 return( SKIP_PAGE ); // ペã?ジの残りの処ç�?‚’行わなã�??
222 }
223
224 /**
225 * タグリブオブジェクトをリリースしますã?
226 * キャãƒ?‚·ュされて再利用されるã?で、フィールドã?初期設定を行いますã?
227 *
228 * @og.rev 3.5.5.2 (2004/04/02) 新規追åŠ?rowCount,useTableData)
229 * @og.rev 3.5.5.5 (2004/04/23) URLに連結するDBTableModelのカラãƒ?‚’CSV形式でæŒ?®šしますã?
230 * @og.rev 3.8.5.1 (2006/04/28) URLに連結するDBTableModelのカラãƒ?‚’[カラãƒ?形式でæŒ?®šしますã?
231 *
232 */
233 @Override
234 protected void release2() {
235 super.release2();
236 rowCount = -1;
237 // useTableData = HybsSystem.sysBool( "COMMON_FORWARD_USE_TABLE_DATA" );
238 // tableId = HybsSystem.TBL_MDL_KEY;
239 rowNo = -1;
240 dbkeys = null; // 3.5.5.5 (2004/04/23)
241 submitRequestMap = new HashMap<String,String>(); // 3.5.5.8 (2004/05/20)
242 submitTableMap = new HashMap<String,String>(); // 3.8.5.1 (2006/04/28)
243 // useTableTemp = null; // 3.5.5.8 (2004/05/20)
244 tableIdTemp = null; // 3.5.5.8 (2004/05/20)
245 dbkeysTemp = null; // 3.5.5.8 (2004/05/20)
246 isRedirectCheck = true; // 4.0.0.0 (2007/11/12)
247 }
248
249 /**
250 * フォワードå?URIを取得しますã?
251 *
252 * @og.rev 3.1.2.0 (2003/04/07) ソースコード中の固定å?をã?定義ファイルを使用するように変更するã€?
253 * @og.rev 3.1.4.1 (2003/04/21) request.getQueryString() をaddUrlEncodeしてã�?‚‹ç®?‰€を削除ã€?
254 * @og.rev 3.1.7.0 (2003/05/02) コマンãƒ?RENEW で、forward した場合に、result.jsp に遷移するように修正ã€?
255 * @og.rev 3.1.7.0 (2003/05/02) 画面?©?¤のセãƒ?ƒˆで、è?画面をã?BACK_GAMENID ã€?£›ã?先を、GAMENID にするã€?
256 * @og.rev 3.1.8.0 (2003/05/16) SubmitData クラスを利用するように変更ã€?
257 * @og.rev 3.3.1.1 (2003/07/03) ForwardManager クラスのå»?¢。飛ã?先ã?キャãƒ?‚·ュをå»?¢しますã?
258 * @og.rev 3.5.5.2 (2004/04/02) 選択行ã?件数を設定しておきますã?
259 * @og.rev 3.5.5.3 (2004/04/09) dummy.html ã‚?static final で絶対パスæŒ?®šしますã?
260 * @og.rev 3.5.5.4 (2004/04/15) メソãƒ?ƒ‰å†?�§使用してã�?�ªã�??gamenId,jspID 変数を削除しますã?
261 * @og.rev 3.5.5.5 (2004/04/23) 余計なボタン関連æƒ??を転送しなã�?‚ºに、キーを変更しますã?
262 * @og.rev 3.5.5.5 (2004/04/23) SubmitTag の keys,vals 属æ?でæŒ?®šしたå?のみ、転送しますã?
263 * @og.rev 3.5.5.8 (2004/05/20) SubmitTag の keys,vals 属æ?でæŒ?®šしたå?をã?å†?ƒ¨仮想リクエスãƒ?Mapにセãƒ?ƒˆしますã?
264 * @og.rev 3.7.0.1 (2005/01/31) リクエスト変数に選択された件数を追åŠ?
265 * @og.rev 3.7.0.3 (2005/03/01) æŒ?®šã?行番号まで画面をスクロールさせる機è?を追åŠ??
266 * @og.rev 3.8.0.8 (2005/10/03) BACK_GAMENID があれã? BACK_ROW を追åŠ?�™るã?
267 * @og.rev 3.8.5.1 (2006/04/28) vals="[カラãƒ?��]" とã�?�†引数をå?ç�?�§きる機è?を追åŠ??
268 * @og.rev 5.1.8.0 (2010/07/01) VIEWの場合も、直前ã?JSPに遷移するã€?
269 *
270 * @param request HttpServletRequestオブジェクãƒ?
271 * @param session HttpSessionオブジェクãƒ?
272 *
273 * @return フォワードå?URI
274 */
275 private String getForwardURI( final HttpServletRequest request,
276 final HttpSession session ) {
277
278 // String cmd = request.getParameter( "command" );
279 String[] rows = request.getParameterValues( HybsSystem.ROW_SEL_KEY );
280
281 // 4.0.0 (2007/05/16) query.jsp でè¤?•°command 時ã?処ç�?¿®正
282 String cmd = request.getParameter( "command" );
283 String[] cmds = request.getParameterValues( "command" );
284 if( cmds != null && cmds.length > 1 ) {
285 for( int i=0; i<cmds.length; i++ ) {
286 if( ! "NEW".equals( cmds[i] ) ) {
287 cmd = cmds[i]; break; // NEW でなã�??æœ??のä¸?�¤
288 }
289 }
290 // すべてã�?NEW の場合ã?、単ä½?getParameter) ã�?NEW なのでç´??りでよいã€?
291 }
292
293 // 3.5.5.2 (2004/04/02) 選択行ã?件数
294 if( rows != null ) {
295 rowCount = rows.length;
296 rowNo = Integer.parseInt( rows[0] );
297 }
298 else {
299 rowCount = 0;
300 }
301 // 3.7.0.1 (2005/01/31) リクエスト変数に選択された件数を追åŠ?
302 setRequestAttribute( "ROW_COUNT",String.valueOf( rowCount ) );
303
304 if( cmd == null || cmd.length() == 0 ) { cmd = "INIT"; }
305 // String forwardPage = "result.jsp" ;
306 final String forwardPage;
307
308 String backPage = (String)session.getAttribute( HybsSystem.FORWARD_PAGE_KEY );
309 String command = cmd; // 3.5.5.5 (2004/04/23)
310 int pagePlus = 0;
311
312 // コマンドパラメータにより振åˆ?�‘
313 // 5.1.8.0 (2010/07/01) VIEWの場合も、直前ã?JSPに遷移するã€?
314 // if( "FIRST,PREV,NEXT,LAST".indexOf( cmd ) >= 0 ) {
315 if( "FIRST,PREV,NEXT,LAST,VIEW".indexOf( cmd ) >= 0 ) {
316 forwardPage = backPage;
317 // } else if( "NEW,VIEW,RENEW".indexOf( cmd ) >= 0 ) {
318 } else if( "NEW,RENEW".indexOf( cmd ) >= 0 ) {
319 // 初期値
320 forwardPage = "result.jsp";
321 } else if( "INIT".equals( cmd ) ) {
322 forwardPage = DUMMY_HTML; // 3.5.5.3 (2004/04/09)
323 } else {
324 // 共有オブジェクト検索
325
326 // リンクå…?‚³マンド名取å¾?
327 // 3.5.5.5 (2004/04/23) 余計なボタン関連æƒ??を転送しなã�?‚ºに、キーを変更しますã?
328 command = request.getParameter( HybsSystem.NO_XFER_KEY + cmd + "CMD" );
329
330 // 3.7.0.3 (2005/03/01) æŒ?®šã?行番号まで画面をスクロールさせる機è?を追åŠ??
331 if( rows != null && "ENTRY".equals( command ) ) {
332 setRequestCacheData( "SEL_ROW",String.valueOf( rowNo ) );
333 }
334
335 if( "RESET".equals( command ) ) { // RESET æ™?
336 forwardPage = "result.jsp";
337 }
338 else {
339 // リンク先取å¾?
340 forwardPage = request.getParameter( HybsSystem.NO_XFER_KEY + cmd );
341 // INSERTとCOPYの場合ã?み
342 if( "INSERT".equals( command ) || "COPY".equals( command ) ) {
343 if( rows != null ) { pagePlus = rows.length; }
344 }
345 }
346
347 // // リンク先取å¾?
348 // forwardPage = request.getParameter( HybsSystem.NO_XFER_KEY + cmd );
349 //
350 // // INSERTとCOPYの場合ã?み
351 // if( "INSERT".equals( command ) || "COPY".equals( command ) ) {
352 // if( rows != null ) { pagePlus = rows.length; }
353 // }
354 // else if( "RESET".equals( command ) ) { // RESET æ™?
355 // forwardPage = "result.jsp";
356 // }
357 }
358
359 if( ! forwardPage.equals( backPage ) ) {
360 session.setAttribute( HybsSystem.REVIEW_PAGE_KEY , backPage );
361 }
362 session.setAttribute( HybsSystem.FORWARD_PAGE_KEY, forwardPage );
363
364 // 3.5.5.5 (2004/04/23) SubmitTag の keys,vals 属æ?でæŒ?®šしたå?のみ、転送しますã?
365 StringBuilder strURL = new StringBuilder( HybsSystem.BUFFER_MIDDLE );
366 strURL.append( "&" ).append( "command" ).append( "=" ).append( command );
367 strURL.append( "&" ).append( "pagePlus" ).append( "=" ).append( String.valueOf( pagePlus ) );
368
369 String btnKey = HybsSystem.NO_XFER_KEY + cmd + "KEY_" ;
370 int keylen = btnKey.length() ;
371
372 Enumeration<?> enm = getParameterNames(); // 4.3.3.6 (2008/11/15) Generics警告対å¿?
373
374 while( enm.hasMoreElements() ) {
375 String key = (String)( enm.nextElement() );
376 // 3.5.5.5 (2004/04/23) 余計なæƒ??を転送しなã�?§˜に、キーを選別しますã?
377 if( key != null && key.startsWith( btnKey ) ) {
378 // 3.5.5.8 (2004/05/20) å†?ƒ¨の仮想リクエスãƒ?Map に設定しますã?
379 String kk = key.substring( keylen ) ;
380 String vv = getRequestValue(key) ;
381 // 3.8.5.1 (2006/04/28) vals="[カラãƒ?��]" とã�?�†引数をå?ç�?�§きる機è?を追åŠ??
382 if( vv != null && vv.length() > 2 && vv.charAt(0) == '[' && vv.charAt(vv.length()-1) == ']' ) {
383 submitTableMap.put( kk,vv.substring( 1,vv.length()-1 ));
384 }
385 // else if( "dbkeys".equals( kk ) ) {
386 // submitRequestMap.put( kk,vv );
387 // }
388 else {
389 submitRequestMap.put( kk,vv );
390 strURL.append( "&" );
391 strURL.append( kk ).append( "=" );
392 strURL.append( StringUtil.urlEncode( vv ) );
393 }
394
395 // 3.8.0.8 (2005/10/03) BACK_GAMENID があれã? BACK_ROW を追åŠ?�™るã?
396 if( "BACK_GAMENID".equalsIgnoreCase( kk ) && rowNo >= 0 ) {
397 strURL.append( "&BACK_ROW=" );
398 strURL.append( rowNo );
399 }
400 }
401 }
402
403 return XHTMLTag.addUrlEncode( forwardPage,strURL.toString() );
404 }
405
406 /**
407 * ペã?ジã‚?リãƒ?‚¤レクトかフォワードか選択しますã?
408 * 判定条件は、拡張子やã€?�¸択件数などを加味して以下ã?判定をé ?¬¡ãƒ?‚¹トしますã?
409 *
410 * FORWARD :
411 * アドレスがã? null かã?.jsp を含みã€?/" がå?ってã�?�ªã�??å�?
412 * REDIRECT:
413 * アドレスがã?.jsp を含まなã�?�‹、それ以å¤?.jsp を含みã€?/" も含ã‚?でã€?�¸択数が1件のみの場å�?
414 * COUNT_0 :
415 * それ以外でã€?�¸択数が0件の場å�?
416 * COUNT_N :
417 * それ以外でã€?�¸択数が1件以上ã?場合ã?またã?、その他ã?
418 *
419 * @og.rev 3.5.5.2 (2004/04/02) 新規作æ??šisJspPrefix( String page ) の代用ですã?
420 * @og.rev 4.0.0.0 (2007/05/23) useTableData の書き換えを中止しますã?
421 * @og.rev 4.0.0.0 (2007/11/12) 非選択状態でもリãƒ?‚¤レクト可能なフラグ(isRedirectCheck)を追åŠ?
422 *
423 * @param page 判定する転送å?アドレス
424 *
425 * @return FORWARD,REDIRECT,COUNT_0,COUNT_N のã�?�¡、どれか
426 */
427 private int selectResponseMethod( final String page ) {
428 if( page == null ) { return FORWARD; }
429
430 int adrs = page.indexOf( ".jsp" );
431
432 if( adrs >= 0 && page.lastIndexOf( '/',adrs ) < 0 ) {
433 // useTableData = false; // 現時点での forward では、使用できませんã€?
434 return FORWARD;
435 }
436 // else if( adrs < 0 || !useTableData ) {
437 // else if( adrs < 0 ) {
438 else if( adrs < 0 || !isRedirectCheck ) { // 4.0.0.0 (2007/11/12) 非選択リãƒ?‚¤レクト許可フラグ追åŠ?
439 // useTableData = false; // jsp 以外では、使用できませんã€?
440 return REDIRECT;
441 }
442 else if( rowCount == 1 ) {
443 return REDIRECT;
444 }
445 else if( rowCount == 0 ) {
446 return COUNT_0;
447 }
448 else {
449 return COUNT_N;
450 }
451 }
452
453 /**
454 * 【TAG】選択行データをã?URL 引数に追åŠ?�™ã‚?true)かどã�?�‹を指定しまã�?初期値:false)ã€?
455 *
456 * @og.tag
457 * 選択された DBTableModel の 行データをそのまま、URL の 引数に追åŠ?�—て
458 * 転送するかどã�?�‹を指定できるフラグ、useTableData 属æ?を追åŠ?�—ますã?
459 * 初期値は、false (互換性の為)ですã?
460 * なおã?SubmitTag(サブミãƒ?ƒˆボタンタグ)で、gamenIdが指定された場合ã?
461 * つまりã?他ã?フォルãƒ?�«リクエストされた場合ã?み、有効になりますã?
462 * 自åˆ??身のフォルãƒ??では、forward が使用されるためã?使えませんã€?
463 *
464 * @og.rev 3.5.5.2 (2004/04/02) 新規追åŠ?
465 * @og.rev 3.5.5.8 (2004/05/20) å†?ƒ¨仮想リクエスãƒ?Map を参照できるようにするã€?
466 *
467 * @param flag 選択行データを使用する(true)/しなã�?false)
468 */
469 // public void setUseTableData( final String flag ) {
470 // useTableTemp = nval( getRequestParameter( flag ),useTableTemp );
471 // }
472
473 /**
474 * 【TAGã€?通常使ã�?�¾せん)sessionからæ‰?¾—すã‚?DBTableModelオブジェクトã? ID
475 * (初期値:HybsSystem#TBL_MDL_KEY[={@og.value org.opengion.hayabusa.common.HybsSystem#TBL_MDL_KEY}])ã€?
476 *
477 * @og.tag
478 * 表示処ç�?¾Œに??å†?ƒ¨ポインタを書き換えた)DBTableModelオブジェクトを
479 * 同じキーで、sessionに登録しますã?
480 * (初期値:HybsSystem#TBL_MDL_KEY[={@og.value org.opengion.hayabusa.common.HybsSystem#TBL_MDL_KEY}])ã€?
481 *
482 * @og.rev 3.5.5.2 (2004/04/02) 新規追åŠ?
483 * @og.rev 3.5.5.8 (2004/05/20) å†?ƒ¨仮想リクエスãƒ?Map を参照できるようにするã€?
484 *
485 * @param id sessionからæ‰?¾—する時の ID
486 */
487 public void setTableId( final String id ) {
488 // 注æ„?引数のリクエスト変数が無ければ、è?åˆ??身({@XXX}形å¼?をå?セãƒ?ƒˆするã€?
489 tableIdTemp = nval( getRequestParameter( id ),id );
490 }
491
492 /**
493 * æŒ?®šã?スコープã?å†?ƒ¨キャãƒ?‚·ュæƒ??に、DBTableModel の選択された値を登録しますã?
494 *
495 * è¤?•°選択行が存在する場合ã?、å?頭行を処ç�?�—ますã?ただしã?action="APPEND"の
496 * 場合ã?、separator属æ?でæŒ?®šされたæ–?—を使用してã€??結しますã?
497 *
498 * @og.rev 3.5.5.2 (2004/04/02) 新規作æ?
499 * @og.rev 3.5.5.5 (2004/04/23) URLに連結するDBTableModelのカラãƒ?‚’CSV形式でæŒ?®šしますã?
500 * @og.rev 3.8.0.4 (2005/08/08) dbkeys ã�?null の場合に全件取得してã�?�Ÿ処ç�?‚’中止しますã?
501 * @og.rev 3.8.0.8 (2005/10/03) dbkeys ã�?null の場合に全件取得してã�?�Ÿ処ç�?‚’復活しますã?
502 * @og.rev 3.8.5.1 (2006/04/28) vals="[カラãƒ?��]" とã�?�†引数をå?ç�?�§きる機è?を追åŠ??
503 * @og.rev 3.8.5.1 (2006/04/28) dbkeys ã�?null の場合に全件取得するかどã�?�‹ã‚?COMMON_FORWARD_DBKEYS_NULL_ALL でæŒ?®šしますã?
504 * @og.rev 4.0.0.0 (2007/05/23) tableId をこのメソãƒ?ƒ‰å†?�§求めますã?
505 *
506 * @return DBTableModelの選択された値のæ–?—å?
507 */
508 private String getTableUrlData() {
509 String tableId = nval( getSubmitRequestParameter( tableIdTemp ),HybsSystem.TBL_MDL_KEY );
510
511 DBTableModel table = (DBTableModel)getSessionAttribute( tableId );
512
513 String dbkeysUrl = "";
514 String tblkeysUrl = "";
515
516 if( table != null ) {
517 String[] keys = null;
518 String[] vals = null;
519 if( dbkeys != null ) {
520 keys = StringUtil.csv2Array( dbkeys );
521 vals = new String[keys.length];
522 for( int i=0; i<keys.length; i++ ) {
523 int clmNo = table.getColumnNo( keys[i] );
524 vals[i] = table.getValue(rowNo,clmNo);
525 }
526 }
527
528 dbkeysUrl = XHTMLTag.urlEncode( keys, vals );
529
530 // 3.8.5.1 (2006/04/28) vals="[カラãƒ?��]" とã�?�†引数をå?ç�?�§きる機è?を追åŠ??
531 int size = submitTableMap.size();
532 if( size > 0 ) {
533 @SuppressWarnings("rawtypes")
534 Map.Entry[] entry = submitTableMap.entrySet().toArray( new Map.Entry[size] );
535
536 String[] tblkeys = new String[size];
537 String[] tblvals = new String[size];
538
539 for( int i=0; i<size; i++ ) {
540 tblkeys[i] = (String)entry[i].getKey();
541 String temp = (String)entry[i].getValue();
542 int clmNo = table.getColumnNo( temp );
543 tblvals[i] = table.getValue( rowNo,clmNo );
544 }
545 tblkeysUrl = XHTMLTag.urlEncode( tblkeys, tblvals );
546 }
547 }
548
549 String rtn = dbkeysUrl;
550
551 if( tblkeysUrl.length() > 0 ) {
552 if( rtn.length() > 0 ) {
553 rtn += "&" + tblkeysUrl;
554 }
555 else {
556 rtn = tblkeysUrl ;
557 }
558 }
559 return rtn ;
560 }
561
562 /**
563 * 【TAG】DBキーをCSV 形式でセãƒ?ƒˆしますã?
564 *
565 * @og.tag
566 * URI の引数にセãƒ?ƒˆするキーã‚?CSV 形式でセãƒ?ƒˆしますã?
567 * ここのæŒ?®šã?,DBTableModel 上ã?ãƒ??タを取り込みますã?
568 *
569 * @og.rev 3.5.5.5 (2004/04/23) URLに連結するDBTableModelのカラãƒ?‚’CSV形式でæŒ?®šしますã?
570 * @og.rev 3.5.5.8 (2004/05/20) å†?ƒ¨仮想リクエスãƒ?Map を参照できるようにするã€?
571 *
572 * @param key DBキー(CSV 形å¼?
573 */
574 public void setDbkeys( final String key ) {
575 // 注æ„?引数のリクエスト変数が無ければ、è?åˆ??身({@XXX}形å¼?をå?セãƒ?ƒˆするã€?
576 dbkeysTemp = nval( getRequestParameter( key ),key ) ;
577 }
578
579 /**
580 * å†?ƒ¨の仮想リクエスãƒ?Map より、リクエストパラメータより値を設定しますã?
581 *
582 * submitタグの keys,vals より送信されたリクエストå?は、このクラスで
583 * 処ç�?�•れã?å†?ƒ¨の仮想リクエスãƒ?Map に保存されますã?
584 * 通常のリクエスト設定時点では、この値は取り出すことがå?来なã�?‚ºã€?
585 * Map に保å?getForwardURI 処ç�?�§設å®?された後に、引き出しますã?
586 *
587 * @og.rev 3.5.5.8 (2004/05/20) 新規作æ?
588 *
589 * @param key DBキー(CSV 形å¼?
590 *
591 * @return 仮想リクエスãƒ?Map を反æ˜?�•せた、リクエストå?
592 */
593 private String getSubmitRequestParameter( final String key ) {
594 String rtn = key;
595
596 // 変数ã�?"{@XXXX}" の場合ã?み対å¿?
597 if( key != null && key.startsWith( "{@" ) && key.charAt(key.length()-1) == '}' ) {
598 rtn = submitRequestMap.get( key.substring( 2,key.length()-1 ) );
599 }
600
601 return rtn;
602 }
603
604 /**
605 * 【TAG】非選択状態ã?場合にforwardを許可するかどã�?�‹[true/false]を指定しまã�?初期値:true)ã€?
606 *
607 * @og.tag
608 * 初期値はtrueが設定されてã�?�¾ã�?
609 * falseにすると許可されまã�?
610 *
611 * @og.rev 4.0.0.0 (2007/11/09) 新規作æ?
612 *
613 * @param flag 非選択状態ã?forwardを許可 [true:不許可/false:許可]
614 */
615 public void setUseRedirectCheck(final String flag) {
616 isRedirectCheck = nval( getRequestParameter( flag ),isRedirectCheck );
617 }
618
619 // private boolean isUseRedirectCheck() {
620 // return isRedirectCheck;
621 // }
622
623 /**
624 * シリアライズ用のカスタãƒ?‚·リアライズ書き込みメソãƒ?ƒ‰
625 *
626 * @og.rev 4.3.1.1 (2008/08/23) 新規追åŠ?
627 * @serialData ä¸?ƒ¨のオブジェクトã?、シリアライズされませんã€?
628 *
629 * @param strm ObjectOutputStreamオブジェクãƒ?
630 * @throws IOException シリアライズに関する入出力エラーが発生したå?å�?
631 */
632 private void writeObject( final ObjectOutputStream strm ) throws IOException {
633 strm.defaultWriteObject();
634 }
635
636 /**
637 * シリアライズ用のカスタãƒ?‚·リアライズ読み込みメソãƒ?ƒ‰
638 *
639 * ここでは、transient 宣è¨?�•れたå†?ƒ¨変数のå†??初期化がå¿?¦�なフィールドã?み設定しますã?
640 *
641 * @og.rev 4.3.1.1 (2008/08/23) 新規追åŠ?
642 * @serialData ä¸?ƒ¨のオブジェクトã?、シリアライズされませんã€?
643 *
644 * @param strm ObjectInputStreamオブジェクãƒ?
645 * @see #release2()
646 * @throws IOException シリアライズに関する入出力エラーが発生したå?å�?
647 * @throws ClassNotFoundException クラスを見つけることができなかったå?å�?
648 */
649 private void readObject( final ObjectInputStream strm ) throws IOException , ClassNotFoundException {
650 strm.defaultReadObject();
651 submitRequestMap = new HashMap<String,String>();
652 submitTableMap = new HashMap<String,String>();
653 }
654
655 /**
656 * こã?オブジェクトã?æ–?—å?表現を返しますã?
657 * 基本çš?�«ãƒ?ƒ�ãƒ?‚°目çš?�«使用しますã?
658 *
659 * @return こã?クラスのæ–?—å?表現
660 */
661 @Override
662 public String toString() {
663 return org.opengion.fukurou.util.ToString.title( this.getClass().getName() )
664 .println( "VERSION" ,VERSION )
665 .println( "rowCount" ,rowCount )
666 // .println( "useTableData" ,useTableData )
667 // .println( "tableId" ,tableId )
668 .println( "rowNo" ,rowNo )
669 .println( "dbkeys" ,dbkeys )
670 // .println( "useTableTemp" ,useTableTemp )
671 .println( "tableIdTemp" ,tableIdTemp )
672 .println( "dbkeysTemp" ,dbkeysTemp )
673 .println( "Other..." ,getAttributes().getAttribute() )
674 .fixForm().toString() ;
675 }
676 }