2013-12-20 1 views
0

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

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

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

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

Так ${path} Теперь вычисляется в "model.sharingTocs".

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

ответ

1

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

Это решение: написание пользовательских JSTL тег, чтобы оценить выражение свойства бина:

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

И ForEach:

<c:forEach var="toc" items="${items}"> 
</c:forEach> 

Sample код 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 
} 

A lib, который вы можете использовать для свойства eval. Выражение компонента bean utils bean utils.

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

0

Если вы используете весной вы можете использовать библиотеку весной тегов, он также предполагает, что вы находитесь внутри формы: тег формы.

<%@ 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> 
0

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

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

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

Смежные вопросы