Имя атрибута модели формы Spring как константа Java

чтобы не повторяться в коде, я использовал имя modelAttribute в качестве константы java

@Controller
@RequestMapping("/")
public class Controller {
    public static final String MODEL_ATTRIBUTE = "myModel";

    public String renderPage(Model model) {
        model.addAttribute(MODEL_ATTRIBUTE, ...);
        return "index";
    }
}

Теперь я импортирую эту константу в JSP с помощью скриптлета (я знаю, что скриптлеты плохие, но я не знаком с лучшим решением).

<%@page contentType="text/html" pageEncoding="UTF-8" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>

<%@page import="static com.example.Controller.*" %>

<form:form action="/" modelAttribute="<%= MODEL_ATTRIBUTE %>">

    <form:label path="attr1">Attribute:</form:label>
    <form:input path="attr1" />

    <c:forEach items="${???.attr2}" var="item">
        ...    
    </c:forEach>
    <input type="submit" />
</form:form>

Как я должен ссылаться на объект modelAttribute в цикле forEach? Есть ли лучшее решение для DRY в формах Spring?


person kurochenko    schedule 24.04.2012    source источник


Ответы (1)


Используйте название модели,

<c:forEach items="${myModel.attributeNameFromYourModel}" var="item">
        ...    
</c:forEach>
person Sridhar G    schedule 24.04.2012
comment
Спасибо за ответ. Причина, по которой я задал этот вопрос, заключается в том, что я не хочу напрямую использовать название модели. Я хочу, чтобы он хранился в одном месте, например. константа java, которая используется во всем приложении. Если я воспользуюсь вашим подходом и захочу изменить название модели, то мне придется изменить его как минимум в двух разных местах. Это может привести к множеству глупых ошибок в будущем. - person kurochenko; 24.04.2012
comment
@kurochenko Я понимаю ваши чувства. Но JSP просто так не работают, если только вы не используете скриптлеты, что является злом. - person Sean Patrick Floyd; 24.04.2012
comment
Лично я не сторонник использования скриптлета. Но я мог бы предложить здесь присвоить имя атрибута модели в jsp и ссылаться на назначенное значение в других местах. Например: ‹c:set var=newModelName scope=page›‹%= MODEL_ATTRIBUTE %›‹/c:set› Но, к сожалению, это делает его более грязным :( - person Sridhar G; 24.04.2012