Spring MVC 技术详解

289 阅读4分钟

Spring MVC 是 Spring Framework 中的一个重要模块,用于构建基于 Java 的 Web 应用程序。它提供了一种基于 MVC(Model-View-Controller)模式的 Web 应用程序开发方法,使得开发者可以更加轻松地开发可扩展、可维护的 Web 应用程序。本文将详细介绍 Spring MVC 的架构、核心组件和开发流程,并提供一些示例代码进行演示。

Spring MVC 的架构

Spring MVC 的架构包括以下组件:

  1. 前端控制器(Front Controller):Spring MVC 的前端控制器是 DispatcherServlet,它是整个 Spring MVC 架构的核心。所有的请求都会先经过 DispatcherServlet,然后由它来协调其他组件进行处理。

  2. 处理器映射器(Handler Mapping):DispatcherServlet 会将请求映射到相应的处理器上,处理器映射器就是用来处理这个映射过程的组件。

  3. 处理器适配器(Handler Adapter):DispatcherServlet 会根据请求的类型选择相应的处理器适配器来处理请求。处理器适配器负责将请求传递给相应的处理器,并将处理器的处理结果返回给 DispatcherServlet。

  4. 处理器(Handler):处理器是真正处理请求的组件,它们根据请求的类型来进行相应的处理。处理器可以是一个控制器、一个方法或者一个命令对象。

  5. 视图解析器(View Resolver):处理器处理请求后,会返回一个逻辑视图名,视图解析器就是用来将这个逻辑视图名解析成一个真正的视图(比如 JSP)的组件。

  6. 视图(View):视图是最终呈现给用户的内容,它可以是一个 JSP、一个 HTML 页面、一个 PDF 文档等等。

Spring MVC 的核心组件

控制器(Controller)

控制器是 Spring MVC 中最重要的组件之一,它负责处理请求并返回响应。在 Spring MVC 中,控制器可以是一个 POJO(Plain Old Java Object),也可以是一个基于注解的控制器类。

下面是一个基于注解的控制器类的示例代码:

@Controller
@RequestMapping("/hello")
public class HelloController {
    
    @RequestMapping(method = RequestMethod.GET)
    public String sayHello(ModelMap model) {
        model.addAttribute("message", "Hello Spring MVC!");
        return "hello";
    }
    
}

在上面的代码中,@Controller 注解表示这是一个控制器类,@RequestMapping("/hello") 注解表示这个控制器处理以 /hello 开头的请求。sayHello() 方法处理 GET 请求,并将一个名为 message 的属性添加到 ModelMap 中,然后返回逻辑视图名为 hello

视图(View)

视图是 Spring MVC 中负责呈现内容的组件,它可以是一个 JSP、一个 HTML 页面、一个 PDF 文档等等。在 Spring MVC 中,视图通常由视图解析器来解析。

下面是一个 JSP 视图的示例代码:

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

在上面的代码中,${message} 表示从 ModelMap 中获取名为 message 的属性,并将其显示在页面上。

视图解析器(View Resolver)

视图解析器是 Spring MVC 中负责将逻辑视图名解析成真正的视图的组件。在 Spring MVC 中,视图解析器通常由 InternalResourceViewResolverUrlBasedViewResolver 来实现。

下面是一个 InternalResourceViewResolver 的示例代码:

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

在上面的代码中,prefix 属性表示 JSP 文件所在的目录,suffix 属性表示 JSP 文件的后缀名。

Spring MVC 的开发流程

Spring MVC 的开发流程通常包括以下步骤:

  1. 配置 DispatcherServlet:在 web.xml 文件中配置 DispatcherServlet。
<servlet>
    <servlet-name>dispatcherServlet</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/dispatcher-servlet.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
    <servlet-name>dispatcherServlet</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>

在上面的代码中,contextConfigLocation 参数表示 Spring MVC 的配置文件所在的位置。

  1. 配置控制器:在 Spring MVC 的配置文件中配置控制器。
<bean id="helloController" class="com.example.HelloController" />

在上面的代码中,helloController 表示控制器的名称,com.example.HelloController 表示控制器的类名。

  1. 配置视图解析器:在 Spring MVC 的配置文件中配置视图解析器。
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <property name="prefix" value="/WEB-INF/views/" />
    <property name="suffix" value=".jsp" />
</bean>

在上面的代码中,prefix 属性表示 JSP 文件所在的目录,suffix 属性表示 JSP 文件的后缀名。

  1. 编写控制器:编写一个处理请求的控制器。
@Controller
@RequestMapping("/hello")
public class HelloController {
    
    @RequestMapping(method = RequestMethod.GET)
    public String sayHello(ModelMap model) {
        model.addAttribute("message", "Hello Spring MVC!");
        return "hello";
    }
    
}

在上面的代码中,@Controller 注解表示这是一个控制器类,@RequestMapping("/hello") 注解表示这个控制器处理以 /hello 开头的请求。sayHello() 方法处理 GET 请求,并将一个名为 message 的属性添加到 ModelMap 中,然后返回逻辑视图名为 hello

  1. 编写视图:编写一个 JSP 视图。
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Hello Spring MVC</title>
</head>
<body>
    <h1>${message}</h1>
</body>
</html>

在上面的代码中,${message} 表示从 ModelMap 中获取名为 message 的属性,并将其显示在页面上。

  1. 运行应用程序:启动应用程序,并在浏览器中访问 http://localhost:8080/hello

结论

Spring MVC 是一个强大的 Web 应用程序开发框架,它提供了一种基于 MVC 模式的开发方式,使得开发者可以更加轻松地开发可扩展、可维护的 Web 应用程序。本文介绍了 Spring MVC 的架构、核心组件和开发流程,并提供了一些示例代码进行演示。如果您想深入了解 Spring MVC,可以参考官方文档或者相关的书籍。