.log(ぽちろぐ)

退屈しているおっさんの日記

Struts2でchainっぽいredirect

     Struts2にはChainが用意されてて、
    アクション→アクション
    をやるとき、パラメータを引き継ぐことが出来る。

    だけども、chainじゃなくてredirectしたいという我が儘へのヘルプ。日本語パラメータをURLに混ぜて送るの巻。

    たとえば
    http://hogeware/index.action?username=ながの
    みたいなリクエストを送りたいこともあるじゃんね。そのときIndexAction.javaの受けはこう書く。
        private String username;
        /**
         * URLエンコード(Win31J)されたユーザ名を、デコードして設定します。
         * @param username ユーザ名
         */
        public void setUsername(String username) {
            try {
                byte[] data = username.getBytes("ISO_8859_1");
                this.username = new String(data, "Windows-31J");
            } catch (UnsupportedEncodingException e) {
    			//TODO なんか適当な処理。
            }
        }
    
     この処理を噛ませることで、private username = "ながの" になります。
     index.actionにリダイレクトさせる、元のアクションではゲッターを用意。
        private String username;
        /**
         * ユーザ名を、Windows-31JでURLエンコードして返します。
         * @return ユーザ名
         */
        public String getUsername() {
            try {
                username = URLEncoder.encode(username , "Windows-31J");
            } catch (UnsupportedEncodingException e) {
    			//TODO なんか適当な処理。
            }
            return username;
        }
    
     struts.xmlはこんな感じで。
    <result name="success" type="redirect">
    	/index.action?username=${username}
    </result>
    
    何をやってるかって言うと、
    1. 元のアクションが、successを返す。
    2. struts2は、index.actionにリダイレクト。
    3. 一緒にパラメータを持って行くために、元のアクションのゲッターを呼ぶ。
    4. ゲッターは、URLエンコードして返す。
    5. Struts2は、IndexAction.javaのセッターを呼ぶ。
    6. セッターは、バイト変換してからStringを生成、セット。
     URLエンコードした文字列を、URLデコードすればいいような気がするけど、文字化けしちゃった。やり方があるのかも知んないけど。
     今回の書き方で出来たんでまあよし。弱点は、httpリクエストの256文字制限。長い文字列は送れないと思う。