Java 将视图代码放在控制器中是一种不好的做法吗?
在MVC(比如JSP和Spring)中,在控制器中查看相关代码是一种不好的做法吗 在我的例子中,控制器做一些工作,然后将结果交给视图(JSP)。对于状态消息,我可以将整个消息文本传递给视图,或者传递一个键,让JSP将其映射到消息文本 例如: 在控制器中生成的消息 弹簧控制器: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 (...)
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-我喜欢您不只是说是或否,而是给出了一个很好的建议,这将是一个改进,因为它还提供了更多的灵活性。