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




JSP обычно не содержат большого (или какого-либо?) Кода, поэтому вашими вариантами будут
Я бы сказал, что библиотека тегов, вероятно, будет тем, что вам нужно в большинстве случаев, потому что обычно представление - это код, который заботится о таких вещах, как форматирование.
Если стандартные библиотеки тегов не дадут вам результата, их несложно создать, так что вы можете использовать свои собственные.
Обычно я выполняю форматирование и т. д. В bean-компоненте или "помощнике" представления. Это дает несколько преимуществ, включая следующие:
Я бы сделал это так:
экземпляр класса Person будет единственным объектом в модели ModelAndView
Я бы перенес «логику представления» в сам класс Person. Например,
public class Person {
public String getLocation() {
return this.latitude.concat(", ").concat(this.longitude);
}
}
Я думаю, что в целом такой подход: 1 - усиливает модель предметной области. 2 - уменьшает дублирование кода (что, если вы хотите показать местоположение в другом JSP? С вашим подходом у вас будет много дублированного кода)
Это спорно. Вы получаете строковое представление свойства, которое можно использовать где угодно. И, что наиболее важно, вы получаете меньше кода, и это имеет смысл централизованно.
Я бы сказал, что настоящее «нарушение» будет, если getLocation вернет строку, содержащую HTML-теги или что-то в этом роде.
Я предпочитаю рассматривать форматирование части слоя отображения, таким образом, выполненное в JSP. Совсем недавно я использовал Velocity, но та же идея с JSP: контроллер возвращает модель данных, а представление отвечает за рендеринг этих данных в видимое представление. Множество библиотек тегов JSP для общих нужд.
Вы упоминаете сложные или вычисленные значения. Для меня они звучат как элементы модели данных результатов, поэтому должны выполняться в контроллере, даже если они в принципе могут быть определены другими данными, такими как сумма, макс и другие агрегированные значения. Под форматированием в представлении я подразумеваю такие базовые вещи, как форматы даты и чисел, разделение строк, выравнивание. Конечно, точная граница между данными и форматированным представлением зависит от приложения, но я думаю, вы поняли идею.
Но это нарушило бы сохранение вида отдельно от модели.