我正在研究JSP标记。以下是旧行,它开始循环遍历模型中的项目:
<c:forEach var="toc" items="${requestScope[formKey].model.sharingTocs}">
但代码已被重构,因此模型路径(上面的model.sharingTocs
)现在是动态的而不是固定的。它现在通过JSP @attribute
传递到标记中:
<%@attribute name="path" required="true"%>
所以${path}
现在评估为"model.sharingTocs"
。
现在如何分配items
?
答案 0 :(得分:1)
好。好问题。
这是一个解决方案:编写自定义jstl标记以评估bean的属性表达式:
<mytag:eval bean="${requestScope['formKey']}" propertyExpression = "${path}" var="items" />
和ForEach:
<c:forEach var="toc" items="${items}">
</c:forEach>
mytag的示例代码:eval JSTL代码(经典型号)
public class EvalTag extends TagSupport
{
private Object bean;
private String propertyExpression; //Ex: 'model.sharingTocs'
private String var;
//............
@Override
public int doEndTag() throws JspException {
try {
// Use reflection to eval propertyExpression ('model.sharingTocs') on the given bean
Object propObject = SomeLibs.eval ( this.bean, this.propertyExpression);
this.pageContext.getRequest().setAttribute(this.var, propObject);
// You can add propObject into Other scopes too.
} catch (Exception ex) {
throw new JspTagException(ex.getMessage(), ex);
}
return EVAL_PAGE;
}
//............
// SETTERS here
}
可用于eval属性的lib表达式是bean bean的实现。
答案 1 :(得分:0)
如果你使用spring,你可以使用spring标签库,它也假设你在form:form标签内。
<%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %>
<%@ attribute name="path" required="false" %>
<spring:bind path="${path}">
<c:forEach var="item" items="${status.value}">
${item}
</c:forEach>
</spring:bind>
答案 2 :(得分:0)
自从我提出这个问题以来已经有一段时间了,但是(从那以后获得了新的知识)我认为这应该有效:
<c:set var="itemsPath" value="requestScope[formKey].${path}"/>
<c:forEach var="toc" items="${itemsPath}">
即。设置一个中间JSTL变量,其中包含项目的完整路径,并评估该项目。