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