Spring MVC:控制器(Controller)与视图(View)

各位观众,各位程序猿、程序媛们,晚上好!我是今天的主讲人,一个被Bug折磨得快秃顶,但依然热爱编程的老码农。今天咱们要聊聊Spring MVC框架里两位重量级人物——控制器(Controller)和视图(View)。它们就像一对相爱相杀的CP,共同演绎着互联网应用的前端故事。

别担心,今天咱们不讲枯燥的理论,要用最接地气、最形象的比喻,把这对CP的故事,以及它们在Spring MVC框架中的作用,给各位讲明白、讲透彻。

一、Spring MVC:一台精密的生产线

在开始讲Controller和View之前,咱们先简单回顾一下Spring MVC框架的整体架构。你可以把它想象成一条精密的生产线,专门负责处理用户的请求,并返回用户想要的“产品”。

这条生产线上,各个环节各司其职,协同工作,才能保证高效、稳定地生产出满足用户需求的产品。而Controller和View,就是这条生产线上最重要的两个环节。

环节名称 职责 比喻
客户端(Client) 发起请求,例如浏览器、App等。 顾客
DispatcherServlet 前端控制器,接收所有请求,并将请求分发给合适的Handler。 总调度员
HandlerMapping 负责查找处理请求的Handler(通常是Controller)。 导购
HandlerAdapter 负责执行Handler(Controller)。 执行者
Controller 接收请求,处理业务逻辑,并返回模型数据。 生产车间
ViewResolver 负责查找合适的View,将模型数据渲染成用户可见的视图。 包装车间
View 将模型数据渲染成用户可见的视图,例如HTML页面、JSON数据等。 成品

二、Controller:掌控全局的“总指挥”

Controller,中文名叫“控制器”,听起来是不是很霸气?没错,它就是Spring MVC框架里的“总指挥”。它负责接收客户端发起的请求,调用相应的业务逻辑,并将处理结果传递给View,最终呈现给用户。

你可以把Controller想象成一家餐厅的“点餐员兼厨师长”。顾客(Client)点了菜(请求),点餐员(Controller)负责记录菜单(接收请求),然后把菜单交给厨房(业务逻辑),厨房根据菜单做出美味佳肴,最后由服务员(View)把菜端给顾客。

1. Controller的职责:

  • 接收请求: 接收客户端发起的HTTP请求,例如GET、POST、PUT、DELETE等。
  • 解析请求参数: 从请求中提取参数,例如URL参数、表单参数、Cookie等。
  • 调用业务逻辑: 调用Service层提供的业务逻辑方法,处理请求。
  • 处理业务逻辑结果: 根据业务逻辑的处理结果,决定如何响应客户端。
  • 返回模型数据: 将处理结果封装成模型数据,传递给View进行渲染。

2. 如何定义一个Controller?

在Spring MVC中,定义一个Controller非常简单,只需要使用@Controller注解标记一个类即可。

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
public class HelloController {

    @RequestMapping("/hello")
    @ResponseBody
    public String hello() {
        return "Hello, Spring MVC!";
    }
}

这段代码定义了一个名为HelloController的Controller,它包含一个名为hello的方法,该方法使用@RequestMapping("/hello")注解映射到/hello路径。当客户端访问/hello路径时,hello方法将被执行,并返回字符串"Hello, Spring MVC!"。

@ResponseBody注解表示将方法的返回值直接写入HTTP响应体,而不是将返回值作为视图名称进行解析。

3. Controller的常用注解:

  • @Controller 标记一个类为Controller。
  • @RequestMapping 映射请求路径到Controller的方法。可以指定请求方法(GET、POST等)、请求参数、请求头等。
  • @GetMapping@PostMapping@PutMapping@DeleteMapping @RequestMapping的快捷方式,分别对应GET、POST、PUT、DELETE请求。
  • @PathVariable 获取URL路径中的参数。
  • @RequestParam 获取请求参数。
  • @RequestBody 获取请求体中的数据,通常用于处理JSON数据。
  • @ResponseBody 将方法的返回值直接写入HTTP响应体。
  • @ModelAttribute 将方法的返回值添加到模型数据中。
  • @SessionAttributes 将模型数据存储到Session中。

4. Controller的返回值类型:

Controller的方法可以返回多种类型的值,例如:

  • String: 视图名称。
  • ModelAndView: 模型数据和视图名称。
  • void: 无返回值,通常用于重定向。
  • 对象: 如果使用了@ResponseBody注解,则将对象序列化为JSON或XML数据。
  • ResponseEntity: 可以自定义HTTP响应状态码、响应头等。

三、View:精美的“包装工”

View,中文名叫“视图”,它负责将Controller传递过来的模型数据渲染成用户可见的页面。你可以把View想象成一个“包装工”,它将Controller提供的“原材料”(模型数据)进行精美的包装,最终呈现给用户。

就像餐厅的服务员,拿到厨房做好的菜,会摆盘、装饰,让菜看起来更有食欲,然后才会端给顾客。

1. View的职责:

  • 接收模型数据: 接收Controller传递过来的模型数据。
  • 渲染视图: 根据模型数据,将数据填充到视图模板中,生成用户可见的页面。
  • 返回响应: 将渲染后的视图作为HTTP响应返回给客户端。

2. View的类型:

Spring MVC支持多种类型的View,例如:

  • JSP: JavaServer Pages,一种动态网页技术。
  • Thymeleaf: 一种现代服务器端Java模板引擎。
  • FreeMarker: 一种模板引擎,可以生成各种类型的文本文件。
  • Velocity: 另一种模板引擎。
  • JSON: JavaScript Object Notation,一种轻量级的数据交换格式。
  • XML: Extensible Markup Language,一种标记语言。

