맵에서 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>
매개 변수 변수는 매개 변수를 포함하는 맵입니다. 물론 이것은 효과가 없지만 지금은 이것에 접근 할 수있는 방법을 볼 수 없습니다. 나는 지금 이것을 위해 맞춤형 프리 마커 템플릿이 필요할 것이라고 생각하고 있습니다. 누구든지 더 나은 방법을 제안 할 수 있습니까?
해결책
매개 변수 태그는 매개 변수를 직접 전력에만 채 웁니다. 매개 변수 태그 주위에 반복자 태그를 래핑하면 효과가 없습니다. :) 이것을 해결하기 위해 대체 매개 변수 태그를 쉽게 쓸 수 있습니다.
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>
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>
그러나 반복자는 매개 변수가 매개 변수의 부모 구성 요소이므로 매개 변수를 소비합니다.
체크 아웃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>
반복 가능한 파람은 부모가 반복자 인 경우 매개 변수의 조부모를 반환하는 사용자 정의 구성 요소입니다.
주석 3과 관련하여 JSP 에서이 사용자 정의 된 태그를 어떻게 사용하여 필요한 동작을 달성하는지 보여주십시오.
또한 주석 1에 언급 된 솔루션을 사용하려면 TLD 파일에서 수행해야 할 항목은 무엇입니까?
이걸 알려주세요.