✅作者简介:热爱Java后端开发的一名学习者,大家可以跟我一起讨论各种问题喔。
🍎个人主页:Hhzzy99
🍊个人信条:坚持就是胜利!
💞当前专栏:【Spring】
🥭本文内容:SpringMVC上部分内容的学习,助你逐步深入Spring全家桶之二——SpringMVC
文章目录
在前文中我们已经学习过Sping框架了(IoC和DI还有AOP),想了解的同学可以去我的专栏查看传送门🚩
SpringMVC是隶属于
Spring框架
的一部分,主要是用来进行Web开发,是对Servlet进行了封装。
SpringMVC是处于Web层
的框架,所以其主要的作用就是用来接收前端发过来的请求和数据然后经过处理并将处理的结果响应给前端,所以如何处理请求和响应是SpringMVC中非常重要的一块内容。
这篇文章我将带领大家一起学习SpringMVC
SpringMVC概述
SpringMVC是Spring提供的一个轻量级Web框架,它实现了WebMVC设计模式
。它是一个开源的Java平台,为开发强大的基于Java的Web应用程序提供全面的基础架构支持非常容易和非常快速。它在使用和性能等方面比另一个框架Struts2更加优异。
SpringMVC特点
- 是Spring框架的一部分,可以方便的利用Spring所提供的其他功能
- 灵活性强,易于与其他框架集成
- 提供了一个前端控制器
DispatcherServlet
, 使开发人员无须额外开发控制器对象。 - 可自动绑定用户输入,并能正确地转换数据类型。
- 内置了常见的校验器,可以校验用户输入。如果校验不能通过,就会复位向到输入表单。
- 持国际化,可以根据用户区域显示多国语言
- 支持多种视图技术,如JSP、Velocity 和 FreeMarker 等视图技术。
- 使用基于
XML
的配置文件,在编辑后,不需要重新编译应用程序
了解了SpringMVC的概念和特点之后,接下来我们做一个简单的入门案例
第一步:创建一个Maven项目
注意: 这样使用骨架创建出来的项目结构是不完整的
我们需要补全目录
第二步:在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/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0modelVersion> <groupId>com.hzygroupId> <artifactId>springMvc_quickstartartifactId> <version>1.0-SNAPSHOTversion> <packaging>warpackaging> <properties> <project.build.sourceEncoding>UTF-8project.build.sourceEncoding> <maven.compiler.source>11maven.compiler.source> <maven.compiler.target>11maven.compiler.target> properties> <dependencies> <dependency> <groupId>junitgroupId> <artifactId>junitartifactId> <version>4.11version> <scope>testscope> dependency> <dependency> <groupId>javax.servletgroupId> <artifactId>javax.servlet-apiartifactId> <version>3.1.0version> <scope>providedscope> dependency> <dependency> <groupId>org.springframeworkgroupId> <artifactId>spring-webmvcartifactId> <version>5.2.10.RELEASEversion> dependency> dependencies>project>
第三步:配置前端控制器
在web.xml中配置SpringMVC的前端控制器DispatcherServlet。
<web-app> <display-name>Archetype Created Web Applicationdisplay-name> <servlet> <servlet-name>springmvcservlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServletservlet-class> <init-param> <param-name>contextConfigLocationparam-name> <param-value>classpath:springmvc-config.xmlparam-value> init-param> <load-on-startup>1load-on-startup> servlet> <servlet-mapping> <servlet-name>springmvcservlet-name> <url-pattern>/url-pattern> servlet-mapping>web-app>
web.xml中主要对
和
元素进行了配置。在
中配置了 Spring MVC 的前端控制器 DispatcherServlet
,并通过其子元素
配置了 Spring MVC 配置文件的位置,
元素中的'1'
表示容器在启动时立即加载这个 Servlet:在
中,通过
元素的/
拦截所有 URL,并交由 DispatcherServlet 处理。
第四步:创建Controller类
在src下创建com.hzy.controller包,创建ControllerTest。
package com.hzy.controller;import org.springframework.web.servlet.ModelAndView;import org.springframework.web.servlet.mvc.Controller;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;public class ControllerTest implements Controller { @Override public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception { //创建ModelAndView对象 ModelAndView m = new ModelAndView(); //向模型中添加一个名称为msg的字符串对象 m.addObject("msg","这是第一个SpringMVC程序"); //设置返回路径 m.setViewName("/WEN-INF/welcome.jsp"); return m; }}
handleRequest()是 Controller 接口的实现方法,ControllerTest 类会调用该方法 处理请求,并返回一个包含视图名或包含视图名与模型的 ModelAndView 对象。本案例向模型对象 中添加了一个名称为 msg 的字符串对象,并设置返回的视图路径为 WEB-INF/welcome. jsp,这样 请求就会被转发到 welcome. jsp 页面。
第五步:创建springmvc-config.xml
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <bean name="/controllerTest" class="com.hzy.controller.ControllerTest"/> <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/> <bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"/> beans>
首先定义了一个名称为 ControllerTest
的 Bean,该 Bean 会将控制器类 ControllerTest 映射到 /controllerTest
请求中:然后配置了处理器映射器 BeanNameUrIHandlerMapping
和处理器适配器 SimpleControllerHandlerAdapter
, 其中处理器映射器用 于将处理器 Bean 中的的 name (即 url)进行处理器查找,而处理器适配器用于完成对 ControllerTest 处理器中 handleRequesto方法的调用;最后配置了视图解析器 InternalResourceViewResolver
来解析结果视图,并将结果呈现给用户。
第六步:创建视图(View)页面
在WEB-INF目录下创建一个页面文件welcome.jsp,在该页面中使用EL表达式获取msg的信息
<%@ page contentType="text/html;charset=UTF-8" language="java" pageEncoding="UTF-8" %><%@ page isELIgnored="false" %> Title ${msg}
最后:配置Tomcat,启动项目
运行结果:
通过入门案例的学习,我们总结一下SpringMVC程序的执行流程:
- 用户通过浏览器向服务器发送请求,请求会被 SpringMVC 的前端控制器
DispatcherServiet
所拦截 DispatcherServlet
拦截到请求后,会调用HandlerMapping
处理器映射器。- 处理器映射器根据请求 URL找到具体的处理器,生成处理器对象及处理器拦截器(如果有就生成)一并返回给
DispatcherServlet
。 DispatcherServlet
会通过返回信息选择合适的HandlerAdapter
(处理器适配器)HandlerAdapter
会调用并执行 Handler(处理器),这里的处理器就是程序中编写的 Controller 类,也被称为后端控制器。- Controller 执行完成后,会返回一个
ModelAndView
对象,该对象中包含视图名或包含模 利与视图名。 HandlerAdapter
将ModelAndView
对象返回给DispatcherServlet
DispatcherServlet
会根据ModelAndView
对象选择一个合适的ViewResolver
(视图解析器)。ViewResolver
解析后,会向DispatcherServlet
中返回具体的 View(视图)。
10.DispatcherServlet
对 View 进行渲染(即将模型数据填充至视图中)- 视图渲染结果会返回给客户端浏览器显示。
在上述执行过程中,DispatcherServlet
、HandlerMapping
、HandlerAdapter
和 ViewResolver
对象的工作是在框架内部执行的,开发人员并不需要关心这些对象内部的实现过程,只需要配置前端控制器(DispatcherServlet),完成Controller中的业务处理,并在视图(View)中展示相应信息即可。
注:
大家都发现了,这种方式实现整个程序还是比较麻烦的。
在 Spring 2.5 之前,只能使用实现 Controller 接口的方式来开发一个控制器,我们的入门案例就是使用的这种方式。在 Spring 2.5 之后,新增加了基于注解的控制器以及其他一些常用注解,这些注解的使用极大地减少了程序员的开发工作。接下来我将详细的讲解 SpringMVC 中的常用核心类及其常用注解。
@Controller
名称 | @Controller |
---|---|
类型 | 类注解 |
位置 | SpringMVC控制器类定义上方 |
作用 | 设定SpringMVC的核心控制器bean |
org.springframework.stereotype.Controller
注解类型用于指示 Spring类的实例是一个控制器,其注解形式为@Controller
。该注解在使用时不需要再实现 Controller 接口,只需要将@Controller
注解加入控制器类上,然后通过 Spring的扫描机制找到标注了该注解的控制器即可。
示例:
package com.hzy.controller;import org.springframework.stereotype.Controller;......//Controller注解@Controllerpublic class ControllerTest{...}
为了保证 Spring
能够多找到控制器类,还需要在Spring MVC
的配置文件中添加相应的扫描配置信息,具体如下。
(1)在配置文件的声明中引入 spring-context
(2)使用
元素指定需要扫描的类包。
示例:
<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" 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 "> <context:component-scan base-package="com.hzy.controller"/>beans>
元素的属性base-package指定了需要扫描的包为:com.hzy.controller。在运行时改包及子包下的所有标注了注解的类都会被Spring处理。
@RequestMapping
名称 | @RequestMapping |
---|---|
类型 | 类注解或方法注解 |
位置 | SpringMVC控制器类或方法定义上方 |
作用 | 设置当前控制器方法请求访问路径 |
相关属性 | value(默认),请求访问路径 |
示例:
import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.RequestMapping;@Controller//注解@RequestMapping("/book")//标注在类上public class BookController { @RequestMapping("/save")//标注在方法上public String save(){...}}
在类上标注了@RequestMapping("/book")
,则我们可以通过http://localhost:8080/book
进行访问,在方法上标注@RequestMapping("/save")
,我们可以用http://localhost:8080/book/save
访问。
@RequestMapping注解的属性
属性名 | 类型 | 描述 |
---|---|---|
name | String | 可选属性,用于为映射地址指定别名 |
value | String[] | 可选属性,同时也是默认属性,用于映射一个请求和一种方法,可以标注在一个方法或一个类上。 |
method | RequestMethod[] | 可选属性,用于指定该方法用于处理哪种类型的请求方式,其请求方式包括 GET、POST、HEAD、OPTIONS、PUT、 PATCH、 DELETE 和和TRACE,例如method= RequestMethod.GET 表示只支持 GET 请求, 如果需要支持多个请求方式,就需要通过{} 写成数组的形式,并且多个请求方式之间是有英文逗号分隔的 |
params | String[] | 可选属性,用于指定 Request 中必须包含某些参数的值,才可以通过其标注的方法处理 |
headers | String[] | 可选属性,用于指定 Request 中必须包含某些指定的header 的值,才可以通过其标注的方法处理 |
consumes | String[] | 可选属性,用于指定处理请求的提交内容类型 (Content-Type ),比如 application/json, text/html 等 |
produces | String[] | 可选属性,用于指定返回的内容类型,返回的内容类型必须是 request请求头(Accept)中所包含的类型 |
组合注解:
请求 | 组合注解 | 共享注解 |
---|---|---|
GET | @GetMapping | @RequestMapping(method = RequestMethod.GET) |
POST | @PostMapping | @RequestMapping(method = RequestMethod.POST) |
PUT | @PutMapping | @RequestMapping(method = RequestMethod.PUT) |
DELETE | @DeleteMapping | @RequestMapping(method = RequestMethod.DELETE) |
PATCH | @PatchMapping | @RequestMapping(method = RequestMethod.PATCH) |
@ResponseBody
名称 | @ResponseBody |
---|---|
类型 | 类注解或方法注解 |
位置 | SpringMVC控制器类或方法定义上方 |
作用 | 设置当前控制器方法响应内容为当前返回值,无需解析 |
示例:
@Controller@RequestMapping("/book")public class BookController { @RequestMapping("/save") @ResponseBody public String save(){//System.out.println("book save ..."); return "{'module':'book save'}";}
@RequestParam
@RequestParam主要用于数据绑定
属性 | 说明 |
---|---|
value | name 属性的别名,这里指参数的名字,即入参的请求参数名字,如 value=" user_id" 表示请求的参数中名字为 user_id 的参数的值将传入。如果只使用 vaule 属性,就可以 省略value 属性名 |
name | 指定请求头绑定的名称 |
require | 用于指定参数是否必需,默认是tre,表示请求中一定要有相应的参数 |
defaultValue | 默认值,表示如果请求中没有同名参数的默认值 |
springmvc-config.xml:
<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" 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 "> <context:component-scan base-package="com.hzy.controller"/>beans>
web.xml
<web-app> <display-name>Archetype Created Web Applicationdisplay-name> <servlet> <servlet-name>springmvcservlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServletservlet-class> <init-param> <param-name>contextConfigLocationparam-name> <param-value>classpath:springmvc-config.xmlparam-value> init-param> <load-on-startup>1load-on-startup> servlet> <servlet-mapping> <servlet-name>springmvcservlet-name> <url-pattern>/url-pattern> servlet-mapping>web-app>
BookController:
@Controller@RequestMapping("/book")public class BookController { @RequestMapping("/save") @ResponseBody public String save(@RequestParam("name") String userName, int age){ System.out.println("普通参数传递name="+userName); System.out.println("普通参数传递age="+age); System.out.println("book save ..."); return "{'module':'book save'}"; }}
启动程序:
以上就是今天要讲的内容,涉及了SpringMVC的介绍、应用、数据绑定的内容,下篇中我会给大家讲到JSON数据交互和RESTFUL支持,以及拦截器的内容。
如果各位大哥大姐对我所写的内容觉得还行的话,希望可以点个关注,点个收藏,您的支持就是我最大的动力,非常感谢您的阅读(❁´◡`❁)
来源地址:https://blog.csdn.net/XUHUANGHOST/article/details/128251241