代码之家  ›  专栏  ›  技术社区  ›  Steve Kuo

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

  •  5
  • Steve Kuo  · 技术社区  · 17 年前

    在我的例子中,控制器做一些工作,然后将结果交给视图(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);
    }
    

    {$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);
    }
    

    <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中,但代码并没有那么简单。

    3 回复  |  直到 17 年前
        1
  •  6
  •   ChssPly76    17 年前

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

        2
  •  3
  •   David Rabinowitz    17 年前

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

    resource bundle MessageSource 机械装置,并仅使用代码参考。资源包是一个简单的属性文件,在您的情况下,它将如下所示:

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

    按以下方式标记:

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

        3
  •  0
  •   Daniel Melo    17 年前

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

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

    总之,您给出的示例代表的逻辑是 视图不可知论

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

    推荐文章