SpringMVC之入门(带你体验SpringMVC的乐趣)

本文涉及的产品
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
云数据库 RDS MySQL Serverless,价值2615元额度,1个月
简介: SpringMVC之入门(带你体验SpringMVC的乐趣)



前言

相比我们都了解过自定义MVC框架的一些知识,也体会到自定义MVC自定义框架在一些领域上的编程开发给我们带来的便利与效率。今天我要给大家分享的是和自定义MVC框架相似的架——SpringMVC框架,让我一起来体会SpringMVC框架带我们意想不到的收获吧。

一、SpringMVC简介

1. 概念

Spring MVC是Spring Framework的一个模块,用于快速开发Web应用程序。它是一个基于Java的MVC框架,采用了经典的模型-视图-控制器(Model-View-Controller)设计模式

在Spring MVC中,模型(Model)用于封装业务数据和逻辑,负责处理数据的读写、验证和存取等。视图(View)负责展示数据给用户,通常是通过生成HTML页面或返回JSON/XML数据给客户端进行展示。控制器(Controller)接收用户的请求,根据请求的类型和参数来调用相应的处理逻辑,并最终将处理结果返回给视图进行展示。

Spring MVC提供了一个灵活的、松散耦合的框架,使开发人员可以轻松地构建可维护和可测试的Web应用程序。它支持多种配置方式,可以使用注解或配置文件来定义请求映射、处理方法和视图解析器等。同时,Spring MVC还提供了丰富的功能和工具,例如表单验证、文件上传、RESTful API的支持等,使开发人员能够更加高效地开发Web应用。

总的来说,Spring MVC是一个强大而灵活的Java Web开发框架,它简化了开发过程并提供了许多有用的功能,使开发人员能够快速构建出高质量的Web应用程序。

2.应用领域

SpringMVC应用领域

领域 说明
企业级Web应用程序

Spring MVC适用于构建企业级的Web应用程序,可以轻松处理复杂的业务逻辑和数据处理。它提供了丰富的功能和工具,使得开发人员能够高效地构建可扩展和可维护的应用。

RESTful API开发 Spring MVC对于构建RESTful风格的API非常适用。它提供了强大的请求映射和参数处理功能,可以方便地处理GET、POST、PUT、DELETE等HTTP请求,并支持内容协商、版本控制和异常处理等需求。
单页应用程序 随着前端技术的发展,越来越多的Web应用采用单页应用(Single Page Application,SPA)的架构。Spring MVC可以作为后端服务提供数据和业务逻辑支持,与前端框架(如Angular、React或Vue.js)进行集成,实现完整的单页应用。
电子商务平台 Spring MVC提供了灵活的数据处理和视图展示功能,适用于构建电子商务平台。开发人员可以使用Spring MVC处理购物车、订单管理、支付集成等功能,并通过模板引擎(如Thymeleaf)生成动态的HTML页面。
社交网络应用 Spring MVC可以用于构建社交网络应用,例如用户注册、登录、账号管理、好友关系、消息通知等功能。Spring MVC提供了用户认证和授权的支持,并可以与第三方登录(如OAuth)进行集成。

3. 作用(重要性)

  1. 架构模式降低了代码的耦合性,提高了应用程序的可维护性和可测试性,从而达到高内聚低耦合。
  2. 灵活性和可扩展性Spring MVC提供了灵活的配置和扩展机制,框架内置了众多的解决方案和插件,可实现各种功能和扩展,如表单验证、文件上传、权限控制等。
  3. 请求处理和路由控制:Spring MVC提供了强大的请求处理和路由控制功能,可以将不同类型的请求映射到相应的处理方法上。
  4. 视图解析和模板引擎:Spring MVC支持多种视图解析技术和模板引擎,如JSP、Thymeleaf、Velocity等,使开发人员能够灵活选择适合项目需求的视图技术。这些视图技术可以将动态数据和静态模板结合起来,生成最终的HTML内容,将结果返回给客户端。
  5. 处理复杂业务逻辑:Spring MVC提供了方便的数据绑定、表单验证和错误处理等功能,使开发人员能够方便地处理复杂的业务逻辑。通过注解和配置文件,可以实现数据的自动绑定、输入验证和错误处理,提高开发效率和代码质量。

