Где следует выполнять форматирование в 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) вместо карты форматированных значений?

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
5
0
3 598
4

Ответы 4

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

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

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

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

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

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

Я бы сделал это так:

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

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

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

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

Но это нарушило бы сохранение вида отдельно от модели.

Steve Kuo 12.12.2008 20:45

Это спорно. Вы получаете строковое представление свойства, которое можно использовать где угодно. И, что наиболее важно, вы получаете меньше кода, и это имеет смысл централизованно.

bpapa 13.12.2008 00:05

Я бы сказал, что настоящее «нарушение» будет, если getLocation вернет строку, содержащую HTML-теги или что-то в этом роде.

bpapa 13.12.2008 00:06

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

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

Другие вопросы по теме