URLタグにマップからパラメータを追加します
質問
私はStruts2のURLタグにパラメータの変数リストを追加したいです。私はセッションでのオブジェクトのパラメータ(名前と値のペア)のマップを持っています。私はこれまで良い方法を見つけるのに苦労しています。ここでは、関連するJSPコードは次のとおりです。
<s:iterator value="%{#session['com.strutsschool.interceptors.breadcrumbs']}" status="status">
<s:if test="#status.index > 0">
»
</s:if>
<s:url id="uri" action="%{action}" namespace="%{nameSpace}">
<s:param name="parameters" value="%{parameters}"/>
</s:url>
<nobr><s:a href="%{uri}"><s:property value="displayName"/></s:a></nobr>
</s:iterator>
パラメータの変数はのparamsを含むマップです。これは、もちろん動作しませんが、私は現時点でこれをアプローチする方法を見ることはできません。私は、このためのカスタムFreeMarkerのテンプレートが必要な場合があります現時点では考えています。誰もがより良い方法を提案することはできますか?
解決
パラメータタグはその直接の前任者にパラメータを移入します。パラメータタグの周りのイテレータタグは効果がありません包装。 :) これを解決するには、簡単に代替パラメータタグウィッヒはdirecltyマップを使用することができます書くことができます タグは次のようになります。
package my.taglibs;
import java.io.Writer;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.struts2.components.Component;
import org.apache.struts2.views.jsp.ComponentTagSupport;
import com.opensymphony.xwork2.util.ValueStack;
public class ParamTag extends ComponentTagSupport {
private String map;
private static final long serialVersionUID = 2522878390854066408L;
Log log = LogFactory.getLog(ParamTag.class);
@Override
public Component getBean(ValueStack stack, HttpServletRequest req, HttpServletResponse res) {
return new Param(stack);
}
@Override
protected void populateParams() {
super.populateParams();
Param param = (Param) component;
param.setMap(map);
}
public void setMap(String map) {
this.map = map;
}
public class Param extends Component {
private String map;
public Param(ValueStack stack) {
super(stack);
}
@Override
public boolean end(Writer writer, String body) {
Component component = findAncestor(Component.class);
if (this.map == null) {
log.warn("Attribute map is mandatory.");
return super.end(writer, "");
}
Object o = findValue(this.map); //find map in vs
if(o == null) {
log.warn("map not found in ValueStack");
return super.end(writer, "");
}
if(!(o instanceof Map)) {
log.warn("Error in JSP. Attribute map must evaluate to java.util.Map. Found type: " + o.getClass().getName());
return super.end(writer, "");
}
component.addAllParameters((Map) o);
return super.end(writer, "");
}
public void setMap(String map) {
this.map = map;
}
}
}
そして、あなたは、対応するTLD-エントリを必要とする
<tag>
<description><![CDATA[Parametrize other tags]]></description>
<name>param</name>
<tag-class>my.taglibs.ParamTag</tag-class>
<body-content>JSP</body-content>
<attribute>
<name>map</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
<dynamic-attributes>false</dynamic-attributes>
</tag>
他のヒント
たぶん、あなたはこのようなJSTLタグを使用することができます。
<c:url var="uri" value="${namespace}/${action}.action">
<c:forEach items="${parameters}" var="p">
<c:param name="${p.key}" value="${p.value}"/>
</c:forEach>
</c:url>
<a href="${uri}">Your Link</a>
...私はOGNLのなどでELを混合するいくつかのためらいがある知っているが、これは動作します
あなたが使用してマップを反復することができます。
<s:url var="url" action="%{link}" >
<s:iterator value="parameters.keySet()" var="key">
<s:param name="%{key}" value="%{parameters.get(#key)}"/>
</s:iterator>
</s:url>
しかし、それはPARAMの親コンポーネントのよう反復子がパラメータを消費します。
チェック行う方法についてStruts2のの中にURLに任意のパラメータを追加します類似し、その結果、このカスタムとタグ
<s:url var="url" action="%{link}" >
<s:iterator value="parameters.keySet()" var="key">
<ob:iterable-param name="%{key}" value="%{parameters.get(#key)}"/>
</s:iterator>
</s:url>
反復可能-paramが親がイテレータである場合にPARAMの祖父母を返すカスタムコンポーネントである。
3コメントを参照して、必要な行動をachiveためにあなたのJSPでこのカスタマイズされたタグを使用する方法を示してくださいます。
また、コメント1で述べたソリューションを使用して、我々はTLDファイルで行う必要があるエントリは何ですか?
私はこのことを知らせてくださいます。