سؤال

وأريد أن أضيف قائمة متغير من المعلمات إلى URL العلامة Struts2. لدي خريطة المعلمات (أزواج قيمة اسم) في كائن في الدورة. أنا تكافح للعثور على نهج جيد لذلك. هنا هو رمز JSP ذات الصلة:

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

والمتغير المعلمات هو خريطة الذي يحتوي على بارامس. هذا، بطبيعة الحال لا يعمل ولكن لا استطيع ان ارى وسيلة لهذا النهج في الوقت الراهن. أنا أفكر في هذه اللحظة أنني قد تحتاج قالب freemarker مخصصة لهذا الغرض. يمكن لأي شخص أن يقترح طريقة أفضل؟

هل كانت مفيدة؟

المحلول

العلامة معلمة بملء المعلمات فقط إلى سالف المباشر. لفائف علامة مكرر حول العلامة المعلمة له أي تأثير. :) لحل هذه يمكنك كتابة بسهولة علامة المعلمة البديلة اللي تبونه يمكن استخدام خريطة ديريكلتي العلامة التجارية قد تبدو هذه.

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

وكنت في حاجة الى أدني دخول المقابلة

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

وأعرف أن هناك بعض التردد خلط EL مع OGNL وغيرها ولكن هذا يعمل ...

ويمكنك تكرار على الخريطة باستخدام

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

ولكن سوف تستهلك مكرر المعلمات كما انها عنصر الأم من المعلمة.

إضافة المعلمات التعسفي لURL في Struts2 للحصول على كيفية القيام هذا مع العرف العلامة الذي ينتج مماثلة

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

وiterable-المعلمة هو مكون مخصص وترجع جد من المعلمة في حالة ما إذا كان الأصل هو مكرر.

وبالإشارة إلى التعليق 3، يرجى إظهار كيف يمكن استخدام هذه العلامة مخصصة في التخطيط الاستراتيجي المشترك الخاص بك و لتحقيق السلوك المطلوب.

وأيضا، لاستخدام الحل المذكورة في تعليق 1، ما هو الإدخال الذي يتعين علينا القيام به في ملف أدني؟

واسمحوا لي أن أعرف ذلك.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top