一、介绍
1.1什么是SpringMVC?
SpringMVC是一种基于Java的Web开发框架,它是Spring框架的一部分。SpringMVC主要用于开发MVC(模型-视图-控制器)架构的Web应用程序。它提供了一组组件和工具,用于处理HTTP请求和响应,以及实现业务逻辑和用户界面的分离。
SpringMVC的核心思想是将应用程序的不同层次进行分离,使得开发人员可以更加专注于业务逻辑的实现。它通过将请求的处理逻辑委托给控制器类来处理用户请求,并且使用视图模板引擎来渲染响应的视图。
SpringMVC还提供了一些特性和功能,如请求映射、数据绑定、表单验证、国际化支持、文件上传等,以帮助开发人员更加高效地开发Web应用程序。
总之,SpringMVC是一个灵活、可扩展且功能强大的Web开发框架,它可以帮助开发人员快速构建可靠的Web应用程序。
1.2SpringMVC的特点和优势
SpringMVC具有许多特点和优势,使其成为流行的Java Web应用程序开发框架之一:
分层结构:SpringMVC遵循经典的MVC(Model-View-Controller)模式,将应用程序分为模型、视图和控制器,提供了清晰的代码分离,有助于更好地组织和维护应用程序。
松散耦合:SpringMVC通过依赖注入和控制反转(IoC)容器实现松散耦合,使应用程序组件之间的关联更加灵活,容易进行单元测试和替换组件。
注解支持:SpringMVC提供了丰富的注解,如@Controller、@RequestMapping等,使开发者能够轻松配置和映射URL到控制器方法,减少了XML配置的需求,提高了代码的可读性。
灵活的视图解析:SpringMVC支持多种视图技术,允许开发者选择适合项目的视图解析器,包括JSP、FreeMarker、Thymeleaf等。
强大的数据绑定:SpringMVC自动将HTTP请求参数绑定到Java对象,简化了数据传输和验证。它还支持数据格式化和转换。
拦截器:开发者可以定义拦截器来处理请求和响应,执行通用的操作,如身份验证、日志记录、性能监控等。
国际化和本地化:SpringMVC提供了本地化和国际化的支持,允许开发者轻松地创建多语言和多地区的应用程序。
RESTful Web服务支持:SpringMVC具备构建RESTful风格的Web服务的能力,支持HTTP方法映射和内容协商,使开发者能够创建符合REST架构的API。
丰富的生态系统:Spring生态系统提供了许多扩展和插件,如Spring Security(身份验证和授权)、Spring Data(数据访问)、Spring Boot(快速应用程序开发)等,可以与SpringMVC无缝集成。
成熟和广泛采用:SpringMVC是一个成熟的框架,已经在许多大型和小型项目中广泛使用,有大量的社区支持和文档资源可用。
总之,SpringMVC的特点和优势包括了清晰的分层结构、松散耦合、注解支持、灵活的视图解析、强大的数据绑定、拦截器支持、国际化和本地化、RESTful支持以及丰富的生态系统,这些特点使其成为一款强大、灵活且可扩展的Java Web应用程序开发框架。
1.3SpringMVC的应用场景
SpringMVC适用于许多不同类型的Web应用程序开发场景,包括但不限于以下情况:
传统Web应用程序:SpringMVC是构建传统的Web应用程序的理想选择,可以用于创建基于浏览器的用户界面,处理表单提交,展示动态内容等。
RESTful Web服务:SpringMVC提供了强大的支持,可用于构建RESTful风格的Web服务,通过HTTP方法映射和内容协商,使开发者能够创建Web API。
单页应用程序(SPA):当构建单页应用程序时,SpringMVC可以用于提供后端支持,处理RESTful请求和提供数据服务,与前端框架(如React、Angular、Vue.js)一起使用。
微服务架构:在微服务架构中,SpringMVC可以用作微服务的前端控制器,处理外部请求并将其路由到适当的微服务。
企业级应用程序:SpringMVC适用于开发大型企业级应用程序,具备复杂的业务逻辑、安全性需求和数据库交互。
跨平台应用程序:由于Java的跨平台特性,SpringMVC可以用于构建跨不同操作系统和浏览器的Web应用程序。
社交媒体和电子商务:SpringMVC可以用于构建社交媒体平台、在线购物网站和其他需要大量用户交互和数据处理的应用程序。
后端服务:除了Web应用程序,SpringMVC还可以用于构建后端服务,例如RESTful API服务、消息队列消费者等。
移动应用程序后端:SpringMVC可以为移动应用程序提供后端支持,处理移动应用程序的请求和数据交互。
SpringMVC在各个应用场景的作用:
传统Web应用程序:就像建造一座传统的家,有前院、后院、客厅和卧室,每个房间都有不同的用途和功能,例如前院用于展示、后院用于休息,SpringMVC帮助构建这种多功能的Web应用程序,以便满足各种用户需求。
RESTful Web服务:类似于建设一个快递服务,你需要一个中央调度中心来处理所有包裹的分发,SpringMVC的DispatcherServlet就像这个中央调度中心,将不同的HTTP请求分发到合适的处理程序,从而构建出支持RESTful架构的Web服务。
单页应用程序(SPA):想象一下你在设计一个互动式的迷宫游戏,玩家可以在不同房间之间移动,而SpringMVC就像是这个游戏的引导程序,根据玩家的行动将他们引导到正确的房间,从而实现前后端的交互。
微服务架构:将微服务比喻成一组小餐馆,每个餐馆提供特定类型的美食,而SpringMVC就像是这些餐馆的前台服务员,接待顾客并将他们引导到适当的餐馆,确保服务的顺畅。
企业级应用程序:企业级应用程序就像是一家大型百货商店,有各种各样的部门和服务,而SpringMVC则扮演着商店的导购员的角色,帮助顾客找到他们需要的商品并提供帮助。
跨平台应用程序:想象你正在建造一个多功能的游乐场,游客可以来自不同的城市和国家,而SpringMVC就像是游乐场的入口,帮助游客顺利进入并享受不同的游乐设施。
社交媒体和电子商务:社交媒体平台就像一个大型社交聚会,而电子商务网站就像是一个购物中心,SpringMVC充当了活动组织者和购物顾问的角色,协助用户参与社交活动和购物体验。
后端服务:后端服务就像是一个快递中心,处理各种不同类型的包裹和请求,SpringMVC就像是这个中心的管理者,确保包裹按时送达和请求得到处理。
移动应用程序后端:移动应用程序后端就像是一家出租汽车服务,处理不同用户的请求并提供相应的服务,SpringMVC则扮演了服务接待员的角色,协助用户完成他们的需求。
总之,SpringMVC是一款多功能的框架,适用于各种Web应用程序开发场景,从传统的Web应用程序到现代的RESTful API服务,都可以使用它来简化开发工作、提高可维护性和扩展性。它的灵活性和丰富的功能使得它成为Java Web开发的首选框架之一。
二、SpringMVC的基本原理
MVC架构模式简介
MVC(Model-View-Controller)是一种常用的软件架构模式,用于设计和组织应用程序的代码。它将一个应用程序分成三个主要部分,每个部分都有不同的责任和功能,以便实现分离关注点和增强代码的可维护性和可扩展性。
以下是 MVC 架构模式的三个核心组件:
模型(Model):
模型代表应用程序的数据和业务逻辑。
它负责管理数据的存储、检索和处理,以及定义应用程序的核心功能。
模型通常是应用程序的后端组件,负责处理数据持久化、验证和处理。
视图(View):
视图是用户界面的可视部分,负责将数据呈现给用户。
它通常是应用程序的前端组件,负责展示数据、接受用户输入和呈现用户界面。
视图通常不包含业务逻辑,仅负责展示数据和接收用户交互。
控制器(Controller):
控制器是模型和视图之间的中介,负责处理用户的输入和业务逻辑。
它接收用户的请求,将请求传递给相应的模型进行处理,然后更新视图以反映模型的状态变化。
控制器充当了应用程序的协调者,确保模型和视图之间的分离性。
MVC 架构的优势包括:
分离关注点(Separation of Concerns): MVC 将应用程序的不同方面分开,使得代码更易于维护和理解。
可扩展性: 由于各个组件相对独立,因此可以更容易地扩展应用程序的功能。
重用性: 模型、视图和控制器之间的分离使得可以重用这些组件,减少了代码重复。
团队协作: 不同团队成员可以专注于各自的组件,从而提高开发效率。
需要注意的是,MVC 是一种经典的架构模式,有许多变体和衍生版本,如MVC、MVP(Model-View-Presenter)、MVVM(Model-View-ViewModel)等,用于不同的应用场景和技术栈。选择适合项目需求的架构模式是很重要的决策。
SpringMVC的工作流程
客户端发送HTTP请求到前端控制器DispatcherServlet。
DispatcherServlet接收到请求后,根据请求的URL找到对应的处理器HandlerMapping。
HandlerMapping根据请求的URL找到对应的处理器HandlerAdapter。
HandlerAdapter将请求转发给处理器Handler。
Handler根据请求的内容进行处理,并生成ModelAndView对象。
Handler将处理结果封装到ModelAndView对象中,并返回给HandlerAdapter。
HandlerAdapter将ModelAndView对象返回给DispatcherServlet。
DispatcherServlet将ModelAndView对象传递给视图解析器ViewResolver。
ViewResolver根据ModelAndView中的视图名称解析出具体的视图对象View。
View将ModelAndView中的数据渲染到视图中。
View将渲染后的视图返回给DispatcherServlet。
DispatcherServlet将视图返回给客户端。
三、SpringMVC核心组件
Spring MVC 的核心组件包括以下几个关键部分:
DispatcherServlet(前端控制器): DispatcherServlet是整个Spring MVC应用程序的前端控制器,负责接收并分发所有的HTTP请求。它是Spring MVC的入口点,协调整个请求处理过程。
HandlerMapping(处理器映射器): HandlerMapping负责将HTTP请求映射到相应的处理器(Controller)。它根据请求的URL或其他标识来确定应该由哪个Controller来处理请求。
HandlerAdapter(处理器适配器): HandlerAdapter负责执行实际的Controller处理方法。不同类型的Controller(如注解式、基于接口的等)可能需要不同的适配器来执行。
Controller(控制器): Controller是Spring MVC应用程序中的核心组件之一,它包含了应用程序的业务逻辑。Controller接收请求,处理请求,生成ModelAndView对象并将其返回给DispatcherServlet。
ModelAndView(模型与视图): ModelAndView是一个数据模型和视图名称的封装。Controller通常使用ModelAndView来包装要返回的数据模型和视图的名称。
ViewResolver(视图解析器): ViewResolver负责将视图名称解析为实际的视图对象。它根据配置文件或约定来查找视图模板,以便将数据模型渲染为最终的HTML响应。
View(视图): 视图负责将模型数据渲染到页面上,生成最终的HTML或其他响应内容。Spring MVC支持不同类型的视图,包括JSP、Thymeleaf、FreeMarker等。
拦截器(Interceptor): 拦截器允许您在请求处理前和请求处理后执行一些操作。它们用于实现跨越多个请求的通用功能,如身份验证、日志记录等。
ExceptionHandler(异常处理器): 异常处理器用于捕获和处理在请求处理过程中发生的异常。它们允许您定义全局的异常处理策略,以确保应用程序能够 graceful 处理异常情况。
数据绑定与验证(Data Binding and Validation): Spring MVC提供了数据绑定和验证的支持,使您能够将HTTP请求参数绑定到Controller方法的参数,并进行数据验证。
四、SpringMVC中的注解
Spring MVC 中的注解用于配置和定义控制器、请求映射、路径变量、请求参数等方面。以下是Spring MVC中常用的注解:
@Controller: 用于标识一个类为控制器,告诉Spring容器将其作为一个可处理HTTP请求的组件。通常与@RequestMapping一起使用。
@RequestMapping: 用于将请求映射到控制器方法。可以用于类级别和方法级别。它可以指定请求的URL路径、HTTP方法、请求参数等条件。
@GetMapping、@PostMapping、@PutMapping、@DeleteMapping: 这些注解用于分别映射GET、POST、PUT和DELETE请求。它们是@RequestMapping的缩写形式。
@PathVariable: 用于从URL路径中提取路径变量的值。例如,@GetMapping("/user/{id}")中的{id}可以通过@PathVariable注解获取。
@RequestParam: 用于从请求参数中获取值。可以指定参数名称和默认值。例如,@RequestParam("name") String userName会从请求参数中获取名为"name"的值,并将其赋给userName变量。
@RequestBody: 用于将HTTP请求体的内容绑定到Java对象。通常在处理POST请求时使用,将JSON或表单数据转换为对象。
@ResponseBody: 用于将Java对象的内容转换为HTTP响应体。通常在返回JSON或XML响应时使用。
@ModelAttribute: 用于在控制器方法中将模型属性添加到模型中,以便在视图中使用。可以用于方法参数和方法级别。
@SessionAttributes: 用于将模型属性保存到会话中,以便多个请求之间共享数据。
@Valid和@Validated: 用于启用数据验证,通常与Spring的验证框架一起使用,如Hibernate Validator。
@InitBinder: 用于自定义数据绑定规则,通常用于日期格式化、数据转换等自定义绑定操作。
@ResponseStatus: 用于指定HTTP响应的状态码和原因短语。
@ExceptionHandler: 用于捕获和处理特定异常类型的方法,以提供全局异常处理。
@CrossOrigin: 用于启用跨域请求支持,允许跨域请求访问控制器方法。
五、SpringMVC入门
5.1.添加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>org.example</groupId> <artifactId>mybatis_spring</artifactId> <packaging>war</packaging> <version>1.0-SNAPSHOT</version> <name>mybatis_spring Maven Webapp</name> <url>http://maven.apache.org</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> <!-- 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> <!-- 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>mybatis_spring</finalName> </build> </project>
5.2.创建spring-mvc.xml
<?xml version="1.0" encoding="UTF-8"?> <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" xmlns="http://www.springframework.org/schema/beans" 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及子子孙孙包下的控制器(扫描范围过大,耗时) 配置了Spring框架的组件扫描功能,指定了需要扫描的包路径。Spring将会自动扫描这个包及其子包中的类,并将其注册为Spring的组件。 --> <context:component-scan base-package="com.ctb"/> <!--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="/css/" mapping="/css/**"/> <mvc:resources location="/js/" mapping="/js/**"/> <mvc:resources location="WEB-INF/images/" mapping="/images/**"/> </beans>
5. 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>
5.4编写web层
package com.liao.web; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; @Controller @RequestMapping("/mvc") public class Springmvc1 { @RequestMapping("/print") public String test(){ return "hello。world"; } }
六.静态资源处理
所有静态资源文件都会被spring-mvc.xml配置文件进行拦截,所以要添加配置,让处理器进行扫描,专门处理图片、样式、js等资源...
<mvc:resources location="/css/" mapping="/css/**"/> <mvc:resources location="/js/" mapping="/js/**"/> <mvc:resources location="WEB-INF/images/" mapping="/images/**"/>
七、总结
SpringMVC的优势和不足
Spring MVC的优势包括:
灵活性:Spring MVC采用了松耦合的设计,可以与其他框架和技术无缝集成,如Spring框架、Hibernate、MyBatis等。
可扩展性:Spring MVC使用了基于接口的设计,可以方便地进行自定义扩展,满足不同项目的需求。
易于测试:Spring MVC的控制器和业务逻辑可以通过单元测试进行测试,提高代码质量和可维护性。
强大的请求处理能力:Spring MVC提供了丰富的注解和配置选项,可以灵活地处理各种类型的请求,如GET、POST、PUT、DELETE等。
响应速度快:Spring MVC使用了基于注解的处理方式,可以提高请求的响应速度
。Spring MVC的不足包括:
学习曲线较陡峭:相比于其他简单的框架,Spring MVC的学习曲线较陡峭,需要对Spring框架的核心概念和设计原理有一定的了解。
配置繁琐:Spring MVC的配置文件较多,需要进行详细的配置,对于初学者来说可能会感到繁琐。
缺乏一些高级特性:相比于其他一些主流的Web框架,如Spring Boot、Node.js等,Spring MVC在某些高级特性方面可能有所欠缺。
性能较低:相比于一些轻量级的Web框架,如Play Framework、Express.js等,Spring MVC的性能可能较低一些,特别是在高并发的情况下。
线程模型不够灵活:Spring MVC采用的是传统的Servlet线程模型,每个请求都会创建一个线程,对于大量的并发请求可能会导致线程资源的浪费。