XWorkのValueStack経由でSeasar2のコンポーネントを取得したり、コンポーネントのプロパティに値を設定する仕組みを考え中。
インターフェースはMapにして、指定された名前のコンポーネントがある場合はそれを返して、無い場合はnullを返すようにする。
こうするとJSFのBacking Beanっぽく使えそうな感じ。
ModelDrivenは嫌いじゃないんだけど、どうもわかりにくいらしいので。
S2ComponentMap
Mapはこんな感じ。containsKeyとgetだけ実装してます。
public class S2ComponentMap implements Map { private S2Container container; public S2ComponentMap(S2Container container) { this.container = container; } public int size() { return 0; } public void clear() { } public boolean isEmpty() { return false; } public boolean containsKey(Object key) { return container.hasComponentDef(key); } public boolean containsValue(Object value) { return false; } public Collection values() { return null; } public void putAll(Map arg0) { } public Set entrySet() { return null; } public Set keySet() { return null; } public Object get(Object key) { return container.getComponent(key); } public Object remove(Object arg0) { return null; } public Object put(Object key, Object value) { return null; } }
S2ComponentInterceptor
Interceptorはこんな感じ。
一応控えめにValueStackの一番後ろに入れます。S2ContainerはS2XWork連携してれば、S2の方で入れてくれる。
public class S2ComponentInterceptor extends AroundInterceptor { private S2Container container; protected void after(ActionInvocation arg0, String arg1) throws Exception { } protected void before(ActionInvocation arg0) throws Exception { Map map = new S2ComponentMap(container); ActionContext.getContext().getValueStack().getRoot().add(map); } public void setContainer(S2Container container) { this.container = container; } }