4. 使用步骤

  1. 添加依赖:在您的项目中添加Spring MVC框架的依赖项。您可以使用构建工具(如Maven或Gradle)来管理依赖关系。确保您的项目中包含了Spring MVC的相关库和依赖项。
  2. 配置Web.xml:在您的项目的Web.xml文件中配置Spring MVC的DispatcherServlet。DispatcherServlet是Spring MVC的核心组件,负责处理所有的请求和路由控制。您需要配置DispatcherServlet的URL映射和其他相关参数。
  3. 创建控制器:创建一个或多个控制器类来处理请求。控制器类使用注解或配置文件来定义请求映射和处理方法。您可以在控制器方法中编写业务逻辑,并返回相应的视图或数据。
  4. 配置视图解析器:配置视图解析器来解析控制器方法返回的视图名称,并生成最终的HTML页面或其他类型的响应。您可以选择使用JSP、Thymeleaf、Velocity等视图技术,并配置相应的解析器。
  5. 配置其他组件:根据您的需求,配置其他Spring MVC的组件,如数据绑定、表单验证、异常处理等。您可以使用注解或配置文件来定义这些组件的行为和规则。
  6. 运行项目:将您的项目部署到Web服务器上,并启动服务器。您可以使用任何支Java的Web服务器,如Tomcat、Jetty等。一旦服务器启动,您就可以通过浏览器访问您的项目,并测试Spring MVC的功能。

5. 工作流程及原理

工作流程

  1. 客户端发送HTTP请求到前端控制器DispatcherServlet。
  2. DispatcherServlet将请求转发给处理器映射器HandlerMapping,根据配置文件或注解将请求映射到对应的控制器(Controller)。
  3. 处理器映射器返回一个处理器对象给DispatcherServlet。
  4. DispatcherServlet调用处理器适配器执行处理器(Controller)。处理器适配器根据请求方法和参数类型选择合适的方法执行。
  5. 处理器(Controller)执行完后返回一个ModelAndView对象给处理器适配器。
  6. 处理器适配器将ModelAndView对象返回给DispatcherServlet。
  7. DispatcherServlet将ModelAndView对象交给视图解析器ViewResolver。
  8. 视图解析器ViewResolver根据视图名解析出具体的视图对象。
  9. 视图解析器返回视图对象给DispatcherServlet。
  10. DispatcherServlet调用视图对象的渲染方法进行视图渲染。
  11. 渲染完成后将结果返回给客户端。

工作原理

主要基于设计模式中的责任链模式和策略模式

责任链模式:DispatcherServlet作为前端控制器,通过处理器映射器和处理器适配器的责任链,将请求转发给合适的处理器(Controller)进行处理。

策略模式:处理器映射器和处理器适配器使用策略模式来选择合适的处理器(Controller)方法进行执行。

工作流程图

二、SpringMVC入门(项目整合)

1. 导入依赖

pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<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/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.yx</groupId>
  <artifactId>yx_ssm</artifactId>
  <version>1.0-SNAPSHOT</version>
  <packaging>war</packaging>
  <name>yx_ssm Maven Webapp</name>
  <!-- FIXME change it to the project's website -->
  <url>http://www.example.com</url>
  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.source>1.8</maven.compiler.source>
    <maven.compiler.target>1.8</maven.compiler.target>
    <maven.compiler.plugin.version>3.7.0</maven.compiler.plugin.version>
    <!--添加jar包依赖-->
    <!--1.spring 5.0.2.RELEASE相关-->
    <spring.version>5.0.2.RELEASE</spring.version>
    <!--2.mybatis相关-->
    <mybatis.version>3.4.5</mybatis.version>
    <!--mysql-->
    <mysql.version>5.1.44</mysql.version>
    <!--pagehelper分页jar依赖-->
    <pagehelper.version>5.1.2</pagehelper.version>
    <!--mybatis与spring集成jar依赖-->
    <mybatis.spring.version>1.3.1</mybatis.spring.version>
    <!--3.dbcp2连接池相关 druid-->
    <commons.dbcp2.version>2.1.1</commons.dbcp2.version>
    <commons.pool2.version>2.4.3</commons.pool2.version>
    <!--4.log日志相关-->
    <log4j2.version>2.9.1</log4j2.version>
    <!--5.其他-->
    <junit.version>4.12</junit.version>
    <servlet.version>4.0.0</servlet.version>
    <lombok.version>1.18.2</lombok.version>
    <!-- jstl+standard -->
    <jstl.version>1.2</jstl.version>
    <standard.version>1.1.2</standard.version>
    <!-- spring -->
    <spring.version>5.0.2.RELEASE</spring.version>
  </properties>
  <dependencies>
    <!--1.spring相关-->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-context</artifactId>
      <version>${spring.version}</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-orm</artifactId>
      <version>${spring.version}</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-tx</artifactId>
      <version>${spring.version}</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-aspects</artifactId>
      <version>${spring.version}</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-web</artifactId>
      <version>${spring.version}</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-test</artifactId>
      <version>${spring.version}</version>
    </dependency>
    <!--2.mybatis相关-->
    <dependency>
      <groupId>org.mybatis</groupId>
      <artifactId>mybatis</artifactId>
      <version>${mybatis.version}</version>
    </dependency>
    <!--mysql-->
    <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <version>${mysql.version}</version>
    </dependency>
    <!--pagehelper分页插件jar包依赖-->
    <dependency>
      <groupId>com.github.pagehelper</groupId>
      <artifactId>pagehelper</artifactId>
      <version>${pagehelper.version}</version>
    </dependency>
    <!--mybatis与spring集成jar包依赖-->
    <dependency>
      <groupId>org.mybatis</groupId>
      <artifactId>mybatis-spring</artifactId>
      <version>${mybatis.spring.version}</version>
    </dependency>
    <!--3.dbcp2连接池相关-->
    <dependency>
      <groupId>org.apache.commons</groupId>
      <artifactId>commons-dbcp2</artifactId>
      <version>${commons.dbcp2.version}</version>
    </dependency>
    <dependency>
      <groupId>org.apache.commons</groupId>
      <artifactId>commons-pool2</artifactId>
      <version>${commons.pool2.version}</version>
    </dependency>
    <!--4.log日志相关依赖-->
    <!--核心log4j2jar包-->
    <dependency>
      <groupId>org.apache.logging.log4j</groupId>
      <artifactId>log4j-core</artifactId>
      <version>${log4j2.version}</version>
    </dependency>
    <dependency>
      <groupId>org.apache.logging.log4j</groupId>
      <artifactId>log4j-api</artifactId>
      <version>${log4j2.version}</version>
    </dependency>
    <!--web工程需要包含log4j-web,非web工程不需要-->
    <dependency>
      <groupId>org.apache.logging.log4j</groupId>
      <artifactId>log4j-web</artifactId>
      <version>${log4j2.version}</version>
    </dependency>
    <!--5.其他-->
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>${junit.version}</version>
      <scope>test</scope>
    </dependency>
    <dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>javax.servlet-api</artifactId>
      <version>${servlet.version}</version>
      <scope>provided</scope>
    </dependency>
    <dependency>
      <groupId>org.projectlombok</groupId>
      <artifactId>lombok</artifactId>
      <version>${lombok.version}</version>
      <scope>provided</scope>
    </dependency>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.12</version>
      <scope>compile</scope>
    </dependency>
    <!-- spring mvc相关依赖 -->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-webmvc</artifactId>
      <version>${spring.version}</version>
    </dependency>
    <dependency>
      <groupId>jstl</groupId>
      <artifactId>jstl</artifactId>
      <version>${jstl.version}</version>
    </dependency>
    <dependency>
      <groupId>taglibs</groupId>
      <artifactId>standard</artifactId>
      <version>${standard.version}</version>
    </dependency>
  </dependencies>
  <build>
    <finalName>yx_ssm</finalName>
    <resources>
      <!--解决mybatis-generator-maven-plugin运行时没有将XxxMapper.xml文件放入target文件夹的问题-->
      <resource>
        <directory>src/main/java</directory>
        <includes>
          <include>**/*.xml</include>
        </includes>
      </resource>
      <!--解决mybatis-generator-maven-plugin运行时没有将jdbc.properites文件放入target文件夹的问题-->
      <resource>
        <directory>src/main/resources</directory>
        <includes>
          <include>jdbc.properties</include>
          <include>*.xml</include>
        </includes>
      </resource>
    </resources>
      <plugins>
        <plugin>
          <groupId>org.apache.maven.plugins</groupId>
          <artifactId>maven-compiler-plugin</artifactId>
          <version>${maven.compiler.plugin.version}</version>
          <configuration>
            <source>${maven.compiler.source}</source>
            <target>${maven.compiler.target}</target>
            <encoding>${project.build.sourceEncoding}</encoding>
          </configuration>
        </plugin>
        <plugin>
          <groupId>org.mybatis.generator</groupId>
          <artifactId>mybatis-generator-maven-plugin</artifactId>
          <version>1.3.2</version>
          <dependencies>
            <!--使用Mybatis-generator插件不能使用太高版本的mysql驱动 -->
            <dependency>
              <groupId>mysql</groupId>
              <artifactId>mysql-connector-java</artifactId>
              <version>${mysql.version}</version>
            </dependency>
          </dependencies>
          <configuration>
            <overwrite>true</overwrite>
          </configuration>
        </plugin>
        <plugin>
          <artifactId>maven-clean-plugin</artifactId>
          <version>3.1.0</version>
        </plugin>
        <!-- see http://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_war_packaging -->
        <plugin>
          <artifactId>maven-resources-plugin</artifactId>
          <version>3.0.2</version>
        </plugin>
        <plugin>
          <artifactId>maven-compiler-plugin</artifactId>
          <version>3.8.0</version>
        </plugin>
        <plugin>
          <artifactId>maven-surefire-plugin</artifactId>
          <version>2.22.1</version>
        </plugin>
        <plugin>
          <artifactId>maven-war-plugin</artifactId>
          <version>3.2.2</version>
        </plugin>
        <plugin>
          <artifactId>maven-install-plugin</artifactId>
          <version>2.5.2</version>
        </plugin>
        <plugin>
          <artifactId>maven-deploy-plugin</artifactId>
          <version>2.8.2</version>
        </plugin>
      </plugins>
  </build>
</project>

注:

缺少jstl+standard的这两个jar包会报java.lang.NoClassDefFoundError: javax/servlet/jsp/jstl/core/Config,那是因为org.springframework.web.servlet.view.JstlView在视图解析时需要这二个jar包。

2. 编写配置spring-mvc.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-4.3.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd">
    <!--1) 扫描com.zking.zf及子子孙孙包下的控制器(扫描范围过大,耗时)-->
    <context:component-scan base-package="com.yx"/>
    <!--2) 此标签默认注册DefaultAnnotationHandlerMapping和AnnotationMethodHandlerAdapter -->
    <mvc:annotation-driven />
    <!--3) 创建ViewResolver视图解析器 -->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <!-- viewClass需要在pom中引入两个包:standard.jar and jstl.jar -->
        <property name="viewClass"
                  value="org.springframework.web.servlet.view.JstlView"></property>
        <property name="prefix" value="/WEB-INF/jsp/"/>
        <property name="suffix" value=".jsp"/>
    </bean>
</beans>

3. 配置web.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
         version="3.1">
  <display-name>Archetype Created Web Application</display-name>
  <!-- Spring和web项目集成start -->
  <!-- spring上下文配置文件 -->
  <context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath:spring-context.xml</param-value>
  </context-param>
  <!-- 读取Spring上下文的监听器 -->
  <listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  </listener>
  <!-- Spring和web项目集成end -->
  <!-- 中文乱码处理 -->
  <filter>
    <filter-name>encodingFilter</filter-name>
    <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
    <async-supported>true</async-supported>
    <init-param>
      <param-name>encoding</param-name>
      <param-value>UTF-8</param-value>
    </init-param>
  </filter>
  <filter-mapping>
    <filter-name>encodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>
  <!-- Spring MVC servlet -->
  <servlet>
    <servlet-name>SpringMVC</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <!--此参数可以不配置,默认值为:/WEB-INF/springmvc-servlet.xml-->
    <init-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>classpath:spring-mvc.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
    <!--web.xml 3.0的新特性,是否支持异步-->
    <async-supported>true</async-supported>
  </servlet>
  <servlet-mapping>
    <servlet-name>SpringMVC</servlet-name>
    <url-pattern>/</url-pattern>
  </servlet-mapping>
</web-app>

4. IndexController 代码

package com.yx.web;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
/**
 * @author 君易--鑨
 * @site www.yangxin.com
 * @company 木易
 * @create  2023-09-04 18:58
 *
 * @Controller 替换了自定义MVC中的
 *  extend ActionSupport
 */
