前言
相比我们都了解过自定义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. 作用(重要性)
- 架构模式:降低了代码的耦合性,提高了应用程序的可维护性和可测试性,从而达到高内聚低耦合。
- 灵活性和可扩展性:Spring MVC提供了灵活的配置和扩展机制,框架内置了众多的解决方案和插件,可实现各种功能和扩展,如表单验证、文件上传、权限控制等。
- 请求处理和路由控制:Spring MVC提供了强大的请求处理和路由控制功能,可以将不同类型的请求映射到相应的处理方法上。
- 视图解析和模板引擎:Spring MVC支持多种视图解析技术和模板引擎,如JSP、Thymeleaf、Velocity等,使开发人员能够灵活选择适合项目需求的视图技术。这些视图技术可以将动态数据和静态模板结合起来,生成最终的HTML内容,将结果返回给客户端。
- 处理复杂业务逻辑:Spring MVC提供了方便的数据绑定、表单验证和错误处理等功能,使开发人员能够方便地处理复杂的业务逻辑。通过注解和配置文件,可以实现数据的自动绑定、输入验证和错误处理,提高开发效率和代码质量。
4. 使用步骤
- 添加依赖:在您的项目中添加Spring MVC框架的依赖项。您可以使用构建工具(如Maven或Gradle)来管理依赖关系。确保您的项目中包含了Spring MVC的相关库和依赖项。
- 配置Web.xml:在您的项目的Web.xml文件中配置Spring MVC的DispatcherServlet。DispatcherServlet是Spring MVC的核心组件,负责处理所有的请求和路由控制。您需要配置DispatcherServlet的URL映射和其他相关参数。
- 创建控制器:创建一个或多个控制器类来处理请求。控制器类使用注解或配置文件来定义请求映射和处理方法。您可以在控制器方法中编写业务逻辑,并返回相应的视图或数据。
- 配置视图解析器:配置视图解析器来解析控制器方法返回的视图名称,并生成最终的HTML页面或其他类型的响应。您可以选择使用JSP、Thymeleaf、Velocity等视图技术,并配置相应的解析器。
- 配置其他组件:根据您的需求,配置其他Spring MVC的组件,如数据绑定、表单验证、异常处理等。您可以使用注解或配置文件来定义这些组件的行为和规则。
- 运行项目:将您的项目部署到Web服务器上,并启动服务器。您可以使用任何支Java的Web服务器,如Tomcat、Jetty等。一旦服务器启动,您就可以通过浏览器访问您的项目,并测试Spring MVC的功能。
5. 工作流程及原理
工作流程
- 客户端发送HTTP请求到前端控制器DispatcherServlet。
- DispatcherServlet将请求转发给处理器映射器HandlerMapping,根据配置文件或注解将请求映射到对应的控制器(Controller)。
- 处理器映射器返回一个处理器对象给DispatcherServlet。
- DispatcherServlet调用处理器适配器执行处理器(Controller)。处理器适配器根据请求方法和参数类型选择合适的方法执行。
- 处理器(Controller)执行完后返回一个ModelAndView对象给处理器适配器。
- 处理器适配器将ModelAndView对象返回给DispatcherServlet。
- DispatcherServlet将ModelAndView对象交给视图解析器ViewResolver。
- 视图解析器ViewResolver根据视图名解析出具体的视图对象。
- 视图解析器返回视图对象给DispatcherServlet。
- DispatcherServlet调用视图对象的渲染方法进行视图渲染。
- 渲染完成后将结果返回给客户端。
工作原理
主要基于设计模式中的责任链模式和策略模式。
责任链模式: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>
导入静态资源
测试
本次分享到此结束,感谢各位的支持与鼓励。