В Spring / JSP, где должно выполняться форматирование?

Я использую Spring, но этот вопрос относится ко всем типам конструкций JSP-контроллеров.

Страница JSP ссылается на данные (с использованием тегов), которые заполняются соответствующим контроллером. У меня вопрос, где подходящее место для выполнения форматирования, в JSP или контроллере?

До сих пор я готовил данные, форматируя их в моем контроллере.

public class ViewPersonController extends org.springframework.web.servlet.mvc.AbstractController
{
    private static final Format MY_DATE_FORMAT = new SimpleDateFormat(...);
    protected ModelAndView handleRequestInternal(HttpServletRequest request, HttpServletResponse response)
    {
        Person person = get person from backing service layer or database
        Map properties = new HashMap();

        // No formatting required, name is a String
        properties.put("name", person.getName());

        // getBirthDate() returns Date and is formatted by a Format
        properties.put("birthDate", MY_DATE_FORMAT.format(person.getBirthDate()));

        // latitude and longitude are separate fields in Person, but in the UI it's one field
        properties.put("location", person.getLatitude() + ", " + person.getLongitude());

        return new ModelAndView("viewPerson", "person", properties);
    }
}

Файл JSP будет выглядеть примерно так:

Name = <c:out value="${person. name}" /><br>
Birth Date = <c:out value="${person. birthDate}" /><br>
Location = <c:out value="${person. location}" /><br>

Я знаю, что у JSP есть некоторые условия для форматирования,

<%@ taglib uri="http://java.sun.com/jstl/fmt" prefix="fmt" %>
<fmt:formatDate type="date" value="${person. birthDate}" />

Но это работает только с Java java.util.Format. Что делать, если мне нужны более сложные или вычисленные значения. В таком случае размещение кода в JSP будет громоздким (и уродливым).

Мне любопытно, если это следует духу Spring / JSP / MVC. Другими словами, является ли контроллер частью представления? Где предпочтительное место для выполнения форматирования, связанного с просмотром? Должен ли мой контроллер просто возвращать объект (Person) вместо Map отформатированных значений?

12.12.2008 00:22:45
4 ОТВЕТА

В JSP обычно нет большого (или какого-либо?) Кода, поэтому ваши варианты будут

  • контроллер
  • библиотеки тегов

Я бы сказал, что библиотека тегов, вероятно, подойдет вам в большинстве случаев, потому что обычно представление - это код, который заботится о таких вещах, как форматирование.

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

5
12.12.2008 00:55:09

Я обычно делаю форматирование и т. Д. В bean-компоненте или представлении «помощник». Это имеет несколько преимуществ, включая следующие:

  1. Проще проверить
  2. Гибкость в изменении технологий просмотра, не беспокоясь о переносе или переписывании того, что вы сделали в пользовательских вкладках.
  3. Более чистый и простой в обслуживании контроллер и просмотр кода.
1
12.12.2008 01:09:43

Я бы так и сделал -

экземпляр класса Person будет единственным объектом в модели ModelAndView

Я бы переместил «логику представления» в сам класс Person. Например,

public class Person {
    public String getLocation() {
        return this.latitude.concat(", ").concat(this.longitude);
    }
}

Я думаю, что в целом такой подход: 1 - укрепляет модель вашего домена. 2 - уменьшает дублирование кода (что, если вы хотите показать местоположение в другой JSP? При вашем подходе вы получите много дублированного кода)

0
12.12.2008 03:47:35
Но это нарушит разделение вида на модель.
Steve Kuo 12.12.2008 17:45:47
Это спорно. Вы получаете строковое представление свойства, которое можно использовать где угодно. И самое главное, вы получаете меньше кода, и это имеет смысл в централизованном месте.
bpapa 12.12.2008 21:05:23
Я бы сказал, что истинное «нарушение» было бы, если бы getLocation вернул строку, содержащую HTML-теги или что-то в этом роде.
bpapa 12.12.2008 21:06:28

Я предпочитаю рассмотреть форматирование части слоя отображения, что делается в JSP. Я использовал Velocity совсем недавно, но та же идея с JSP: контроллер возвращает модель данных, и представление отвечает за отображение этих данных в видимом представлении. Множество библиотек тегов JSP для общих нужд.

Вы упоминаете сложные или вычисленные значения. Для меня они звучат как элементы модели данных результатов, поэтому их следует выполнять в контроллере, даже если они в принципе могут быть определены другими данными, такими как сумма, максимум и другие совокупные значения. Под форматированием в представлении я подразумеваю основные вещи, такие как форматы даты и числа, разбиение строк, выравнивание. Конечно, точная грань между данными и форматированным представлением зависит от приложения, но я думаю, вы поняли идею.

1
12.12.2008 05:26:57