В 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 Steve Kuo    schedule 12.12.2008    source источник


Ответы (4)


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

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

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

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

person davetron5000    schedule 12.12.2008

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

  1. Легче тестировать
  2. Гибкость для изменения ваших технологий просмотра, не беспокоясь о переносе или переписывании того, что вы сделали в пользовательских вкладках.
  3. Более чистый и простой в обслуживании код контроллера и представления.
person digitalsanctum    schedule 12.12.2008

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

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

person Dov Wasserman    schedule 12.12.2008

Как бы я это сделал -

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

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

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

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

person bpapa    schedule 12.12.2008
comment
Но это нарушило бы сохранение представления отдельно от модели. - person Steve Kuo; 12.12.2008
comment
Это спорно. Вы получаете строковое представление свойства, которое можно использовать где угодно. И самое главное, вы получаете меньше кода, и это имеет смысл централизованно. - person bpapa; 13.12.2008
comment
Я бы сказал, что истинным нарушением будет, если getLocation вернет строку, содержащую теги HTML или что-то в этом роде. - person bpapa; 13.12.2008