3. ViewResolver:View的“寻宝猎人”

ViewResolver,中文名叫“视图解析器”,它负责根据视图名称查找合适的View。你可以把它想象成一个“寻宝猎人”,它根据Controller提供的线索(视图名称),在各种View中找到最合适的“宝藏”。

Spring MVC提供了多种ViewResolver,例如:

  • InternalResourceViewResolver: 用于解析JSP视图。
  • ThymeleafViewResolver: 用于解析Thymeleaf视图。
  • FreeMarkerViewResolver: 用于解析FreeMarker视图。
  • BeanNameViewResolver: 根据Bean的名称查找View。

4. 如何配置ViewResolver?

在Spring MVC的配置文件中,你需要配置ViewResolver,告诉Spring MVC如何查找View。例如,如果你想使用InternalResourceViewResolver解析JSP视图,可以这样配置:

<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <property name="prefix" value="/WEB-INF/views/" />
    <property name="suffix" value=".jsp" />
</bean>

这段配置告诉Spring MVC,JSP视图文件都放在/WEB-INF/views/目录下,并且文件后缀名为.jsp

四、Controller与View的交互:一场默契的“双人舞”

Controller和View之间的交互,就像一场默契的“双人舞”。Controller负责“领舞”,提供模型数据,View负责“伴舞”,将模型数据渲染成用户可见的页面。

1. Controller如何将数据传递给View?

Controller可以通过以下几种方式将数据传递给View:

  • ModelAndView: Controller可以返回一个ModelAndView对象,该对象包含模型数据和视图名称。
  • Model: Controller可以将模型数据添加到Model对象中,Spring MVC会自动将Model对象传递给View。
  • Map: Controller可以将模型数据添加到Map对象中,Spring MVC会自动将Map对象传递给View。
  • Session: Controller可以将模型数据存储到Session中,View可以从Session中获取数据。

2. View如何获取Controller传递的数据?

View可以通过以下方式获取Controller传递的数据:

  • JSP: 使用JSP表达式语言(EL)${}或JSTL标签库<c:out>来获取数据。
  • Thymeleaf: 使用Thymeleaf表达式${}th:text属性来获取数据。
  • FreeMarker: 使用FreeMarker表达式${}来获取数据。

五、实例演示:打造一个简单的“Hello World”页面

为了更好地理解Controller和View的交互,咱们来做一个简单的“Hello World”页面。

1. 创建一个Controller:

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class HelloWorldController {

    @RequestMapping("/helloWorld")
    public String helloWorld(Model model) {
        model.addAttribute("message", "Hello, World!");
        return "helloWorld";
    }
}

这个Controller定义了一个名为helloWorld的方法,该方法使用@RequestMapping("/helloWorld")注解映射到/helloWorld路径。当客户端访问/helloWorld路径时,helloWorld方法将被执行。

helloWorld方法将字符串"Hello, World!"添加到Model对象中,并将视图名称设置为"helloWorld"。

2. 创建一个JSP视图:

/WEB-INF/views/目录下创建一个名为helloWorld.jsp的文件,内容如下:

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Hello World</title>
</head>
<body>
    <h1>${message}</h1>
</body>
</html>

这个JSP视图使用JSP表达式语言${message}来获取Controller传递过来的模型数据,并将数据渲染到页面上。

3. 访问/helloWorld路径:

启动Spring MVC应用程序,并在浏览器中访问/helloWorld路径。你将会看到一个显示"Hello, World!"的页面。

六、Controller与View的进阶技巧

掌握了Controller和View的基本用法后,咱们再来了解一些进阶技巧,让你的Spring MVC应用程序更加强大。

1. RESTful API:

RESTful API是一种设计风格,用于构建Web服务。Controller可以使用@RestController注解来创建RESTful API,并使用@GetMapping@PostMapping@PutMapping@DeleteMapping等注解来映射不同的HTTP方法。

2. 数据校验:

可以使用JSR-303 Bean Validation API来进行数据校验。Controller可以使用@Valid注解来启用数据校验,并使用BindingResult对象来获取校验结果。

3. 异常处理:

可以使用@ExceptionHandler注解来处理Controller中的异常。可以定义全局异常处理器,也可以定义局部异常处理器。

4. 拦截器:

可以使用拦截器来拦截请求,并在请求处理前后执行一些操作。例如,可以使用拦截器来进行身份验证、权限控制、日志记录等。

5. 国际化:

可以使用Spring MVC的国际化支持来实现应用程序的国际化。可以将应用程序的文本信息存储在资源文件中,并根据用户的语言环境选择合适的资源文件。

七、总结:Controller与View,珠联璧合的“黄金搭档”

Controller和View是Spring MVC框架中不可或缺的两个组成部分。Controller负责接收请求、处理业务逻辑,View负责渲染视图、呈现数据。它们之间的默契配合,才能打造出用户体验良好的Web应用程序。

就像一对珠联璧合的“黄金搭档”,Controller是“发动机”,提供动力,View是“车身”,承载乘客。只有发动机强劲有力,车身舒适美观,才能让乘客享受一段愉快的旅程。

希望今天的讲解能够帮助大家更好地理解Spring MVC框架中的Controller和View,并在实际开发中灵活运用它们,打造出更加优秀的Web应用程序。

感谢各位的观看,咱们下期再见!

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注