参考视频【狂神说Java】SpringMVC最新教程IDEA版通俗易懂_哔哩哔哩_bilibili一、概述1.1简介Spring MVC是Spring Framework的一部分是基于Java实现MVC的轻量级Web框架。查看官方文档https://docs.spring.io/spring/docs/5.2.0.RELEASE/spring-framework-reference/web.html#spring-webMVC 就是 Model模型、View视图、Controller控制器 三个单词的缩写是一种写代码的规范 / 套路目的是让代码更好维护、更好改。POJO 和 VO 是什么POJO和数据库表一一对应的类字段很多比如用户表有 id、姓名、密码、手机号、地址…。VO只给前端看的精简版类比如登录页只需要 “用户名 密码”就做个 LoginVO只保留这两个字段更安全、更省流量我们为什么要学习SpringMVC呢?Spring MVC的特点与Spring兼容性好可以把所有类注册到spring容器约定优于配置功能强大RESTful、数据验证、格式化、本地化、主题等1.2程序运行理解Spring的web框架围绕DispatcherServlet[ 一个Java类 ] 设计。它是前端控制器负责统一接收所有请求并将请求分发到不同的处理器统一调度整个流程。在本项目中Controller层是页面控制处理器两个加起来构成了MVC 的 C控制器层JSP 页面是MVC 的 V视图层Controller 中传递的数据与业务逻辑是MVC 中的 M模型层【第 0 步只执行一次Tomcat启动 → web.xml】服务器启动时只执行 1 次Tomcat→ 读取web.xml项目总配置注册并初始化DispatcherServlet前端控制器加载springmvc-servlet.xml配置文件Tomcat根据web.xml的配置决定所有请求交给 SpringMVC的核心 DispatcherServlet处理 。【用户每次请求完整执行 6 步流程】【第 1 步用户请求 → Tomcat →DispatcherServlet → 读取 springmvc-servlet.xml】用户请求被直接交给 DispatcherServletDispatcherServlet 加载springmvc-servlet.xmlSpringMVC 的指挥手册 / 配置地图里面写着规则比如 “哪个路径对应哪个类”、“要扫描哪里找快递员”、“视图解析器怎么拼路径”。处理器映射器找到请求路径/hello对应的HelloController。处理器适配器执行HelloController的方法。视图解析器拼接页面路径规则前缀/WEB-INF/jsp/ 视图名 后缀.jsp。【第 3 步DispatcherServlet → 委托给 HelloController】DispatcherServlet 根据配置将请求委托给HelloController页面控制器 / 处理器对应流程图第 2 步委托请求给处理器。【第 4 步HelloController 处理业务 → 返回 ModelAndView】HelloController实现Controller接口重写handleRequest方法ModelAndView mv new ModelAndView(); mv.addObject(msg, HelloSpringMVC!); // 封装模型数据Model mv.setViewName(hello); // 封装视图名View return mv;对应流程图第 3~5 步调用业务对象 / 封装数据第 3、4 步。返回ModelAndView数据 视图给 DispatcherServlet第 5 步。【第 5 步DispatcherServlet → 视图解析器渲染】DispatcherServlet 将ModelAndView交给视图解析器视图解析器拼接路径hello→/WEB-INF/jsp/hello.jsp。对应流程图第 6 步渲染视图将 Model 数据注入到 JSP 页面。【第 6 步视图 → 响应给用户】hello.jsp取出数据${msg}渲染成完整 HTML 页面返回给 DispatcherServlet。DispatcherServlet 将最终页面响应给浏览器用户对应流程图第 7、8 步。简单执行流程View视图就是你看到的网页 / 界面用户在这里点按钮、填表单。Controller控制器相当于 “调度员”接住用户的请求告诉模型该做什么。Model模型负责查数据库、算业务逻辑比如登录验证、计算价格把结果给回控制器。Controller控制器把结果交给视图页面就更新展示给用户了。1.3第一个SpringMVC配置版1、新建一个Moudle springmvc-02-hello 添加web的支持2、确定导入了SpringMVC 的依赖3、配置web.xml 注册DispatcherServlet核心控制器?xml version1.0 encodingUTF-8? web-app xmlnshttp://xmlns.jcp.org/xml/ns/javaee xmlns:xsihttp://www.w3.org/2001/XMLSchema-instance xsi:schemaLocationhttp://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd version4.0 !--1.注册DispatcherServlet 核心控制器-- servlet servlet-namespringmvc/servlet-name servlet-classorg.springframework.web.servlet.DispatcherServlet/servlet-class !--读取配置文件:springmvc-servlet.xml-- init-param param-namecontextConfigLocation/param-name param-valueclasspath:springmvc-servlet.xml/param-value /init-param !--启动级别-1-- load-on-startup1/load-on-startup /servlet !--所有请求都交给 SpringMVC-- servlet-mapping servlet-namespringmvc/servlet-name url-pattern//url-pattern /servlet-mapping /web-app4、编写SpringMVC 的 配置文件名称springmvc-servlet.xml?xml version1.0 encodingUTF-8? beans xmlnshttp://www.springframework.org/schema/beans xmlns:xsihttp://www.w3.org/2001/XMLSchema-instance xsi:schemaLocationhttp://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd !-- SpringMVC 底层需要的处理器映射器、适配器-- bean classorg.springframework.web.servlet.handler.BeanNameUrlHandlerMapping/ bean classorg.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter/ !--视图解析器JSP页面放在 /WEB-INF/jsp/下-- bean classorg.springframework.web.servlet.view.InternalResourceViewResolver idInternalResourceViewResolver !--前缀-- property nameprefix value/WEB-INF/jsp// !--后缀-- property namesuffix value.jsp/ /bean !--以上固定不动 -- !--添加控制器-- bean id/hello classcom.xing.controller.HelloController/ /beans5、编写我们要操作业务Controllerpackage com.xing.controller; import org.springframework.web.servlet.ModelAndView; import org.springframework.web.servlet.mvc.Controller; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /** * 原始SpringMVC方式实现Controller接口 * 最基础、最原生的SpringMVC控制器写法 */ public class HelloController implements Controller { Override public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception { // 创建ModelAndView对象封装数据 视图 ModelAndView mv new ModelAndView(); //只修改以下两个 // 1. 要传给页面的数据前端可取出msg mv.addObject(msg, 这是我第一个简单SpringMVC!); // 2. 要跳转到哪个页面视图名视图解析器会自动拼接前缀后缀 mv.setViewName(hello); return mv; } } 6、将自己的类交给SpringIOC容器注册bean!--Handler--bean id/hello classcom.kuang.controller.HelloController/7、写要跳转的jsp页面显示ModelandView存放的数据以及我们的正常页面% page contentTypetext/html;charsetUTF-8 languagejava % html head titleTitle/title /head body %--取出后端传过来的 “msg” 数据显示在页面上--% ${msg} /body /html8、配置Tomcat 启动测试打开网站(http://localhost:8080/hello这是我第一个简单SpringMVC!可能遇到的问题访问出现404排查步骤运行→编辑配置看部署里的应用程序上下文是不是写的/如果jar包存在显示无法输出就在IDEA的项目新建lib目录添加所有库文件重启Tomcat二、使用注解开发2.1第二个SpringMVC注解版1、新建一个Moudlespringmvc-03-hello-annotation 。添加web支持2、由于Maven可能存在资源过滤的问题我们将配置完善build resources !-- 处理 resources 目录 -- resource directorysrc/main/resources/directory includes include**/*.properties/include include**/*.xml/include /includes filteringtrue/filtering /resource !-- 处理 java 目录解决 Java 文件夹下的 XML 导出问题 -- resource directorysrc/main/java/directory includes include**/*.properties/include include**/*.xml/include /includes filteringtrue/filtering /resource /resources /build3、在pom.xml文件引入相关的依赖主要有Spring框架核心库、Spring MVC、servlet , JSTL等。我们在父依赖中已经引入了4、打开项目结构→工件→查看是否有lib目录→新建lib目录并导入包5、配置web.xml?xml version1.0 encodingUTF-8? web-app xmlnshttp://xmlns.jcp.org/xml/ns/javaee xmlns:xsihttp://www.w3.org/2001/XMLSchema-instance xsi:schemaLocationhttp://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd version4.0 !--1.注册DispatcherServlet 核心控制器-- servlet servlet-namespringmvc/servlet-name servlet-classorg.springframework.web.servlet.DispatcherServlet/servlet-class !--读取配置文件:springmvc-servlet.xml-- init-param param-namecontextConfigLocation/param-name param-valueclasspath:springmvc-servlet.xml/param-value /init-param !--启动级别-1第一个运行-- load-on-startup1/load-on-startup /servlet !--所有请求都交给 SpringMVC-- servlet-mapping servlet-namespringmvc/servlet-name url-pattern//url-pattern /servlet-mapping /web-app6、添加Spring MVC配置文件在resource目录下添加springmvc-servlet.xml配置文件配置的形式与Spring容器配置基本类似为了支持基于注解的IOC设置了自动扫描包的功能具体配置信息如下?xml version1.0 encodingUTF-8? beans xmlnshttp://www.springframework.org/schema/beans xmlns:xsihttp://www.w3.org/2001/XMLSchema-instance xmlns:contexthttp://www.springframework.org/schema/context xmlns:mvchttp://www.springframework.org/schema/mvc xsi:schemaLocationhttp://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd !-- 自动扫描包让指定包下的注解生效,由IOC容器统一管理 -- context:component-scan base-packagecom.xing.controller/ mvc:default-servlet-handler / mvc:annotation-driven / !-- 视图解析器 -- bean classorg.springframework.web.servlet.view.InternalResourceViewResolver idinternalResourceViewResolver !-- 前缀 -- property nameprefix value/WEB-INF/jsp/ / !-- 后缀 -- property namesuffix value.jsp / /bean /beans7、创建Controller编写一个Java控制类com.kuang.controller.HelloController , 注意编码规范package com.xing.controller; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.RequestMapping; Controller //RequestMapping(/HelloController)//可以实现多级路径 public class HelloController { // 真实访问地址 : 项目名/HelloController/hello RequestMapping(/hello) public String sayHello(Model model) { // 向模型中添加属性msg与值可以在JSP页面中取出并渲染 model.addAttribute(msg, hello,SpringMVC); // 视图解析器拼接后/WEB-INF/jsp/hello.jsp return hello; } }8、创建视图层在WEB-INF/ jsp目录中创建hello.jsp 视图可以直接取出并展示从Controller带回的信息% page contentTypetext/html;charsetUTF-8 languagejava % html head titleSpringMVC/title /head body ${msg} /body /html8、配置Tomcat运行配置Tomcat 开启服务器 访问 对应的请求路径OK运行成功2.2代码分析注解版与之前的配置版主要有两方面修改了1.springmvc-servlet.xml配置文件使用springMVC必须配置的三大件处理器映射器、处理器适配器、视图解析器通常我们只需要手动配置视图解析器而处理器映射器和处理器适配器只需要开启注解驱动即可而省去了大段的xml配置2.HelloController使用注解开发Controller RequestMapping(/HelloController) // 多级路径 public class HelloController { RequestMapping(/hello) public String sayHello(Model model) { model.addAttribute(msg, hello,SpringMVC); return hello; } }Controller把这个类标记为控制器页面控制器让 Spring 自动扫描、自动管理有了这个就不用在 xml 里写 bean 了RequestMapping(/HelloController)给这个类统一加一个访问前缀访问这个类里的所有方法都必须带上它实现多级路径RequestMapping(/hello)绑定访问地址/hello浏览器访问这个地址 → 自动执行这个方法Model model传递数据model.addAttribute(msg, hello,SpringMVC);前端 JSP 用${msg}取数据return hello;返回视图名视图解析器自动拼接2.3对比配置版代码1.类定义对比配置版注解版必须实现接口用注解代替接口public class HelloController implements Controller {Controller public class HelloController {强制实现Controller接口写法笨重、不灵活告诉 Spring 是控制器不用实现接口2. 方法定义对比配置版注解版固定方法名 固定参数方法名随便写 简洁参数public ModelAndView handleRequest(...) {public String sayHello(Model model) {方法名不能改参数不能改非常死板方法名自定义只有一个Model参数干净简单3.传递数据Model对比配置版注解版必须创建 ModelAndView直接用 ModelModelAndView mv new ModelAndView(); mv.addObject(msg, 数据);model.addAttribute(msg, 数据);4.设置跳转页面View对比配置版注解版mv.setViewName(hello);return hello;5.返回值对比配置版注解版return mv;上面返回视图名即可6.补充找路径对比找路径浏览器怎么访问/hello→ 找到控制器配置版注解版XML 里配置类上统一前缀 方法上具体路径 合起来 最终访问地址bean name/hello classcom.xing.controller.HelloController/RequestMapping(/hello)2.4注释补充1.注解 ControllerSpring 中的四大注解功能相同只是业务分层不同Component // 通用组件通用 Service // Service 层业务逻辑 Controller // Controller 层控制器SpringMVC 专用 Repository // Dao 层数据库操作2.注解 RequestMapping多个请求方法可以 return 同一个页面如 hello.jsp但传递不同数据 → 实现页面复用。控制器与视图是弱耦合关系非常灵活。三、RestFul 风格3.1.概念Restful就是一个资源定位及资源操作的风格。核心思想用 URL 定位资源用 HTTP 方法GET/POST/PUT/DELETE描述操作。2.传统方式 vs RestFul 风格传统方式操作资源通过不同的参数来实现不同的效果方法单一post 和 gethttp://127.0.0.1/item/queryItem.action?id1 查询,GEThttp://127.0.0.1/item/saveItem.action 新增,POSThttp://127.0.0.1/item/updateItem.action 更新,POSThttp://127.0.0.1/item/deleteItem.action?id1 删除,GET或POST使用RESTful操作资源可以通过不同的请求方式来实现不同的效果如下请求地址一样但是功能可以不同http://127.0.0.1/item/1 查询,GEThttp://127.0.0.1/item 新增,POSThttp://127.0.0.1/item 更新,PUThttp://127.0.0.1/item/1 删除,DELETE3.2学习测试1.如何让传统方式转化为RESTful风格在方法参数中可以使用 PathVariable 注解让方法参数与URL 路径变量自动绑定。语法RequestMapping(/commit/{p1}/{p2}) public String index(PathVariable int p1, PathVariable int p2){ ... }2.同一 URL不同功能指定请求方式所有的地址栏请求默认都会是 HTTP GET 类型的。SpringMVC 提供组合注解简化请求方式GetMapping 查询 PostMapping 新增 PutMapping 更新 DeleteMapping 删除 PatchMapping 局部更新等价写法GetMapping(/item/{id}) 等价于 RequestMapping(value /item/{id}, method RequestMethod.GET)GetMapping、PostMapping 等组合注解使用后无需再写 RequestMapping。思考使用路径变量的好处使路径变得更加简洁更加高效便于缓存安全性更高通过类型约束参数不匹配则无法访问
SpringMVC 知识大纲(上)
参考视频【狂神说Java】SpringMVC最新教程IDEA版通俗易懂_哔哩哔哩_bilibili一、概述1.1简介Spring MVC是Spring Framework的一部分是基于Java实现MVC的轻量级Web框架。查看官方文档https://docs.spring.io/spring/docs/5.2.0.RELEASE/spring-framework-reference/web.html#spring-webMVC 就是 Model模型、View视图、Controller控制器 三个单词的缩写是一种写代码的规范 / 套路目的是让代码更好维护、更好改。POJO 和 VO 是什么POJO和数据库表一一对应的类字段很多比如用户表有 id、姓名、密码、手机号、地址…。VO只给前端看的精简版类比如登录页只需要 “用户名 密码”就做个 LoginVO只保留这两个字段更安全、更省流量我们为什么要学习SpringMVC呢?Spring MVC的特点与Spring兼容性好可以把所有类注册到spring容器约定优于配置功能强大RESTful、数据验证、格式化、本地化、主题等1.2程序运行理解Spring的web框架围绕DispatcherServlet[ 一个Java类 ] 设计。它是前端控制器负责统一接收所有请求并将请求分发到不同的处理器统一调度整个流程。在本项目中Controller层是页面控制处理器两个加起来构成了MVC 的 C控制器层JSP 页面是MVC 的 V视图层Controller 中传递的数据与业务逻辑是MVC 中的 M模型层【第 0 步只执行一次Tomcat启动 → web.xml】服务器启动时只执行 1 次Tomcat→ 读取web.xml项目总配置注册并初始化DispatcherServlet前端控制器加载springmvc-servlet.xml配置文件Tomcat根据web.xml的配置决定所有请求交给 SpringMVC的核心 DispatcherServlet处理 。【用户每次请求完整执行 6 步流程】【第 1 步用户请求 → Tomcat →DispatcherServlet → 读取 springmvc-servlet.xml】用户请求被直接交给 DispatcherServletDispatcherServlet 加载springmvc-servlet.xmlSpringMVC 的指挥手册 / 配置地图里面写着规则比如 “哪个路径对应哪个类”、“要扫描哪里找快递员”、“视图解析器怎么拼路径”。处理器映射器找到请求路径/hello对应的HelloController。处理器适配器执行HelloController的方法。视图解析器拼接页面路径规则前缀/WEB-INF/jsp/ 视图名 后缀.jsp。【第 3 步DispatcherServlet → 委托给 HelloController】DispatcherServlet 根据配置将请求委托给HelloController页面控制器 / 处理器对应流程图第 2 步委托请求给处理器。【第 4 步HelloController 处理业务 → 返回 ModelAndView】HelloController实现Controller接口重写handleRequest方法ModelAndView mv new ModelAndView(); mv.addObject(msg, HelloSpringMVC!); // 封装模型数据Model mv.setViewName(hello); // 封装视图名View return mv;对应流程图第 3~5 步调用业务对象 / 封装数据第 3、4 步。返回ModelAndView数据 视图给 DispatcherServlet第 5 步。【第 5 步DispatcherServlet → 视图解析器渲染】DispatcherServlet 将ModelAndView交给视图解析器视图解析器拼接路径hello→/WEB-INF/jsp/hello.jsp。对应流程图第 6 步渲染视图将 Model 数据注入到 JSP 页面。【第 6 步视图 → 响应给用户】hello.jsp取出数据${msg}渲染成完整 HTML 页面返回给 DispatcherServlet。DispatcherServlet 将最终页面响应给浏览器用户对应流程图第 7、8 步。简单执行流程View视图就是你看到的网页 / 界面用户在这里点按钮、填表单。Controller控制器相当于 “调度员”接住用户的请求告诉模型该做什么。Model模型负责查数据库、算业务逻辑比如登录验证、计算价格把结果给回控制器。Controller控制器把结果交给视图页面就更新展示给用户了。1.3第一个SpringMVC配置版1、新建一个Moudle springmvc-02-hello 添加web的支持2、确定导入了SpringMVC 的依赖3、配置web.xml 注册DispatcherServlet核心控制器?xml version1.0 encodingUTF-8? web-app xmlnshttp://xmlns.jcp.org/xml/ns/javaee xmlns:xsihttp://www.w3.org/2001/XMLSchema-instance xsi:schemaLocationhttp://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd version4.0 !--1.注册DispatcherServlet 核心控制器-- servlet servlet-namespringmvc/servlet-name servlet-classorg.springframework.web.servlet.DispatcherServlet/servlet-class !--读取配置文件:springmvc-servlet.xml-- init-param param-namecontextConfigLocation/param-name param-valueclasspath:springmvc-servlet.xml/param-value /init-param !--启动级别-1-- load-on-startup1/load-on-startup /servlet !--所有请求都交给 SpringMVC-- servlet-mapping servlet-namespringmvc/servlet-name url-pattern//url-pattern /servlet-mapping /web-app4、编写SpringMVC 的 配置文件名称springmvc-servlet.xml?xml version1.0 encodingUTF-8? beans xmlnshttp://www.springframework.org/schema/beans xmlns:xsihttp://www.w3.org/2001/XMLSchema-instance xsi:schemaLocationhttp://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd !-- SpringMVC 底层需要的处理器映射器、适配器-- bean classorg.springframework.web.servlet.handler.BeanNameUrlHandlerMapping/ bean classorg.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter/ !--视图解析器JSP页面放在 /WEB-INF/jsp/下-- bean classorg.springframework.web.servlet.view.InternalResourceViewResolver idInternalResourceViewResolver !--前缀-- property nameprefix value/WEB-INF/jsp// !--后缀-- property namesuffix value.jsp/ /bean !--以上固定不动 -- !--添加控制器-- bean id/hello classcom.xing.controller.HelloController/ /beans5、编写我们要操作业务Controllerpackage com.xing.controller; import org.springframework.web.servlet.ModelAndView; import org.springframework.web.servlet.mvc.Controller; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /** * 原始SpringMVC方式实现Controller接口 * 最基础、最原生的SpringMVC控制器写法 */ public class HelloController implements Controller { Override public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception { // 创建ModelAndView对象封装数据 视图 ModelAndView mv new ModelAndView(); //只修改以下两个 // 1. 要传给页面的数据前端可取出msg mv.addObject(msg, 这是我第一个简单SpringMVC!); // 2. 要跳转到哪个页面视图名视图解析器会自动拼接前缀后缀 mv.setViewName(hello); return mv; } } 6、将自己的类交给SpringIOC容器注册bean!--Handler--bean id/hello classcom.kuang.controller.HelloController/7、写要跳转的jsp页面显示ModelandView存放的数据以及我们的正常页面% page contentTypetext/html;charsetUTF-8 languagejava % html head titleTitle/title /head body %--取出后端传过来的 “msg” 数据显示在页面上--% ${msg} /body /html8、配置Tomcat 启动测试打开网站(http://localhost:8080/hello这是我第一个简单SpringMVC!可能遇到的问题访问出现404排查步骤运行→编辑配置看部署里的应用程序上下文是不是写的/如果jar包存在显示无法输出就在IDEA的项目新建lib目录添加所有库文件重启Tomcat二、使用注解开发2.1第二个SpringMVC注解版1、新建一个Moudlespringmvc-03-hello-annotation 。添加web支持2、由于Maven可能存在资源过滤的问题我们将配置完善build resources !-- 处理 resources 目录 -- resource directorysrc/main/resources/directory includes include**/*.properties/include include**/*.xml/include /includes filteringtrue/filtering /resource !-- 处理 java 目录解决 Java 文件夹下的 XML 导出问题 -- resource directorysrc/main/java/directory includes include**/*.properties/include include**/*.xml/include /includes filteringtrue/filtering /resource /resources /build3、在pom.xml文件引入相关的依赖主要有Spring框架核心库、Spring MVC、servlet , JSTL等。我们在父依赖中已经引入了4、打开项目结构→工件→查看是否有lib目录→新建lib目录并导入包5、配置web.xml?xml version1.0 encodingUTF-8? web-app xmlnshttp://xmlns.jcp.org/xml/ns/javaee xmlns:xsihttp://www.w3.org/2001/XMLSchema-instance xsi:schemaLocationhttp://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd version4.0 !--1.注册DispatcherServlet 核心控制器-- servlet servlet-namespringmvc/servlet-name servlet-classorg.springframework.web.servlet.DispatcherServlet/servlet-class !--读取配置文件:springmvc-servlet.xml-- init-param param-namecontextConfigLocation/param-name param-valueclasspath:springmvc-servlet.xml/param-value /init-param !--启动级别-1第一个运行-- load-on-startup1/load-on-startup /servlet !--所有请求都交给 SpringMVC-- servlet-mapping servlet-namespringmvc/servlet-name url-pattern//url-pattern /servlet-mapping /web-app6、添加Spring MVC配置文件在resource目录下添加springmvc-servlet.xml配置文件配置的形式与Spring容器配置基本类似为了支持基于注解的IOC设置了自动扫描包的功能具体配置信息如下?xml version1.0 encodingUTF-8? beans xmlnshttp://www.springframework.org/schema/beans xmlns:xsihttp://www.w3.org/2001/XMLSchema-instance xmlns:contexthttp://www.springframework.org/schema/context xmlns:mvchttp://www.springframework.org/schema/mvc xsi:schemaLocationhttp://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd !-- 自动扫描包让指定包下的注解生效,由IOC容器统一管理 -- context:component-scan base-packagecom.xing.controller/ mvc:default-servlet-handler / mvc:annotation-driven / !-- 视图解析器 -- bean classorg.springframework.web.servlet.view.InternalResourceViewResolver idinternalResourceViewResolver !-- 前缀 -- property nameprefix value/WEB-INF/jsp/ / !-- 后缀 -- property namesuffix value.jsp / /bean /beans7、创建Controller编写一个Java控制类com.kuang.controller.HelloController , 注意编码规范package com.xing.controller; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.RequestMapping; Controller //RequestMapping(/HelloController)//可以实现多级路径 public class HelloController { // 真实访问地址 : 项目名/HelloController/hello RequestMapping(/hello) public String sayHello(Model model) { // 向模型中添加属性msg与值可以在JSP页面中取出并渲染 model.addAttribute(msg, hello,SpringMVC); // 视图解析器拼接后/WEB-INF/jsp/hello.jsp return hello; } }8、创建视图层在WEB-INF/ jsp目录中创建hello.jsp 视图可以直接取出并展示从Controller带回的信息% page contentTypetext/html;charsetUTF-8 languagejava % html head titleSpringMVC/title /head body ${msg} /body /html8、配置Tomcat运行配置Tomcat 开启服务器 访问 对应的请求路径OK运行成功2.2代码分析注解版与之前的配置版主要有两方面修改了1.springmvc-servlet.xml配置文件使用springMVC必须配置的三大件处理器映射器、处理器适配器、视图解析器通常我们只需要手动配置视图解析器而处理器映射器和处理器适配器只需要开启注解驱动即可而省去了大段的xml配置2.HelloController使用注解开发Controller RequestMapping(/HelloController) // 多级路径 public class HelloController { RequestMapping(/hello) public String sayHello(Model model) { model.addAttribute(msg, hello,SpringMVC); return hello; } }Controller把这个类标记为控制器页面控制器让 Spring 自动扫描、自动管理有了这个就不用在 xml 里写 bean 了RequestMapping(/HelloController)给这个类统一加一个访问前缀访问这个类里的所有方法都必须带上它实现多级路径RequestMapping(/hello)绑定访问地址/hello浏览器访问这个地址 → 自动执行这个方法Model model传递数据model.addAttribute(msg, hello,SpringMVC);前端 JSP 用${msg}取数据return hello;返回视图名视图解析器自动拼接2.3对比配置版代码1.类定义对比配置版注解版必须实现接口用注解代替接口public class HelloController implements Controller {Controller public class HelloController {强制实现Controller接口写法笨重、不灵活告诉 Spring 是控制器不用实现接口2. 方法定义对比配置版注解版固定方法名 固定参数方法名随便写 简洁参数public ModelAndView handleRequest(...) {public String sayHello(Model model) {方法名不能改参数不能改非常死板方法名自定义只有一个Model参数干净简单3.传递数据Model对比配置版注解版必须创建 ModelAndView直接用 ModelModelAndView mv new ModelAndView(); mv.addObject(msg, 数据);model.addAttribute(msg, 数据);4.设置跳转页面View对比配置版注解版mv.setViewName(hello);return hello;5.返回值对比配置版注解版return mv;上面返回视图名即可6.补充找路径对比找路径浏览器怎么访问/hello→ 找到控制器配置版注解版XML 里配置类上统一前缀 方法上具体路径 合起来 最终访问地址bean name/hello classcom.xing.controller.HelloController/RequestMapping(/hello)2.4注释补充1.注解 ControllerSpring 中的四大注解功能相同只是业务分层不同Component // 通用组件通用 Service // Service 层业务逻辑 Controller // Controller 层控制器SpringMVC 专用 Repository // Dao 层数据库操作2.注解 RequestMapping多个请求方法可以 return 同一个页面如 hello.jsp但传递不同数据 → 实现页面复用。控制器与视图是弱耦合关系非常灵活。三、RestFul 风格3.1.概念Restful就是一个资源定位及资源操作的风格。核心思想用 URL 定位资源用 HTTP 方法GET/POST/PUT/DELETE描述操作。2.传统方式 vs RestFul 风格传统方式操作资源通过不同的参数来实现不同的效果方法单一post 和 gethttp://127.0.0.1/item/queryItem.action?id1 查询,GEThttp://127.0.0.1/item/saveItem.action 新增,POSThttp://127.0.0.1/item/updateItem.action 更新,POSThttp://127.0.0.1/item/deleteItem.action?id1 删除,GET或POST使用RESTful操作资源可以通过不同的请求方式来实现不同的效果如下请求地址一样但是功能可以不同http://127.0.0.1/item/1 查询,GEThttp://127.0.0.1/item 新增,POSThttp://127.0.0.1/item 更新,PUThttp://127.0.0.1/item/1 删除,DELETE3.2学习测试1.如何让传统方式转化为RESTful风格在方法参数中可以使用 PathVariable 注解让方法参数与URL 路径变量自动绑定。语法RequestMapping(/commit/{p1}/{p2}) public String index(PathVariable int p1, PathVariable int p2){ ... }2.同一 URL不同功能指定请求方式所有的地址栏请求默认都会是 HTTP GET 类型的。SpringMVC 提供组合注解简化请求方式GetMapping 查询 PostMapping 新增 PutMapping 更新 DeleteMapping 删除 PatchMapping 局部更新等价写法GetMapping(/item/{id}) 等价于 RequestMapping(value /item/{id}, method RequestMethod.GET)GetMapping、PostMapping 等组合注解使用后无需再写 RequestMapping。思考使用路径变量的好处使路径变得更加简洁更加高效便于缓存安全性更高通过类型约束参数不匹配则无法访问