网站开发会用到定时器功能,文化馆门户网站建设的作用及意义,720全景网站怎么做,软件交易网学习视频:10001 Spring MVC概述_哔哩哔哩_bilibili~11005 请求映射方式_哔哩哔哩_bilibili 目录
1.概述
Java EE三层架构 Spring MVC在三层架构中的位置
编辑
Spring MVC在表现层的作用
Spring MVC的特点
2.Spring MVC入门程序
代码实现
Spring MVC工作原理
Spring … 学习视频:10001 Spring MVC概述_哔哩哔哩_bilibili~11005 请求映射方式_哔哩哔哩_bilibili 目录
1.概述
Java EE三层架构 Spring MVC在三层架构中的位置
编辑
Spring MVC在表现层的作用
Spring MVC的特点
2.Spring MVC入门程序
代码实现
Spring MVC工作原理
Spring MVC三大组件—处理器映射器
Spring MVC三大组件—处理器适配器 Spring MVC三大组件—视图解析器
Spring MVC执行流程 Spring MVC执行流程详细介绍
3.Spring MVC的核心类和注解 DispatcherServlet
Controller注解
RequestMapping注解
方式—标注在方法上
方式二标注在类上 RequestMapping注解的属性
编辑
value属性的两种映射路径标注
method属性限定处理器映射
4.请求映射方式
a. 基于请求方式的URL路径映射
b. 基于Ant风格的URL路径映射
ant1
ant2
ant3
ant4
ant5
c.基于RESTful风格的URL路径映射
RESTful风格的基本请求操作
RESTful风格四种请求的约定方式
编辑
使用RESTful风格的优势
代码演示 1.概述 在JSP Model2架构模型采用JSP Servlet JavaBean技术实现了页面显示、流程控制和业务逻辑的分离。但是JSP Model2架构模型将流程控制等通用逻辑以硬编码的方式实现每次进行新的Web应用程序开发时都需要重新编写Servlet控制器的URL分析代码以及流程控制等Web层通用逻辑代码。为了解决JSP Model2架构模型在实践中存在的问题一些基于JSP Model2架构基础发展起来的Web MVC应用框架应运而生。其中Spring MVC框架就是目前最主流的Web MVC应用框架之一 Java EE三层架构 在Java EE开发中系统经典的三层架构包括表现层、业务层和持久层。三层架构中每一层各司其职表现层Web层负责接收客户端请求并向客户端响应结果业务层Service层负责业务逻辑处理和项目需求息息相关持久层Dao层负责和数据库交互对数据库表进行增删改查。 Spring MVC在三层架构中的位置 Spring MVC在表现层的作用 Spring MVC作用于三层架构中的表现层用于接收客户端的请求并进行响应。Spring MVC中包含了控制器和视图控制器接收到客户端的请求后对请求数据进行解析和封装接着将请求交给业务层处理。业务层会对请求进行处理最后将处理结果返回给表现层。表现层接收到业务层的处理结果后再由视图对处理结果进行渲染渲染完成后响应给客户端。 Spring MVC的特点
Spring MVC是Spring框架的后续产品可以方便地使用Spring框架所提供的其他功能。Spring MVC使用简单很容易设计出干净简洁的Web层。 Spring MVC支持各种请求资源的映射策略。 Spring MVC具有非常灵活的数据验证、格式化和数据绑定机制能使用任何对象进行数据绑定不必实现特定框架的API。Spring MVC支持国际化可以根据用户区域显示多国语言。 Spring MVC支持多种视图技术。它支持JSP、Velocity和FreeMarker等视图技术。 Spring MVC灵活性强易扩展。 2.Spring MVC入门程序
代码实现
?xml version1.0 encodingutf8?
project xmlnshttp://maven.apache.org/POM/4.0.0xmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsdmodelVersion4.0.0/modelVersiongroupIdcom.it/groupIdartifactIdDays10/artifactIdversion1.0-SNAPSHOT/version!-- 声明当前是一个maven的web工程--packagingwar/packagingpropertiesmaven.compiler.source8/maven.compiler.sourcemaven.compiler.target8/maven.compiler.targetproject.build.sourceEncodingUTF-8/project.build.sourceEncoding/propertiesdependencies!--spring的ioc相关--dependencygroupIdorg.springframework/groupIdartifactIdspring-context/artifactIdversion5.2.6.RELEASE/version/dependencydependencygroupIdorg.springframework/groupIdartifactIdspring-webmvc/artifactIdversion5.2.6.RELEASE/version/dependencydependencygroupIdjavax.servlet/groupIdartifactIdjavax.servlet-api/artifactIdversion4.0.0/version!--依赖范围--scopeprovided/scope/dependency!-- spring jdbc相关--dependencygroupIdorg.springframework/groupIdartifactIdspring-jdbc/artifactIdversion5.2.6.RELEASE/version/dependency!-- 事务相关--dependencygroupIdorg.springframework/groupIdartifactIdspring-tx/artifactIdversion5.2.6.RELEASE/version/dependencydependencygroupIdorg.springframework/groupIdartifactIdspring-beans/artifactIdversion5.2.6.RELEASE/version/dependencydependencygroupIdorg.springframework/groupIdartifactIdspring-core/artifactIdversion5.2.6.RELEASE/version/dependency!--spring事务aop相关--dependencygroupIdorg.springframework/groupIdartifactIdspring-aspects/artifactIdversion5.2.6.RELEASE/version/dependencydependencygroupIdorg.aspectj/groupIdartifactIdaspectjweaver/artifactIdversion1.9.6/versionscoperuntime/scope /dependencydependencygroupIdaopalliance/groupIdartifactIdaopalliance/artifactIdversion1.0/version /dependencydependencygroupIdorg.mybatis/groupIdartifactIdmybatis/artifactIdversion3.5.3/version/dependency!--单元测试--dependencygroupIdjunit/groupIdartifactIdjunit/artifactIdversion4.12/versionscopetest/scope/dependency!--mysql驱动--dependencygroupIdmysql/groupIdartifactIdmysql-connector-java/artifactIdversion8.0.28/versionscoperuntime/scope/dependency!-- dependency--!-- groupIdorg.slf4j/groupId--!-- artifactIdslf4j-log4j12/artifactId--!-- version1.6.1/version--!-- /dependency--!-- dependencygroupIdlog4j/groupIdartifactIdlog4j/artifactIdversion1.2.17/version/dependency--/dependenciesbuildpluginsplugingroupIdorg.apache.maven.plugins/groupIdartifactIdmaven-compiler-plugin/artifactIdversion3.2/versionconfigurationsource1.8/sourcesource1.8/source/configuration/pluginplugingroupIdorg.apache.tomcat.maven/groupIdartifactIdtomcat7-maven-plugin/artifactIdversion2.2/versionconfigurationuriEncodingutf-8/uriEncodingport8080/port!-- 虚拟项目名--path/path/configuration/plugin/pluginsresourcesresourcedirectorysrc/main/java/directoryincludesinclude**/*.properties/includeinclude**/*.xml/include/includesfilteringtrue/filtering/resourceresourcedirectorysrc/main/resources/directory/resource/resources/build/project
?xml version1.0 encodingUTF-8?
web-app xmlnshttp://xmlns.jcp.org/xml/ns/javaeexmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsdversion4.0!-- 前端控制器--servletservlet-nameDispatcherServlet/servlet-nameservlet-classorg.springframework.web.servlet.DispatcherServlet/servlet-class!--配置springmvc配置文件的位置--init-paramparam-namecontextConfigLocation/param-nameparam-valueclasspath*:/spring-mvc.xml/param-value/init-param!-- 启动时加载--load-on-startup1/load-on-startup/servletservlet-mappingservlet-nameDispatcherServlet/servlet-nameurl-pattern//url-pattern/servlet-mapping/web-app
?xml version1.0 encodingUTF-8?
beans xmlnshttp://www.springframework.org/schema/beansxmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexmlns:contexthttp://www.springframework.org/schema/contextxsi:schemaLocationhttp://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd!-- 注解扫描--context:component-scan base-packagecom.it.controller/context:component-scan!--视图解析器--bean classorg.springframework.web.servlet.view.InternalResourceViewResolverproperty namesuffix value.jsp/property!--视图解析器的后缀--property nameprefix value/WEB-INF/pages//property!--视图解析器的前缀--/bean/beans import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;Controller
public class FirstController {RequestMapping(/firstController)public String sayHello(){System.out.println(访问第一个controller);//string返回值,默认是视图的名字(视图解析器的前缀此处的字符串视图解析器的后缀)return success;}}% page contentTypetext/html;charsetUTF-8 languagejava %
html
headtitleTitle/title
/head
bodyh1hello springMVC!!!/h1/body
/htmlSpring MVC工作原理
Spring MVC三大组件—处理器映射器 处理器映射器可以理解为一个MapURL,HanlderHandlerMapping负责根据用户请求的URL找到Handler处理器Spring MVC提供了不同的映射器来实现不同的映射方式。 圈1是URL,圈2是Hanlder Spring MVC三大组件—处理器适配器 处理器适配器作用是根据处理器映射器找到的处理器 Handler 信息去执行相关的 Handler。不同的处理器映射器映射出来的Handler对象是不一样的不同的映射由不同的适配器来负责解析。 Spring MVC三大组件—视图解析器 视图解析器进行视图解析首先将逻辑视图名解析成物理视图名即具体的页面地址再生成View视图对象返回。 Spring MVC执行流程 Spring MVC执行流程详细介绍 1.用户通过浏览器向服务器发送请求请求会被Spring MVC的前端控制器DispatcherServlet拦截。 2.DispatcherServlet拦截到请求后会调用HandlerMapping处理器映射器。 3.处理器映射器根据请求URL找到具体的处理器生成处理器对象及处理器拦截器如果有则生成一并返回给DispatcherServlet。 4.DispatcherServlet会通过返回信息选择合适的HandlerAdapter处理器适配器。 5.HandlerAdapter会调用并执行Handler处理器这里的处理器指的就是程序中编写的Controller类也被称之为后端控制器。 6.Controller执行完成后会返回一个ModelAndView对象该对象中会包含视图名或包含模型和视图名。 7.HandlerAdapter将ModelAndView对象返回给DispatcherServlet。 8.前端控制器请求视图解析器根据逻辑视图名解析真正的视图。 在Spring MVC4.0以前配置文件内必须要配置处理器映射器、处理器适配器和视图解析器但在Spring MVC4.0以后如果不配置处理器映射器、处理器适配器和视图解析器框架会加载内部默认的配置完成相应的工作。如果想显式并快捷地配置处理器映射器和处理器适配器也可以在配置文件中使用 mvc:annotation-driven/ 元素来实现该元素会自动注册处理器映射器和处理器适配器。 3.Spring MVC的核心类和注解 DispatcherServlet DispatcherServlet是Spring MVC的核心类也是Spring MVC的流程控制中心也称为Spring MVC的前端控制器它可以拦截客户端的请求。拦截客户端请求之后,DispatcherServlet会根据具体规则将请求交给其他组件处理。所有请求都要经过DispatcherServlet进行转发处理这样就降低了Spring MVC组件之间的耦合性。 !-- 前端控制器--servletservlet-nameDispatcherServlet/servlet-nameservlet-classorg.springframework.web.servlet.DispatcherServlet/servlet-class!--配置springmvc配置文件的位置--init-paramparam-namecontextConfigLocation/param-nameparam-valueclasspath*:/spring-mvc.xml/param-value/init-param!-- 启动时加载如果不配置:当第一次访问当前servlet,tomcat才会加载这个servlet.配置了正整数,意味着tomcat启动,就自动加载这个servlet--load-on-startup1/load-on-startup/servletservlet-mappingservlet-nameDispatcherServlet/servlet-name!--代表缺省(默认)的servlet,当一个请求找不到与之对应的servlet的时候,就照这个缺省的servlet.最终结果,拦截所有游览器发出的请求--url-pattern//url-pattern/servlet-mapping如果web.xml没有通过init-param元素指定DispatcherServlet初始化时要加载的文件则应用程序会去WEB-INF文件夹下寻找并加载默认配置文件默认配置文件的名称规则如下所示。 [servlet-name]-servlet.xml 其中[servlet-name]指的是web.xml文件中servlet-name元素的值“-servlet.xml”是配置文件名的固定拼接。 load-on-startup元素取值 load-on-startup元素取值分为三种情况 1如果load-on-startup元素的值为正整数或者0表示在项目启动时就加载并初始化这个Servlet值越小Servlet的优先级越高就越先被加载 2如果load-on-startup元素的值为负数或者没有设置则Servlet会在被请求时加载和初始化 3如果load-on-startup元素的值为1表明DispatcherServlet会在项目启动时加载并初始化。 Controller注解 在Spring MVC框架中传统的处理器类需要直接或间接地实现Controller接口这种方式需要在Spring MVC配置文件中定义请求和Controller 的映射关系。当后台需要处理的请求较多时使用传统的处理器类会比较繁琐且灵活性低对此Spring MVC框架提供了Controller注解。使用Controller注解只需要将Controller注解标注在普通Java类上然后通过Spring的扫描机制找到标注了该注解的Java类该Java类就成为了Spring MVC的处理器类。 基于Controller注解的处理器类示例代码
import org.springframework.stereotype.Controller;
...
Controller //标注Controller注解
public class FirstController{...
}Spring MVC配置文件的类包扫描配置信息
beans xmlnshttp://www.springframework.org/schema/beansxmlns:contexthttp://www.springframework.org/schema/contextxmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsd!-- 配置要扫描的类包 --context:component-scan base-packagecom.itheima.controller/......
/beansSpring扫描配置文件范围 Spring MVC的配置文件被加载时Spring会自动扫描com.itheima.controller类包及其子包下的Java类。如果被扫描的Java类中带有Controller、Service等注解则把这些类注册为Bean并存放在Spring中。 与传统的处理器类实现方式相比使用Controller注解的方式显然更加简单和灵活。因此在实际开发中通常使用Controller注解来定义处理器类。 RequestMapping注解 RequestMapping注解用于建立请求URL和Handler处理器之间的映射关系该注解可以标注在方法上和类上。下面分别对RequestMapping注解的这两种使用方式进行介绍。 方式—标注在方法上 当RequestMapping注解标注在方法上时该方法就成了一个可以处理客户端请求的Handler处理器它会在Spring MVC接收到对应的URL请求时被执行。Handler在浏览器中对应的访问地址由项目访问路径处理方法的映射路径共同组成。 RequestMapping(/login)public String login(){System.out.println(处理登录成功);return success;}方式二标注在类上 当RequestMapping注解标注在类上时RequestMapping的value属性值相当于本处理器类的命名空间即访问该处理器类下的任意处理器都需要带上这个命名空间。RequestMapping标注在类上时其value属性值作为请求URL的第一级访问目录。当处理器类和处理器都使用RequestMapping注解指定了对应的映射路径处理器在浏览器中的访问地址由项目访问路径处理器类的映射路径处理器的映射路径共同组成。 Controller
RequestMapping(/springMVC)
public class FirstController { 这个一般用来做路径的分模块管理的 RequestMapping注解的属性 value属性的两种映射路径标注 value属性是RequestMapping注解的默认属性。当value属性是RequestMapping注解显式使用的唯一属性时可以省略value的属性名。例如下面两种映射路径标注的含义相同。 RequestMapping(value/firstController)
RequestMapping(/firstController)Controller
public class AuthController {RequestMapping(value {/addUser,/deleteUser})public String checkAuth(){System.out.println(增删改体验);return success;}
}method属性限定处理器映射 method属性可以对处理器映射的URL请求方式进行限定。当请求的URL和处理器映射成功但请求方式和method属性指定的属性值不匹配处理器也不能正常处理请求。 Controller
RequestMapping(/method)
public class MethodController {RequestMapping(method RequestMethod.GET)public String get(){System.out.println(RequestMethod.GET);return success;}RequestMapping(method RequestMethod.POST)public String post(){System.out.println(RequestMethod.post);return success;}RequestMapping(method RequestMethod.PUT)public String put(){System.out.println(RequestMethod.put);return success;}RequestMapping(method RequestMethod.DELETE)public String delete(){System.out.println(RequestMethod.delete);return success;}}启动后我们用postman工具测试 method属性中有多个HTTP请求类型 如果需要同时支持多个请求方式则需要将请求方式列表存放在英文大括号中以数组的形式给method属性赋值并且多个请求方式之间用英文逗号分隔示例代码如下所示。
RequestMapping(value /method,
method {RequestMethod.GET,RequestMethod.POST})
public void getAndPost() {System.out.println(RequestMethod.GETRequestMethod.POST);
}params属性值的定义方式 params属性中定义的值可以将请求映射的定位范围缩小。当客户端进行请求时如果请求参数的值等于params属性定义的值可以正常执行所映射到的方法否则映射到的方法不执行。 Controller
public class ParamsController {RequestMapping(value /params,params id1)public void findById(String id) {System.out.println(idid); }}4.请求映射方式
请求映射方式的分类 基于注解风格的Spring MVC通过RequestMapping注解指定请求映射的URL路径。URL路径映射常用的方式有基于请求方式的URL路径映射、基于Ant风格的URL路径映射和基于REST风格的URL路径映射。接下来分别对这三种请求映射方式进行详细讲解。 a. 基于请求方式的URL路径映射 除了可以使用RequestMapping注解来限定客户端的请求方式之外从Spring 4.3版本开始还可以使用组合注解完成客户端请求方式的限定。组合注解简化了常用的HTTP请求方式的映射并且更好的表达了被注解方法的语义。 Spring MVC组合注解 GetMapping匹配GET方式的请求。 PostMapping匹配POST方式的请求。 PutMapping匹配PUT方式的请求。 DeleteMapping匹配DELETE方式的请求。 PatchMapping匹配PATCH方式的请求。 GetMapping用法示例 接下来以GetMapping为例讲解组合注解的用法GetMapping是RequestMapping(method RequestMethod.GET)的缩写使用组合注解替代RequestMapping注解可以省略method属性从而简化代码。GetMapping用法示例代码如下所示。 // RequestMapping(value /firstController,method RequestMethod.GET)GetMapping(/firstController)public String sayHello(){System.out.println(访问第一个controller);//string返回值,默认是视图的名字(视图解析器的前缀此处的字符串视图解析器的后缀)return success;}
这个GetMapping和上面注释处理是相同的 结果 b. 基于Ant风格的URL路径映射 Spring MVC支持Ant风格的URL路径映射 所谓Ant风格其实就是一种通配符风格可以在处理器映射路径中使用通配符对访问的URL路径进行关联。Ant风格的通配符有以下3种分别是?匹配任何单字符*匹配0或者任意数量的字符**匹配0或者多级目录。 Ant风格通配符的路径匹配 ant1 RequestMapping(/ant1?)public String ant1(){System.out.println(ant1方法);return success;} 这个1后面只能跟1个字符多了不行 ant2 RequestMapping(/ant2/*.do)public String ant2(){System.out.println(ant2方法);return success;} 这个.do前面跟几个字符都可以 ant3
RequestMapping(/*/ant3)public String ant3(){System.out.println(ant3方法);return success;} 这个/ant3前也是多个字符可以 ant4 RequestMapping(/**/ant4)public String ant4(){System.out.println(ant4方法);return success;} 这个/ant4前可以跟一级或2级目录 ant5
RequestMapping(/ant5/**)public String ant5(){System.out.println(ant5方法);return success;} 这个后面跟0或任意多的 映射路径使用多个通配符情况 当映射路径中同时使用多个通配符时会有通配符冲突的情况。当多个通配符冲突时路径会遵守最长匹配原则has more characters去匹配通配符如果一个请求路径同时满足两个或多个Ant风格的映射路径匹配规则那么请求路径最终会匹配满足规则字符最多的路径。例如/ant/a/path同时满足 /**/path和/ant/*/path匹配规则但/ant/path最终会匹配“/ant/*/path”路径。 c.基于RESTful风格的URL路径映射 RESTful是按照REST风格访问网络资源简单说RESTful就是把请求参数变成请求路径的一种风格。 而RESTRepresentational State Transfer是一种网络资源的访问风格规范对了网络资源的访问方式。REST所访问的网络资源可以是一段文本、一首歌曲、一种服务总之是一个具体的存在。每个网络资源都有一个URI指向它 要获取这个资源访问它的 URI 就可以因此URI 即为每一个资源的独一无二的标识符。 传统风格访问的URL格式如下所示。 http://.../findUserById?id1 而采用RESTful风格后其访问的URL格式如下所示。 http://.../user/id/1 需要注意的是RESTful风格中的URL不使用动词形式的路径例如findUserById表示查询用户是一个动词而user表示用户为名词。 RESTful风格的基本请求操作 RESTful风格在HTTP请求中通过GET 、POST 、PUT和DELETE 4个动词对应四种基本请求操作具体如下所示。 GET用于获取资源POST用于新建资源PUT用于更新资源DELETE用于删除资源 RESTful风格四种请求的约定方式 地址一样请求的方式不一样所代表的含义不一样 使用RESTful风格的优势 约定不是规范约定是可以打破所以称为RESTful风格而不是RESTful规范。使用RESTful风格的优势在于路径的书写比较简便并且通过地址无法得知做的是何种操作可以隐藏资源的访问行为。 代码演示
Controller
RequestMapping(/user)
public class UserController {GetMapping(/{id})public String findById(PathVariable(id) String id){System.out.println(根据id查询:id);return success;}DeleteMapping(/{id})public String deleteById(PathVariable(id) String id){System.out.println(根据id删除:id);return success;}PutMapping(/{id})public String updateById(PathVariable(id) String id){System.out.println(根据id更新:id);return success;}PostMapping(/{id})public String add(){System.out.println(新增);return success;}}