如何评估动态/嵌套的Spring属性占位符表达式?

时间:2013-12-20 14:02:07

标签: spring jsp spring-mvc el spring-el

我正在研究JSP标记。以下是行,它开始循环遍历模型中的项目:

<c:forEach var="toc" items="${requestScope[formKey].model.sharingTocs}">

但代码已被重构,因此模型路径(上面的model.sharingTocs)现在是动态的而不是固定的。它现在通过JSP @attribute传递到标记中:

<%@attribute name="path" required="true"%>

所以${path}现在评估为"model.sharingTocs"

现在如何分配items

3 个答案:

答案 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的实现。

http://commons.apache.org/proper/commons-beanutils/apidocs/org/apache/commons/beanutils/package-summary.html#standard.nested

答案 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变量,其中包含项目的完整路径,并评估该项目。