【问题标题】:Is it bad practice to put view code in the controller?将视图代码放在控制器中是不好的做法吗?
【发布时间】:2010-11-24 17:32:41
【问题描述】:

在MVC(如JSP和Spring)中,在控制器中查看相关代码是不是不好?

在我的例子中,控制器做了一些工作,然后将结果交给视图 (JSP)。对于状态消息,我可以将整个消息文本传递给视图,或者传递一个键并让 JSP 将其映射到消息文本。

例子:

控制器中生成的消息

弹簧控制器:

protected ModelAndView onSubmit(...) {
    Map map = new HashMap();
    // Controller processing
    if (...)
        map.put("status", "Case 1 status message");
    else
        map.put("status", "Case 2 status message");
    return new ModelAndView("viewPage", map);
}

JSP:

{$status}

视图中生成的消息

弹簧控制器:

protected ModelAndView onSubmit(...) {
    Map map = new HashMap();
    // Controller processing
    if (...)
        map.put("status", "case1");
    else
        map.put("status", "case2");
    return new ModelAndView("viewPage", map);
}

JSP:

<c:choose>
  <c:when test="{$status eq 'case1'}">Case 1 status message</c:when>
  <c:when test="{$status eq 'case2'}">Case 2 status message</c:when>
</c:choose>

第一种情况,控制器和JSP代码比较简单,但是控制器中有视图相关的逻辑。 在第二种情况下,所有的视图逻辑都在 JSP 中,但代码没有那么简单。

我在控制器中生成消息文本是否违反了 MVC 范例?这种情况的常见做法是什么?

【问题讨论】:

    标签: java spring jsp jakarta-ee model-view-controller


    【解决方案1】:

    通常的做法是使用资源包 :-) 您可以在 Spring 上下文中将它们配置为 message sources 并使用 message 标记来检索它们。

    【讨论】:

    • +1 - 我喜欢你不只是说是或否,而是提出了一个很好的建议,这将是一个改进,因为它也提供了更多的灵活性。
    【解决方案2】:

    在 MVC 中结合 UI 和控制器代码是富客户端(例如 Swing)中的常见做法。即使在 web MVC 中,它有时也会被实现,用于非常简单的响应。

    在您的情况下,不建议您这样做。通常你使用 spring 的MessageSource 机制将你的应用程序的文本放在一个resource bundle 中,并且只使用代码来引用它。资源包是一个简单的属性文件,在您的情况下,它看起来像这样:

    case1=Case 1 status message
    case2=Case 2 status message
    

    在 JSP 中,您使用 标记以下列方式引用它:

    <spring:message message="${status}"/>
    

    资源包有两个优点:

    • 使您的网站国际化并提供多种语言很容易
    • 您可以在源外部管理应用程序文本,如果您使用 spring 的ReloadableResourceBundleMessageSource,您甚至可以更改文本而无需重新部署应用程序。

    【讨论】:

      【解决方案3】:

      我不认为这是不好的做法。决定是在视图中还是在控制器中放置一些逻辑的一个好策略是想象一个场景,您将有两个不同的视图引擎。然后您可以检查该特定代码是否不会在两个视图引擎中重复。

      例如,假设您有相同的控制器,但有一个替代视图渲染器,比如说,一个生成 Excel 电子表格的渲染器。

      在您的示例中,您必须将检索正确消息的逻辑不仅放在 JSP(呈现 HTML)中,而且还放在 Excel 电子表格(作为公式)中。

      总而言之,您给出的示例表示与视图无关的逻辑,因此控制器是它的好地方。

      它不适用于决定特定文本是否应呈现为粗体的逻辑。这是视图特定的逻辑。 HTML 使用样式表来呈现粗体文本,而其他视图引擎使用不同的表示。在这种情况下,保存此逻辑的最佳位置是视图层(用于 HTML 视图等的 JSP)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-12-11
        • 1970-01-01
        • 2015-12-21
        • 1970-01-01
        • 2011-12-22
        • 1970-01-01
        相关资源
        最近更新 更多