2009-05-16 8 views
4

変数のリストをStruts2 URLタグに追加したいとします。セッションのオブジェクトにパラメータのマップ(名前の値のペア)があります。私はこれに良いアプローチを見つけるのに苦労しています。関連するJSPコードを次に示します。マップからURLタグにパラメータを追加する

<s:iterator value="%{#session['com.strutsschool.interceptors.breadcrumbs']}" status="status"> 
    <s:if test="#status.index > 0"> 
     &#187; 
    </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> 

パラメータ変数は、パラメータを含むMapです。これはもちろん動作しませんが、私は現時点でこれにアプローチする方法が見えません。私は今、このためにカスタムfreemarkerテンプレートが必要かもしれないと思っています。誰かがより良い方法を提案できますか?

答えて

2

パラメータタグは、その直前の祖先にのみパラメータを設定します。パラメータタグの回りのイテレータタグのラッピングは効果がありません。 :) これを解決するには、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; 
     } 
    } 
} 

は、そして、あなたは、あなたが必要な行動をachiveためにあなたのJSPでこのカスタマイズされたタグを使用する方法を示してください3コメントを参照して、対応する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> 
4

たぶん、あなたは私がOGNLのなどでELを混合するいくつかのためらいがある知っているが、これは動作します。この

<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> 

ようにJSTLタグを使用することができます...

+0

+1、短く簡潔なスニペットと、ELとOGNLが時々適合しない方法についての適切なコメント。いずれにせよ、私はそれに問題は見られません。 – jjmontes

2

あなたは

を使用してマップを反復することができます
<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の親コンポーネントとして使用します。

反復可能-paramは親がある場合にはPARAMの祖父母を返すカスタムコンポーネントで同様の

<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> 

になり、カスタムタグでこれを行う方法についてAdding arbitrary parameters to a URL in Struts2をチェックイテレータ。

0

を必要としています。

また、コメント1に記載されているソリューションを使用するには、tldファイルで行う必要があるエントリは何ですか?

私にこれをお知らせください。

関連する問題