5

我正在使用 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?

4

4 回答 4

5

JSP 通常没有很多(或任何?)代码,因此您的选择是

  • 控制器
  • 标签库

我会说,在大多数情况下,标签库可能是您想要的,因为通常视图是关心诸如格式化之类的事情的代码。

如果标准标签库不能让你到达那里,它们并不难创建,所以你可以自己动手。

于 2008-12-12T00:55:09.077 回答
1

我通常在 bean 或视图“助手”中进行格式化等。这有几个优点,包括:

  1. 更容易测试
  2. 灵活地更改您的视图技术,而无需担心移植或重写您在自定义标签库中所做的事情。
  3. 更清洁、更易于维护控制器和查看代码。
于 2008-12-12T01:09:43.103 回答
1

我更喜欢考虑格式化显示层的一部分,因此在 JSP 中完成。我最近使用了 Velocity,但与 JSP 的想法相同:控制器返回一个数据模型,视图负责将该数据呈现为可见表示。大量 JSP 标记库可满足常见需求。

您提到了复杂的或计算的值。这些听起来像是结果数据模型的元素,所以应该在控制器中完成,即使它们原则上可以由其他数据确定,例如 sum、max 和其他聚合值。在视图中格式化是指基本的东西,比如日期和数字格式、行分割、对齐。当然,数据和格式化表示之间的确切界限取决于应用程序,但我想你明白了。

于 2008-12-12T05:26:57.593 回答
0

我会这样做的方式是 -

Person 类的一个实例将是 ModelAndView 的模型中的唯一对象

我会将“表示逻辑”移动到 Person 类本身。例如,

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

我认为总的来说这种方法: 1 - 加强你的领域模型。2 - 减少代码重复(如果你想在另一个 JSP 中显示位置怎么办?用你的方法你会有很多重复的代码)

于 2008-12-12T03:47:35.267 回答