@Controller
@RequestMapping("/book")
public class IndexController {
//  首页
    @RequestMapping("/hello")
    public String hello(){
        System.out.println("hello SpringMVC...");
        return "hello";
    }
}

5. jsp代码

<%--
  Created by IntelliJ IDEA.
  User: 86158
  Date: 2023/9/4
  Time: 19:04
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
你好!君易----鑨
</body>
</html>

6. 测试结果

页面结果

输出结果

三、静态资源处理

spring-mvc.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-4.3.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd">
    <!--1) 扫描com.zking.zf及子子孙孙包下的控制器(扫描范围过大,耗时)-->
    <context:component-scan base-package="com.yx"/>
    <!--2) 此标签默认注册DefaultAnnotationHandlerMapping和AnnotationMethodHandlerAdapter -->
    <mvc:annotation-driven />
    <!--3) 创建ViewResolver视图解析器 -->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <!-- viewClass需要在pom中引入两个包:standard.jar and jstl.jar -->
        <property name="viewClass"
                  value="org.springframework.web.servlet.view.JstlView"></property>
        <property name="prefix" value="/WEB-INF/jsp/"/>
        <property name="suffix" value=".jsp"/>
    </bean>
    <!--4) 单独处理图片、样式、js等资源 -->
     <mvc:resources location="/static/" mapping="/static/**"/>
