我正在使用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吗?
答案 0 :(得分:5)
JSP中通常没有很多(或任何?)代码,因此您的选项将是
我想说在大多数情况下,标签库可能就是你想要的,因为通常视图是关注格式化等事情的代码。
如果标准标签库没有帮助您,那么它们就不难创建,因此您可以自己动手。
答案 1 :(得分:1)
我通常在bean或视图“帮助器”中进行格式化等。这有几个优点,包括:
答案 2 :(得分:1)
我更愿意考虑格式化显示层的一部分,因此在JSP中完成。我最近使用了Velocity,但与JSP相同的想法:controller返回一个数据模型,视图负责将数据呈现为可见的表示。大量的JSP标记库可满足常见需求。
您提到复杂或计算的值。这听起来像是结果数据模型的元素,因此应该在控制器中完成,即使它们原则上可以由其他数据确定,例如sum,max和其他聚合值。通过视图中的格式化,我指的是日期和数字格式,线条分割,对齐等基本内容。当然,数据和格式化表示之间的确切界限取决于应用程序,但我认为你明白了。
答案 3 :(得分:0)
我会这样做 -
Person类的实例将是ModelAndView模型中唯一的对象
我会将“表示逻辑”移动到Person类本身。例如,
public class Person {
public String getLocation() {
return this.latitude.concat(", ").concat(this.longitude);
}
}
我认为总的来说这个方法: 1 - 加强您的域模型。 2 - 减少代码重复(如果你想在另一个JSP中显示位置怎么办?用你的方法你会有很多代码重复)