tiles:putの値をELで取得するには

<tiles:put name="key" value="hoge" />で渡した値は
<tiles:getAsString name="hoge" />で取得しますが
属性の値をさらに他のタグに渡したい場合渡せなくて困ります。
例えば <html:select property="ここに渡されたhogeを設定したい">

苦し紛れにこんなことをやってもコンパイルエラーになります。
<html:select property="<tiles:getAsString name="key" />">

では<html:select property="${key}">とできるようにするにはどうするか?
とりあえずできたので書いておきます。


web.xmlにinclude-preludeを設定。
<jsp-config>
<jsp-property-group>
<url-pattern>/templates/*</url-pattern>
<el-ignored>false</el-ignored>
<page-encoding>Windows-31J</page-encoding>
<scripting-invalid>false</scripting-invalid>
<include-prelude>/SetRequestPutAttribute.jsp</include-prelude>
</jsp-property-group>
</jsp-config>


SetRequestPutAttribute.jspに<tiles:put>で渡された値をrequestスコープに格納する処理を書く
<%@page import="org.apache.struts.taglib.tiles.ComponentConstants"%>
<%@page import="org.apache.struts.tiles.ComponentContext"%>
<%@page import="java.util.Iterator"%>
<%
ComponentContext compContext = (ComponentContext) pageContext
.getAttribute(ComponentConstants.COMPONENT_CONTEXT,
PageContext.REQUEST_SCOPE);

Iterator ite = compContext.getAttributeNames();
while (ite.hasNext()) {
String key = (String) ite.next();
request.setAttribute(key, compContext.getAttribute(key));
}
%>

ここからサンプル実装

tiles-defs.xml
<definition name="TestTemplate" path="/templates/TestTemplate.jsp" />


TestTemplate.jspの呼び元JSP
<tiles:insert definition="TestTemplate">
<tiles:put name="key" value="hoge" />
</tiles:insert>


TestTemplate.jsp
keyで渡された値は ${key} です。
<html:select property="${key}"></html:select>

これで実行結果は
keyで渡された値は hoge です。
<select name="hoge"></select>
と出ます。本来ならとしなければいけないので楽ちんです。

テンプレート側は特別な記述なくしてtiles:putで渡された値をrequestスコープから取得できるということです。

ちなみに技術的にはこうするんだよというだけで、やりたい事を実現するなら違うアプローチの方が良いと思います。上記の例ならカスタムタグでやるのが一番スマートかと。それをやらない明確な理由が今回はあったのでまぁ良いとしよう。