Как оценить динамическое/вложенное выражение-заполнитель свойства Spring?

Я работаю над тегом JSP. Вот старая строка, которая начинает перебирать элементы в модели:

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

Но код был реорганизован, поэтому путь к модели (model.sharingTocs выше) теперь является динамическим, а не фиксированным. Теперь он передается в тег через JSP @attribute:

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

Таким образом, ${path} теперь оценивается как "model.sharingTocs".

Как теперь можно назначить items?


person Steve Chambers    schedule 20.12.2013    source источник


Ответы (3)


Хорошо. Хороший вопрос.

Это решение: написание пользовательского тега jstl для оценки выражения свойства компонента:

<mytag:eval bean="${requestScope['formKey']}" propertyExpression = "${path}" var="items" />

И для каждого:

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

Библиотека, которую вы можете использовать для оценки выражения свойства bean-компонента, — это утилиты bean-компонента Apache.

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

person Loc    schedule 20.12.2013

Если вы используете 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>
person adben002    schedule 23.01.2015

Прошло довольно много времени с тех пор, как я задал этот вопрос, но (с новыми знаниями, полученными с тех пор) я думаю, что это должно сработать:

<c:set var="itemsPath" value="requestScope[formKey].${path}"/>
<c:forEach var="toc" items="${itemsPath}">

то есть установите промежуточную переменную JSTL с полным путем к элементам и вместо этого оцените ее.

person Steve Chambers    schedule 03.11.2016