将视图代码放在控制器中是不好的做法?

Ste*_*Kuo 5 java model-view-controller spring jsp java-ee

在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);
}
Run Code Online (Sandbox Code Playgroud)

JSP:

{$status}
Run Code Online (Sandbox Code Playgroud)

在视图中生成的消息

弹簧控制器:

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

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>
Run Code Online (Sandbox Code Playgroud)

在第一种情况下,控制器和JSP代码更简单,但控制器中存在与视图相关的逻辑.在第二种情况下,所有视图逻辑都在JSP中,但代码并不那么简单.

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

Chs*_*y76 6

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


Dav*_*itz 3

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

但就您而言,不建议您所做的事情。通常,您使用 spring 的MessageSource机制将应用程序的文本放入资源包中,并仅使用代码引用它。资源包是一个简单的属性文件,在您的情况下,它将如下所示:

case1=Case 1 status message
case2=Case 2 status message
Run Code Online (Sandbox Code Playgroud)

在 JSP 中,您可以使用按以下方式标记:

<spring:message message="${status}"/>
Run Code Online (Sandbox Code Playgroud)

资源包有两个优点:

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