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

Java 将视图代码放在控制器中是一种不好的做法吗?,java,spring,jsp,jakarta-ee,model-view-controller,Java,Spring,Jsp,Jakarta Ee,Model View Controller,在MVC(比如JSP和Spring)中,在控制器中查看相关代码是一种不好的做法吗 在我的例子中,控制器做一些工作,然后将结果交给视图(JSP)。对于状态消息,我可以将整个消息文本传递给视图,或者传递一个键,让JSP将其映射到消息文本 例如: 在控制器中生成的消息 弹簧控制器: protected ModelAndView onSubmit(...) { Map map = new HashMap(); // Controller processing if (...)

在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);
}
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:

在视图中生成的消息

弹簧控制器:

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);
}
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:


案例1状态信息
案例2状态信息
在第一种情况下,控制器和JSP代码更简单,但控制器中有与视图相关的逻辑。 在第二种情况下,所有视图逻辑都在JSP中,但代码并没有那么简单


我在控制器中生成消息文本是否违反了MVC范式?此场景的常见做法是什么?

常见做法是使用资源束:-)您可以在Spring上下文中配置它们,并使用标记检索它们。

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

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

case1=Case 1 status message
case2=Case 2 status message
在JSP中,使用标记以以下方式引用它:

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

资源包有两个优点:

  • 很容易将您的站点国际化并以多种语言提供
  • 您可以在源代码外部管理应用程序文本,如果使用spring,您甚至可以在不重新部署应用程序的情况下更改文本

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

      例如,假设您有相同的控制器,但有一个可选的视图渲染器,例如,一个生成Excel电子表格的渲染器

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

      总之,您给出的示例表示的逻辑是视图不可知的,因此控制器是它的好位置


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

      +1-我喜欢您不只是说是或否,而是给出了一个很好的建议,这将是一个改进,因为它还提供了更多的灵活性。