#java #spring #model-view-controller
#java #spring #model-view-controller
Вопрос:
Я работал с Spring MVC, и у меня есть вопрос, который, я полагаю, относится к MVC в целом. Я ищу способ принудительного выполнения (или, по крайней мере, лучшего документирования) контракта между моделью и конкретными представлениями. Т.Е. Каждое представление имеет набор требуемых атрибутов модели, но чтобы узнать их, человек, пишущий контроллер, должен прочитать / понять весь JSP (в дополнение к любым тегам или другим включенным JSP), чтобы они могли соответствующим образом заполнить модель, прежде чем возвращать это представление. Или вы можете посмотреть другие места, где возвращается это представление, и работать в обратном направлении, пытаясь выяснить, какие атрибуты являются обязательными, а какие необязательными. Ни один из них не является для меня особенно привлекательным.
Является ли ответ просто перенаселением модели? Мне не особенно нравится эта идея. Я хотел бы найти способ программного документирования (или, что еще лучше, принудительного применения) этих требуемых атрибутов для каждого представления. Я не смог найти ничего в документации Spring, что касалось бы этого. У кого-нибудь есть какие-либо мысли или идеи?
Одна вещь, которая пришла на ум, — это иметь перечисление view для каждого модуля. Каждая константа в перечислении будет иметь имя представления и набор требуемых атрибутов модели (возможно, также отдельный набор необязательных атрибутов). Затем методы контроллера возвращают элемент этого перечисления, после чего модель может быть проверена (используя что-то вроде model.keySet().containsAll(viewEnum.requiredAttributes())). Это все равно было бы ошибкой во время выполнения, но, по крайней мере, программисты могли бы просмотреть это перечисление и очень четко увидеть, какие атрибуты модели требуются для каждого представления.
Ответ №1:
Существует один аспект проблемы, который вы еще не рассмотрели: ограничения, зависящие от данных.
Например, если у вас есть simple if
в вашем jsp, то это может сделать весь материал более сложным:
<c:if test="${formated}" >
<c:out value="${prefix}">
</c:if>
<c:out value="${value}">
<c:if test="${formated}" >
<c:out value="${postfix}">
</c:if>
Итак, в целом я считаю, что нет простого, даже сложного решения (возможно, есть очень сложное решение.)