</beans>

导入静态资源

测试

本次分享到此结束,感谢各位的支持与鼓励。

目录
相关文章
|
4月前
|
前端开发 Java Maven
SpringMVC之入门搭建框架
SpringMVC之入门搭建框架
|
7月前
|
设计模式 前端开发 Java
一篇文章教会你SpringMVC
一篇文章教会你SpringMVC
32 0
|
8月前
|
Java 网络安全 Spring
SSH框架学习中遇到的问题
SSH框架学习中遇到的问题
32 0
|
10月前
|
存储 JSON 前端开发
SpringMVC 程序开发:为什么要学SpringMVC?如何学SpringMVC?
SpringMVC 程序开发:为什么要学SpringMVC?如何学SpringMVC?
QGS
|
12月前
|
XML JSON 前端开发
手搭手入门SpringMVC
关于Tomcat服务器的目录 bin: 该目录是Tomcat服务器的命令文件存放的目录,打开关闭Tomcat conf: 该目录是Tomcat服务器的配置文件存放目录。(Server.xml文件中可以配置端口号,默认Tomcat端口是8080)
QGS
63 0
|
XML 前端开发 Java
易懂-SpringMvc介绍和简单搭建
易懂-SpringMvc介绍和简单搭建
|
前端开发 Java 程序员
|
Java
struts2入门教学
struts2入门教学
84 0
struts2入门教学
|
前端开发
【SSM直击大厂】第四章:SpringMVC快速入门
SpringMVC的相关组件 • 前端控制器:DispatcherServlet • 处理器映射器:HandlerMapping • 处理器适配器:HandlerAdapter • 处理器:Handler • 视图解析器:View Resolver • 视图:View SpringMVC的注解和配置 • 请求映射注解:@RequestMapping • 视图解析器配置: REDIRECT_URL_PREFIX = "redirect:" FORWARD_URL_PREFIX = "forward:" prefix = ""; suffix = "";
77 0
|
前端开发 Java 程序员
硬核!一文看懂SpringMVC
本文主要介绍 SprinMVC
94 0