Spring MVC 教程

Spring MVC是一个用于构建Web应用程序的Java框架,遵循模型-视图-控制器设计模式。它实现了核心Spring框架的所有基本功能,如控制反转(IoC)和依赖注入(DI)。

Spring MVC通过DispatcherServlet提供了在Spring框架中使用MVC的优雅解决方案。在这里,DispatcherServlet是一个接收传入请求并将其映射到正确资源(如控制器、模型和视图)的类。

Spring Web 模型-视图-控制器

spring-web-model-view-controller.png

  • 模型(Model) - 模型包含应用程序的数据。数据可以是单个对象或对象的集合。
  • 控制器(Controller) - 控制器包含应用程序的业务逻辑。在这里,使用@Controller注解将类标记为控制器。
  • 视图(View) - 视图以特定格式表示提供的信息。通常,使用JSP+JSTL创建视图页面。尽管Spring还支持其他视图技术,如Apache Velocity、Thymeleaf和FreeMarker。
  • 前端控制器(Front Controller) - 在Spring Web MVC中,DispatcherServlet类作为前端控制器工作。它负责管理Spring MVC应用程序的流程。

理解 Spring Web MVC 流程

flow-of-spring-web-mvc.png

  • 如图所示,所有传入的请求都被前端控制器DispatcherServlet拦截。
  • DispatcherServlet从XML文件获取处理程序映射的条目,并将请求转发给控制器。
  • 控制器返回ModelAndView对象。
  • DispatcherServlet在XML文件中检查视图解析器的条目,并调用指定的视图组件。

Spring MVC 框架的优势

让我们看一些Spring MVC框架的优势:

  • 角色分离 - Spring MVC将每个角色分开,模型对象、控制器、命令对象、视图解析器、DispatcherServlet、验证器等可以由专门的对象完成。
  • 轻量级 - 它使用轻量级的Servlet容器来开发和部署应用程序。
  • 强大的配置 - 它为框架和应用程序类提供了强大的配置,包括在上下文之间进行轻松引用,例如从Web控制器到业务对象和验证器。
  • 快速开发 - Spring MVC有助于快速且并行开发。
  • 可重用的业务代码 - 它允许我们使用现有的业务对象,而不是创建新对象。
  • 易于测试 - 在Spring中,通常我们创建JavaBeans类,通过setter方法可以注入测试数据。
  • 灵活的映射 - 它提供特定的注解,可以轻松地重定向页面。

Spring Web MVC 框架示例

让我们看一个Spring Web MVC框架的简单示例。步骤如下:

  • 加载Spring jar文件,或在Maven中添加依赖项
  • 创建控制器类
  • 在web.xml文件中提供控制器的入口
  • 在单独的XML文件中定义bean
  • 在JSP页面中显示消息
  • 启动服务器并部署项目

Spring MVC 的目录结构

directory-structure-of-spring-mvc.png

使用 Maven 的 Spring MVC 目录结构

directory-structure-of-spring-mvc-using-maven.png


所需的 Jar 文件或 Maven 依赖项

要运行此示例,您需要加载以下内容:

  • Spring Core jar 文件
  • Spring Web jar 文件
  • JSP + JSTL jar 文件(如果您使用其他视图技术,请加载相应的 jar 文件)。

下载链接: 下载包括 JSP 和 JSTL 的所有 Spring jar 文件

如果您使用Maven,您无需添加jar文件。现在,您需要将Maven依赖项添加到pom.xml文件中。

1. 在 pom.xml 文件中提供项目信息和配置。

pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">  
  <modelVersion>4.0.0</modelVersion>  
  <groupId>cn.javatiku</groupId>  
  <artifactId>SpringMVC</artifactId>  
  <packaging>war</packaging>  
  <version>0.0.1-SNAPSHOT</version>  
  <name>SpringMVC Maven Webapp</name>  
  <url>http://maven.apache.org</url>  
  <dependencies>  
    <dependency>  
      <groupId>junit</groupId>  
      <artifactId>junit</artifactId>  
      <version>3.8.1</version>  
      <scope>test</scope>  
    </dependency>  
      
    <!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc -->  
<dependency>  
    <groupId>org.springframework</groupId>  
    <artifactId>spring-webmvc</artifactId>  
    <version>5.1.1.RELEASE</version>  
</dependency>  
  
<!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api -->  
<dependency>    
    <groupId>javax.servlet</groupId>    
    <artifactId>servlet-api</artifactId>    
    <version>3.0-alpha-1</version>    
</dependency>  
  
  </dependencies>  
  <build>  
    <finalName>SpringMVC</finalName>  
  </build>  
</project>  

2. 创建控制器类

为了创建控制器类,我们使用了两个注解:@Controller 和 @RequestMapping。

@Controller 注解标记了这个类作为控制器。

@RequestMapping 注解用于将该类映射到指定的URL名称。

HelloController.java

package cn.javatiku;  
import org.springframework.stereotype.Controller;  
import org.springframework.web.bind.annotation.RequestMapping;  
@Controller  
public class HelloController {  
@RequestMapping("/")  
    public String display()  
    {  
        return "index";  
    }     
}  

3. 在 web.xml 文件中提供控制器的入口

在这个xml文件中,我们指定了DispatcherServlet类作为Spring Web MVC中的前端控制器。所有对html文件的传入请求都将转发到DispatcherServlet。

web.xml

<?xml version="1.0" encoding="UTF-8"?>  
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">  
  <display-name>SpringMVC</display-name>  
   <servlet>    
    <servlet-name>spring</servlet-name>    
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>    
    <load-on-startup>1</load-on-startup>      
</servlet>    
<servlet-mapping>    
    <servlet-name>spring</servlet-name>    
    <url-pattern>/</url-pattern>    
</servlet-mapping>    
</web-app>  

4. 在 xml 文件中定义 bean

这是一个重要的配置文件,在这里我们需要指定视图组件。

context:component-scan 元素定义了DispatcherServlet将在其中搜索控制器类的基本包。

这个xml文件应该位于WEB-INF目录中。

spring-servlet.xml

<?xml version="1.0" encoding="UTF-8"?>  
<beans xmlns="http://www.springframework.org/schema/beans"  
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"   
    xmlns:context="http://www.springframework.org/schema/context"  
    xmlns:mvc="http://www.springframework.org/schema/mvc"  
    xsi:schemaLocation="  
        http://www.springframework.org/schema/beans  
        http://www.springframework.org/schema/beans/spring-beans.xsd  
        http://www.springframework.org/schema/context  
        http://www.springframework.org/schema/context/spring-context.xsd  
        http://www.springframework.org/schema/mvc  
        http://www.springframework.org/schema/mvc/spring-mvc.xsd">  
  
    <!-- Provide support for component scanning -->  
    <context:component-scan base-package="cn.javatiku" />  
  
    <!--Provide support for conversion, formatting and validation -->  
    <mvc:annotation-driven/>  
  
</beans>  

5. 在 JSP 页面中显示消息

这是一个简单的JSP页面,显示控制器返回的消息。

index.jsp

<html>  
<body>  
<p>Welcome to Spring MVC Tutorial</p>  
</body>  
</html>  

Output:
spring-mvc-tutorial.png

标签: spring, Spring教程, Spring技术, Spring语言学习, Spring学习教程, Spring下载, Spring框架, Spring框架入门, Spring框架教程, Spring框架高级教程, Spring面试题, Spring笔试题, Spring编程思想