どうせだから
一つ俺々機能をSAStrutsにリクエストしてみようかしら。
EntityやDTOなどをhiddenに保存する仕組みが欲しい。もちろんsubmit時はActionにpopulateされる様に。セッション使いたくない(または使えない)ときにセッションに入れるのと同じ感覚でBeanを保存出来る。しかもセッションよりスレッドセーフ。※セキュリティ的には怖い面もあるけど
実装は何でもいいけど、自分はSerialize&Base64 encode(populate時は逆)でやってます。ホントは暗号化もしたいところだがそれは置いといて。
以前StrutsベースだったときはBeanUtilsに独自Converter追加してたんだけど、SAStrutsって多分BeanUtilsつかってないよね。
ソース眺めててtoStringとvalueOfメソッド(static)で双方向変換してくれるのを見つけたので、とりあえず・・
public class B64Utils { public static String b64Encode(Object bean) { if (bean == null) return null; try { ByteArrayOutputStream bout = new ByteArrayOutputStream(2048); ObjectOutputStream oout = new ObjectOutputStream(bout); oout.writeObject(bean); oout.close(); return Base64.encode(bout.toByteArray()); } catch (IOException e) { throw new IllegalStateException(e); } } public static Object b64Decode(String strB64) { if (StringUtils.isBlank(strB64)) return null; try { ObjectInputStream oin = new ObjectInputStream( new ByteArrayInputStream( Base64.decode(strB64))); return oin.readObject(); } catch (IOException e) { throw new IllegalStateException(e); } catch (ClassNotFoundException e) { throw new IllegalStateException(e); } } }
public class Hoge implements Serializable { 〜〜略〜〜 @Override public String toString() { return B64Utils.b64Encode(this); } public static Book valueOf(String str) { return (Book)B64Utils.b64Decode(str); } }
みたいな感じでお茶を濁しているが、toStringメソッドがBase64の文字列返すのはチョットアレだし、Bean毎にメソッド用意するのはもっとアレなので、他にもっと良いextension pointがあれば・・・