开家做网站公司有哪些,网站开发程序员工资,英文网站建设口碑好,软件园专业做网站目录 一 SpringMVC简介1 SpringMVC概述问题导入1.1 SpringMVC概述 2 入门案例问题导入2.0 回顾Servlet技术开发web程序流程2.1 使用SpringMVC技术开发web程序流程2.2 代码实现【第一步】创建web工程#xff08;Maven结构#xff09;【第二步】设置tomcat服务器#xff0c;加… 目录 一 SpringMVC简介1 SpringMVC概述问题导入1.1 SpringMVC概述 2 入门案例问题导入2.0 回顾Servlet技术开发web程序流程2.1 使用SpringMVC技术开发web程序流程2.2 代码实现【第一步】创建web工程Maven结构【第二步】设置tomcat服务器加载web工程(tomcat插件【第三步】导入坐标SpringMVCServlet【第四步】定义处理请求的功能类UserController【第五步】编写SpringMVC配置类加载处理请求的Bean。【第六步】加载SpringMVC配置并设置SpringMVC请求拦截的路径 2.3 运行结果2.4 案例注解和类解析2.4.1 Controller注解2.4.2 RequestMapping注解2.4.3 ResponseBody注解2.4.4 AbstractDispatcherServletInitializer类 2.5 入门程序开发总结(1N) 3 入门案例工作流程分析3.1 启动服务器初始化过程3.2 单次请求过程 4 Controller加载控制问题导入4.1 Controller加载控制与业务bean加载控制4.2 方式一代码实现4.3 Bean的加载格式 5 PostMan5.1 PostMan介绍5.2 PostMan安装5.3 PostMan的使用5.3.1 创建WorkSpace工作空间5.3.2 发送请求获取json数据5.3.3 保存当前请求 5.4 PostMan汉化5.4.1 下载安装 Postman5.4.2 开始汉化 Postman5.4.3 禁掉 Postman 自动更新 6 ApiFox6.1 ApiFox的介绍6.2 ApiFox的安装6.3 ApiFox的使用6.3.1 新建团队新建项目6.3.2 发送请求获取json数据6.3.3 保存当前请求 二 请求与响应1 请求映射路径问题导入1.1 RequestMapping注解 2 请求参数2.1 发送普通类型参数问题导入2.1.1 请求方式2.1.2 GET请求传递普通参数2.1.3 POST请求传递普通参数2.1.4 POST请求中文乱码处理 2.2 五种类型参数传递问题导入2.2.1 五种类型参数介绍2.2.2 普通参数2.2.3 POJO类型参数2.2.4 嵌套POJO类型参数2.2.5 数组类型参数2.2.6 集合类型参数 2.3 json数据参数传递问题导入2.3.1 json数据参数介绍2.3.2 传递json普通数组2.3.2.1 代码演示2.3.2.2 EnableWebMvc注解介绍2.3.2.3 RequestBody注解介绍 2.3.3 传递json对象2.3.4 传递json对象数组2.3.5 RequestBody与RequestParam区别 3 日期类型参数传递问题导入3.1 代码演示3.2 DateTimeFormat注解介绍3.3 工作原理3.4 注意事项 4 响应问题导入4.1响应页面4.2 文本数据4.3 json数据4.4 RequestBody注解介绍4.5 转Json原理/过程 三 REST风格1 REST简介问题导入1.1 REST介绍1.2 RESTful介绍1.3 注意事项 2 RESTful入门案例问题导入2.1 快速入门2.2 PathVariable介绍2.3 RequestBody、RequestParam、PathVariable区别和应用 3 REST快速开发3.1 代码中的问题3.2 Rest快速开发 4 案例基于RESTful页面数据交互4.1 案例效果和环境准备4.1.1 案例效果4.1.2 环境准备 4.2 代码实现4.2.1 制作SpringMVC控制器并通过PostMan测试接口功能4.2.2 设置对静态资源的访问放行4.2.3 前端页面通过异步提交访问后台控制器 一 SpringMVC简介
1 SpringMVC概述
问题导入
SpringMVC框架有什么优点
1.1 SpringMVC概述
SpringMVC是一种基于Java实现MVC模型的轻量级Web框架优点 使用简单开发便捷相比于Servlet灵活性强
2 入门案例
问题导入
在Controller中如何定义访问路径如何响应数据
2.0 回顾Servlet技术开发web程序流程
创建web工程Maven结构设置tomcat服务器加载web工程tomcat插件导入坐标Servlet定义处理请求的功能类UserServlet设置请求映射配置映射关系
2.1 使用SpringMVC技术开发web程序流程
创建web工程Maven结构设置tomcat服务器加载web工程(tomcat插件导入坐标SpringMVCServlet定义处理请求的功能类UserController设置请求映射配置映射关系 编写SpringMVC配置类加载处理请求的Bean。 加载SpringMVC配置并设置SpringMVC请求拦截的路径 将SpringMVC设定加载到Tomcat容器中
2.2 代码实现
【第一步】创建web工程Maven结构
【第二步】设置tomcat服务器加载web工程(tomcat插件
buildpluginsplugingroupIdorg.apache.tomcat.maven/groupIdartifactIdtomcat7-maven-plugin/artifactIdversion2.2/versionconfigurationport80/portpath//path/configuration/plugin/plugins
/build【第三步】导入坐标SpringMVCServlet
dependenciesdependencygroupIdorg.springframework/groupIdartifactIdspring-webmvc/artifactIdversion5.3.23/version/dependencydependencygroupIdjavax.servlet/groupIdartifactIdjavax.servlet-api/artifactIdversion3.1.0/versionscopeprovided/scope/dependency/dependencies【第四步】定义处理请求的功能类UserController
//定义表现层控制器bean
Controller
public class UserController {//设置映射路径为/save即外部访问路径RequestMapping(/save)//设置当前操作返回结果为指定json数据本质上是一个字符串信息ResponseBodypublic String save(){System.out.println(user save ...);return {info:springmvc};}
}注意事项 对于SpringMVC而言Controller方法返回值默认表示要跳转的页面没有对应的页面就会报错。如果不想跳转页面而是响应数据那么就需要在方法上使用ResponseBody注解。
【第五步】编写SpringMVC配置类加载处理请求的Bean。
//springmvc配置类本质上还是一个spring配置类
Configuration
ComponentScan(com.itheima.controller)
public class SpringMvcConfig {
}【第六步】加载SpringMVC配置并设置SpringMVC请求拦截的路径
//web容器配置类
public class ServletContainersInitConfig extends AbstractDispatcherServletInitializer {//加载springmvc配置类产生springmvc容器本质还是spring容器protected WebApplicationContext createServletApplicationContext() {//初始化WebApplicationContext对象AnnotationConfigWebApplicationContext ctx new AnnotationConfigWebApplicationContext();//加载指定配置类ctx.register(SpringMvcConfig.class);return ctx;}//设置由springmvc控制器处理的请求映射路径protected String[] getServletMappings() {return new String[]{/};}//加载spring配置类protected WebApplicationContext createRootApplicationContext() {return null;}
}2.3 运行结果 2.4 案例注解和类解析
2.4.1 Controller注解
名称Controller类型类注解位置SpringMVC控制器类定义上方作用设定SpringMVC的核心控制器bean范例
Controller
public class UserController {
}2.4.2 RequestMapping注解
名称RequestMapping类型方法注解位置SpringMVC控制器方法定义上方作用设置当前控制器方法请求访问路径范例
RequestMapping(/save)
public void save(){System.out.println(user save ...);
}注意其实RequestMapping注解还可以写到类上面 2.4.3 ResponseBody注解
名称ResponseBody类型方法注解位置SpringMVC控制器方法定义上方作用设置当前控制器方法响应内容为当前返回值无需解析范例
RequestMapping(/save)
ResponseBody
public String save(){System.out.println(user save ...);return {info:springmvc};
}2.4.4 AbstractDispatcherServletInitializer类
AbstractDispatcherServletInitializer类是SpringMVC提供的快速初始化Web3.0容器的抽象类AbstractDispatcherServletInitializer提供三个接口方法供用户实现 createServletApplicationContext()方法创建Servlet容器时加载SpringMVC对应的bean并放入WebApplicationContext对象范围中而WebApplicationContext的作用范围为ServletContext范围即整个web容器范围。 //加载springmvc配置类产生springmvc容器本质还是spring容器
protected WebApplicationContext createServletApplicationContext() {AnnotationConfigWebApplicationContext ctx new AnnotationConfigWebApplicationContext();ctx.register(SpringMvcConfig.class);return ctx;
}getServletMappings()方法设定SpringMVC对应的请求映射路径设置为/表示拦截所有请求任意请求都将转入到SpringMVC进行处理。 //设置由springmvc控制器处理的请求映射路径
protected String[] getServletMappings() {return new String[]{/};
}createRootApplicationContext()方法如果创建Servlet容器时需要加载非SpringMVC对应的bean使用当前方法进行使用方式同createServletApplicationContext() //加载spring配置类
protected WebApplicationContext createRootApplicationContext() {return null;
}2.5 入门程序开发总结(1N)
一次性工作 创建工程设置服务器加载工程导入坐标创建web容器启动类加载SpringMVC配置并设置SpringMVC请求拦截路径SpringMVC核心配置类设置配置类扫描controller包加载Controller控制器bean 多次工作 定义处理请求的控制器类定义处理请求的控制器方法并配置映射路径RequestMapping与返回json数据ResponseBody
3 入门案例工作流程分析
3.1 启动服务器初始化过程
服务器启动执行ServletContainersInitConfig类初始化web容器执行createServletApplicationContext方法创建了WebApplicationContext对象加载SpringMvcConfig配置类执行ComponentScan加载对应的bean加载UserController每个RequestMapping的名称对应一个具体的方法执行getServletMappings方法定义所有的请求都通过SpringMVC
3.2 单次请求过程
发送请求localhost/saveweb容器发现所有请求都经过SpringMVC将请求交给SpringMVC处理解析请求路径/save由/save匹配执行对应的方法save(执行save()检测到有ResponseBody直接将save()方法的返回值作为响应求体返回给请求方
4 Controller加载控制
问题导入
因为功能不同如何避免Spring错误的加载到SpringMVC的bean
4.1 Controller加载控制与业务bean加载控制
SpringMVC相关bean表现层beanSpring控制的bean 业务beanService功能beanDataSource等 SpringMVC相关bean加载控制 SpringMVC加载的bean对应的包均在com.itheima.controller包内 Spring相关bean加载控制 方式一Spring加载的bean设定扫描范围为com.itheima排除掉controller包内的bean方式二Spring加载的bean设定扫描范围为精准范围例如service包、dao包等方式三不区分Spring与SpringMVC的环境加载到同一个环境中
4.2 方式一代码实现
名称ComponentScan类型类注解范例
Configuration
ComponentScan(value com.itheima,excludeFilters ComponentScan.Filter(type FilterType.ANNOTATION,classes Controller.class))
public class SpringConfig {
}属性 excludeFilters排除扫描路径中加载的bean需要指定类别type与具体项classesincludeFilters加载指定的bean需要指定类别type与具体项classes
4.3 Bean的加载格式
public class ServletContainersInitConfig extends AbstractDispatcherServletInitializer {protected WebApplicationContext createServletApplicationContext() {AnnotationConfigWebApplicationContext ctx new AnnotationConfigWebApplicationContext();ctx.register(SpringMvcConfig.class);return ctx;}protected WebApplicationContext createRootApplicationContext() {AnnotationConfigWebApplicationContext ctx new AnnotationConfigWebApplicationContext();ctx.register(SpringConfig.class);return ctx;}protected String[] getServletMappings() {return new String[]{/};}
}简化格式
public class ServletContainersInitConfig extends AbstractAnnotationConfigDispatcherServletInitializer{protected Class?[] getServletConfigClasses() {return new Class[]{SpringMvcConfig.class}};protected String[] getServletMappings() {return new String[]{/};}protected Class?[] getRootConfigClasses() {return new Class[]{SpringConfig.class};}
}5 PostMan
5.1 PostMan介绍
Postman是一款功能强大的网页调试与发送网页HTTP请求的Chrome插件。 作用常用于进行接口测试特征 简单实用美观大方
5.2 PostMan安装
官网https://www.postman.com/ 双击“Postman-Setup.exe”即可自动按照打开之后需要注册如果底部有如下链接可以点击跳过注册 5.3 PostMan的使用
5.3.1 创建WorkSpace工作空间 5.3.2 发送请求获取json数据 5.3.3 保存当前请求 注意第一次请求需要创建一个新的目录后面就不需要创建新目录直接保存到已经创建好的目录即可。 5.4 PostMan汉化
5.4.1 下载安装 Postman
想要汉化 Postman 就必须导入汉化补丁包补丁包的版本号需与 Postman 版本号一致才行否则大概率无法汉化。所以需先确认汉化补丁包的版本号再下载对应版本的 Postman 使用。
汉化补丁下载链接https://github.com/hlmd/Postman-cn/releases 目前补丁包版本为9.12.2 确认了补丁包版本号后再下载对应版本的 Postman :
Postman 历史版本下载请把下面链接的版本号替换为指定的版本号, 然后浏览器中访问即可直接下载Windows64位https://dl.pstmn.io/download/version/版本号/win64Windows32位https://dl.pstmn.io/download/version/版本号/win32Mac Intel Chiphttps://dl.pstmn.io/download/version/版本号/osx_64Mac Apple Chiphttps://dl.pstmn.io/download/version/版本号/osx_arm64Linuxhttps://dl.pstmn.io/download/version/版本号/linux
比如当前补丁版本号为 9.12.2, 如果想要下载 Windows 64 位的 Postman则下载链接为 https://dl.pstmn.io/download/version/9.12.2/win64浏览器访问该地址可直接下载。下载成功后双击安装即可。
5.4.2 开始汉化 Postman
Windows 系统 下载好对应版本的汉化补丁包 app.zip;进入到 Postman 安装目录下的 /resources 文件夹中 桌面找到 Postman 应用程序右键 - 打开文件所在位置再进入 app-..*/resources 目录下 默认安装地址C:/Users/用户名/AppData/Local/Postman 示例C:/Users/用户名/AppData/Local/Postman/app-8.8.0/resources 复制 app.zip 到 resources 目录将app.zip解压到当前文件夹会生成一个app目录如上图所示重启 Postman 即可看到已经汉化成功~ Mac 系统 下载对应版本的 app.zip;解压 app.zip进入 访达/应用程序/Postman.app/Contents/Resources/: 进入访达/应用程序找到Postman.app右键查看包内容再进入Contents/Resources 替换 app 文件夹 如果目录下没有 app 文件夹那么直接解压 app.zip 得到 app 文件夹即可 将app.zip解压出来的app文件夹复制到Resources目录替换原本的app文件夹 可以先删除或重命名原本的app文件夹 重启 Postman 就可以了~ Linux 系统 下载对应版本的 app.zip: # 下方为Github地址 将版本号替换为对应版本号例如8.8.0
uwget https://github.com/hlmd/Postman-cn/releases/download/版本号/app.zip解压替换app文件夹 # Postman安装地址 自行替换
unzip -o -d Postman安装地址/app/resources app.zip5.4.3 禁掉 Postman 自动更新
Windows Windows 删除安装目录的 update.exe 即可。 Mac / Linux 将此解析加入你电脑的主机文件 hosts 0.0.0.0 dl.pstmn.io注意这是一项危险操作将会使你的电脑无法与 Postman 下载服务器连接当然这就可以使你的 Postman 应用程序不再更新, 如果想更新请将此解析注释或移除。 hosts 文件在哪里 WindowsC:/Windows/System32/drivers/etc/hostsLinux Mac/etc/hosts
6 ApiFox
6.1 ApiFox的介绍
API 文档、API 调试、API Mock、API 自动化测试API 一体化协作平台更先进的 API 设计/开发/测试工具Apifox Postman Swagger Mock JMeter
6.2 ApiFox的安装
官网https://apifox.com/ 下一步指定安装位置即可 6.3 ApiFox的使用
6.3.1 新建团队新建项目 6.3.2 发送请求获取json数据 6.3.3 保存当前请求 二 请求与响应
1 请求映射路径
问题导入
RequestMapping注解注解可以写在哪有什么作用
1.1 RequestMapping注解
名称RequestMapping类型方法注解 类注解位置SpringMVC控制器方法定义上方作用设置当前控制器方法请求访问路径如果设置在类上统一设置当前控制器方法请求访问路径前缀范例
Controller
//类上方配置的请求映射与方法上面配置的请求映射连接在一起形成完整的请求映射路径
RequestMapping(/user)
public class UserController {//请求路径映射RequestMapping(/save) //此时save方法的访问路径是/user/saveResponseBodypublic String save(){System.out.println(user save ...);return {module:user save};}
}2 请求参数
2.1 发送普通类型参数
问题导入
如何解决POST请求中文乱码问题
2.1.1 请求方式
GET请求POST请求
2.1.2 GET请求传递普通参数
普通参数url地址传参地址参数名与形参变量名相同定义形参即可接收参数
//普通参数请求参数与形参名称对应即可完成参数传递
RequestMapping(/commonParam)
ResponseBody
public String commonParam(String name ,int age){System.out.println(普通参数传递 name name);System.out.println(普通参数传递 age age);return {module:common param};
}问题如果同学们传递的参数是中文试试你们会发现接收到的参数出现了中文乱码问题。原因tomcat 8.5版本之后GET请求就不再出现中文乱码问题但是我们使用的是tomcat7插件所以会出现GET请求中文乱码问题。解决在pom.xml添加tomcat7插件处配置UTF-8字符集解决GET请求中文乱码问题。
buildpluginsplugingroupIdorg.apache.tomcat.maven/groupIdartifactIdtomcat7-maven-plugin/artifactIdversion2.1/versionconfigurationport80/port!--tomcat端口号--path//path !--虚拟目录--uriEncodingUTF-8/uriEncoding!--访问路径编解码字符集--/configuration/plugin/plugins/build2.1.3 POST请求传递普通参数
普通参数form表单post请求传参表单参数名与形参变量名相同定义形参即可接收参数
//普通参数请求参数与形参名称对应即可完成参数传递
RequestMapping(/commonParam)
ResponseBody
public String commonParam(String name ,int age){System.out.println(普通参数传递 name name);System.out.println(普通参数传递 age age);return {module:common param};
}问题我们发现POST请求传递的参数如果包含中文那么就会出现中文乱码问题说明我们之前配置的tomcat插件uri路径编解码字符集无法解决POST请求中文乱码问题。那么如何解决呢
2.1.4 POST请求中文乱码处理 在加载SpringMVC配置的配置类中指定字符过滤器。 public class ServletContainersInitConfig extends AbstractAnnotationConfigDispatcherServletInitializer {protected Class?[] getRootConfigClasses() {return new Class[0];}protected Class?[] getServletConfigClasses() {return new Class[]{SpringMvcConfig.class};}protected String[] getServletMappings() {return new String[]{/};}//乱码处理Overrideprotected Filter[] getServletFilters() {CharacterEncodingFilter filter new CharacterEncodingFilter();filter.setEncoding(UTF-8);return new Filter[]{filter};}
}2.2 五种类型参数传递
问题导入
当请求参数名与形参变量名不同该如何接收请求参数
2.2.1 五种类型参数介绍
普通参数POJO类型参数嵌套POJO类型参数数组类型参数集合类型参数
2.2.2 普通参数
普通参数当请求参数名与形参变量名不同使用RequestParam绑定参数关系
//普通参数请求参数名与形参名不同时使用RequestParam注解关联请求参数名称与形参名称之间的关系
RequestMapping(/commonParamDifferentName)
ResponseBody
public String commonParamDifferentName(RequestParam(name) String userName , int age){System.out.println(普通参数传递 userName userName);System.out.println(普通参数传递 age age);return {module:common param different name};
}名称RequestParam类型形参注解位置SpringMVC控制器方法形参定义前面作用绑定请求参数与处理器方法形参间的关系参数 required是否为必传参数defaultValue参数默认值
2.2.3 POJO类型参数
POJO参数请求参数名与形参对象属性名相同定义POJO类型形参即可接收参数
public class User {private String name;private int age;//同学们自己添加getter/setter/toString()方法
}//POJO参数请求参数与形参对象中的属性对应即可完成参数传递
RequestMapping(/pojoParam)
ResponseBody
public String pojoParam(User user){System.out.println(pojo参数传递 user user);return {module:pojo param};
}注意事项请求参数key的名称要和POJO中属性的名称一致否则无法封装。
2.2.4 嵌套POJO类型参数
POJO对象中包含POJO对象
public class User {private String name;private int age;private Address address;public String getName() {return name;}public void setName(String name) {this.name name;}public int getAge() {return age;}public void setAge(int age) {this.age age;}public Address getAddress() {return address;}public void setAddress(Address address) {this.address address;}Overridepublic String toString() {return User{ name name \ , age age , address address };}
}public class Address {private String province;private String city;Overridepublic String toString() {return Address{ province province \ , city city \ };}public String getProvince() {return province;}public void setProvince(String province) {this.province province;}public String getCity() {return city;}public void setCity(String city) {this.city city;}
}嵌套POJO参数请求参数名与形参对象属性名相同按照对象层次结构关系即可接收嵌套POJO属性参数
//嵌套POJO参数嵌套属性按照层次结构设定名称即可完成参数传递
RequestMapping(/pojoContainPojoParam)
ResponseBody
public String pojoContainPojoParam(User user){System.out.println(pojo嵌套pojo参数传递 user user);return {module:pojo contain pojo param};
}注意事项请求参数key的名称要和POJO中属性的名称一致否则无法封装。
2.2.5 数组类型参数
数组参数请求参数名与形参对象属性名相同且请求参数为多个定义数组类型即可接收参数
//数组参数同名请求参数可以直接映射到对应名称的形参数组对象中
RequestMapping(/arrayParam)
ResponseBody
public String arrayParam(String[] likes){System.out.println(数组参数传递 likes Arrays.toString(likes));return {module:array param};
}2.2.6 集合类型参数
集合保存普通参数请求参数名与形参集合对象名相同且请求参数为多个RequestParam绑定参数关系
//集合参数同名请求参数可以使用RequestParam注解映射到对应名称的集合对象中作为数据
RequestMapping(/listParam)
ResponseBody
public String listParam(RequestParam ListString likes){System.out.println(集合参数传递 likes likes);return {module:list param};
}2.3 json数据参数传递
问题导入
问题EnableWebMvc注解和ResponseBody注解有什么用
2.3.1 json数据参数介绍
json普通数组[“”,“”,“”,…]json对象{key:value,key:value,…}json对象数组[{key:value,…},{key:value,…}]
2.3.2 传递json普通数组
2.3.2.1 代码演示
添加json数据转换相关坐标
dependencygroupIdcom.fasterxml.jackson.core/groupIdartifactIdjackson-databind/artifactIdversion2.14.2/version
/dependency设置发送json数据请求body中添加json数据 开启自动转换json数据的支持
Configuration
ComponentScan(com.itheima.controller)
//开启json数据类型自动转换
EnableWebMvc
public class SpringMvcConfig {
}注意事项 EnableWebMvc注解功能强大该注解整合了多个功能此处仅使用其中一部分功能即json数据进行自动类型转换 4. 在Controller中编写方法接收json参数
//集合参数json格式
//1.开启json数据格式的自动转换在配置类中开启EnableWebMvc
//2.使用RequestBody注解将外部传递的json数组数据映射到形参的集合对象中作为数据
RequestMapping(/listParamForJson)
ResponseBody
public String listParamForJson(RequestBody ListString likes){System.out.println(list common(json)参数传递 list likes);return {module:list common for json param};
}2.3.2.2 EnableWebMvc注解介绍
名称EnableWebMvc类型配置类注解位置SpringMVC配置类定义上方作用开启SpringMVC多项辅助功能范例
Configuration
ComponentScan(com.itheima.controller)
EnableWebMvc
public class SpringMvcConfig {
}2.3.2.3 RequestBody注解介绍
名称RequestBody类型形参注解位置SpringMVC控制器方法形参定义前面作用将请求中请求体所包含的数据传递给请求参数此注解一个处理器方法只能使用一次范例
RequestMapping(/listParamForJson)
ResponseBody
public String listParamForJson(RequestBody ListString likes){System.out.println(list common(json)参数传递 list likes);return {module:list common for json param};
} 2.3.3 传递json对象
POJO参数json数据与形参对象属性名相同定义POJO类型形参即可接收参数
//POJO参数json格式
//1.开启json数据格式的自动转换在配置类中开启EnableWebMvc
//2.使用RequestBody注解将外部传递的json数据映射到形参的实体类对象中要求属性名称一一对应
RequestMapping(/pojoParamForJson)
ResponseBody
public String pojoParamForJson(RequestBody User user){System.out.println(pojo(json)参数传递 user user);return {module:pojo for json param};
}2.3.4 传递json对象数组
POJO集合参数json数组数据与集合泛型属性名相同定义List类型形参即可接收参数
//集合参数json格式
//1.开启json数据格式的自动转换在配置类中开启EnableWebMvc
//2.使用RequestBody注解将外部传递的json数组数据映射到形参的保存实体类对象的集合对象中要求属性名称一一对应
RequestMapping(/listPojoParamForJson)
ResponseBody
public String listPojoParamForJson(RequestBody ListUser list){System.out.println(list pojo(json)参数传递 list list);return {module:list pojo for json param};
}2.3.5 RequestBody与RequestParam区别
区别 RequestParam用于接收url地址传参表单传参【application/x-www-form-urlencoded】RequestBody用于接收json数据【application/json】 应用 后期开发中发送json格式数据为主RequestBody应用较广如果发送非json格式数据选用RequestParam接收请求参数
3 日期类型参数传递
问题导入
DateTimeFormat注解的作用是什么
3.1 代码演示
日期类型数据基于系统不同格式也不尽相同 2088-08-18 2088/08/18 08/18/2088接收形参时根据不同的日期格式设置不同的接收方式
//日期参数 http://localhost:80/dataParam?date2088/08/08date12088-08-18date22088/08/28 8:08:08
//使用DateTimeFormat注解设置日期类型数据格式默认格式yyyy/MM/dd
RequestMapping(/dataParam)
ResponseBody
public String dataParam(Date date,DateTimeFormat(patternyyyy-MM-dd) Date date1,DateTimeFormat(patternyyyy/MM/dd HH:mm:ss) Date date2){System.out.println(参数传递 date date);System.out.println(参数传递 date1(yyyy-MM-dd) date1);System.out.println(参数传递 date2(yyyy/MM/dd HH:mm:ss) date2);return {module:data param};
}3.2 DateTimeFormat注解介绍
名称DateTimeFormat类型形参注解位置SpringMVC控制器方法形参前面作用设定日期时间型数据格式属性pattern指定日期时间格式字符串
3.3 工作原理
其内部依赖Converter接口
public interface ConverterS, T {NullableT convert(S var1);
}请求参数年龄数据String→Integerjson数据转对象json → POJO日期格式转换String → Date
3.4 注意事项
传递日期类型参数必须在配置类上使用EnableWebMvc注解。其功能之一根据类型匹配对应的类型转换器。
4 响应
问题导入
如何响应json数据
4.1响应页面
Controller
public class UserController {//响应页面/跳转页面//返回值为String类型设置返回值为页面名称即可实现页面跳转RequestMapping(/toJumpPage)public String toJumpPage(){System.out.println(跳转页面);return page.jsp;}
}% page contentTypetext/html;charsetUTF-8 languagejava %
htmlheadtitleTitle/title/headbodyh2Hello Spring MVC!/h2/body
/html4.2 文本数据
//响应文本数据
//返回值为String类型设置返回值为任意字符串信息即可实现返回指定字符串信息需要依赖ResponseBody注解
RequestMapping(/toText)
ResponseBody
public String toText(){System.out.println(返回纯文本数据);return response text;
}4.3 json数据
//响应POJO对象
//返回值为实体类对象设置返回值为实体类类型即可实现返回对应对象的json数据需要依赖ResponseBody注解和EnableWebMvc注解
RequestMapping(/toJsonPOJO)
ResponseBody
public User toJsonPOJO(){System.out.println(返回json对象数据);User user new User();user.setName(itcast);user.setAge(15);return user;
}//响应POJO集合对象
//返回值为集合对象设置返回值为集合类型即可实现返回对应集合的json数组数据需要依赖ResponseBody注解和EnableWebMvc注解
RequestMapping(/toJsonList)
ResponseBody
public ListUser toJsonList(){System.out.println(返回json集合数据);User user1 new User();user1.setName(传智播客);user1.setAge(15);User user2 new User();user2.setName(黑马程序员);user2.setAge(12);ListUser userList new ArrayListUser();userList.add(user1);userList.add(user2);return userList;
}注意需要添加jackson-databind依赖以及在SpringMvcConfig配置类上添加EnableWebMvc注解
4.4 RequestBody注解介绍
名称RequestBody类型方法注解位置SpringMVC控制器方法定义上方作用设置当前控制器返回值作为响应体范例
RequestMapping(/save)
ResponseBody
public void save(){System.out.println(save()...);retuen {info:springmvc}
}4.5 转Json原理/过程
HttpMessageConverter接口
三 REST风格
1 REST简介
问题导入
Rest风格使用了几种请求方式定义访问行为
1.1 REST介绍
RESTRepresentational State Transfer表现形式状态转换 传统风格资源描述形式 http://localhost/user/getById?id1http://localhost/user/saveUser REST风格描述形式 http://localhost/user/1http://localhost/user 优点 隐藏资源的访问行为无法通过地址得知对资源是何种操作书写简化
1.2 RESTful介绍
按照REST风格访问资源时使用行为动作区分对资源进行了何种操作
链接操作如何区分http://localhost/users查询全部用户信息GET查询http://localhost/users/1查询指定用户信息GET查询http://localhost/users添加用户信息POST新增/保存http://localhost/users修改用户信息PUT修改/更新http://localhost/users/1删除用户信息DELETE删除
根据REST风格对资源进行访问称为RESTful
1.3 注意事项
上述行为是约定方式约定不是规范可以打破所以称REST风格而不是REST规范描述模块的名称通常使用复数也就是加s的格式描述表示此类资源而非单个资源例如users、books、accounts……
2 RESTful入门案例
问题导入
Rest风格如何通过路径传递参数
2.1 快速入门 做法在Controller中定义方法时设定http请求动作(请求方式)“和设定请求参数路径变量” Controller
public class UserController {//设置当前请求方法为POST表示REST风格中的添加操作RequestMapping(value /users,method RequestMethod.POST)ResponseBodypublic String save(){System.out.println(user save...);return {module:user save};}//设置当前请求方法为DELETE表示REST风格中的删除操作//PathVariable注解用于设置路径变量路径参数要求路径上设置对应的占位符并且占位符名称与方法形参名称相同RequestMapping(value /users/{id},method RequestMethod.DELETE)ResponseBodypublic String delete(PathVariable Integer id){System.out.println(user delete... id);return {module:user delete};}//设置当前请求方法为PUT表示REST风格中的修改操作RequestMapping(value /users,method RequestMethod.PUT)ResponseBodypublic String update(RequestBody User user){System.out.println(user update...user);return {module:user update};}//设置当前请求方法为GET表示REST风格中的查询操作//PathVariable注解用于设置路径变量路径参数要求路径上设置对应的占位符并且占位符名称与方法形参名称相同RequestMapping(value /users/{id} ,method RequestMethod.GET)ResponseBodypublic String getById(PathVariable Integer id){System.out.println(user getById...id);return {module:user getById};}//设置当前请求方法为GET表示REST风格中的查询操作RequestMapping(value /users,method RequestMethod.GET)ResponseBodypublic String getAll(){System.out.println(user getAll...);return {module:user getAll};}
}2.2 PathVariable介绍
名称PathVariable类型形参注解位置SpringMVC控制器方法形参定义前面作用绑定路径参数与处理器方法形参间的关系要求路径参数名与形参名一一对应
2.3 RequestBody、RequestParam、PathVariable区别和应用
区别 RequestBody接收请求体参数 用于接收json数据 RequestParam接收路径参数 用于接收url地址传参或表单传参 PathVariable接收路径变量 用于接收路径参数使用{参数名称}描述路径参数 应用 后期开发中发送请求参数超过1个时以json格式为主RequestBody应用较广如果发送非json格式数据选用RequestParam接收请求参数采用RESTful进行开发当参数数量较少时例如1个可以采用PathVariable接收请求路径变量通常用于传递id值
3 REST快速开发
3.1 代码中的问题 以上截图中的代码和我们之前写的UserController中的方法类似其中图中两个方法都有三处是有问题的可以进行优化。存在的问题如下 问题1每个方法的RequestMapping注解中都定义了访问路径/books重复性太高。 问题2每个方法的RequestMapping注解中都要使用method属性定义请求方式重复性太高。 问题3每个方法响应json都需要加上ResponseBody注解重复性太高。
3.2 Rest快速开发 解决以上三个问题 解决问题1在Controller类上使用RequestMapping定义共同的访问路径。
Controller
RequestMapping(/books)
public class BookController {RequestMapping(method RequestMethod.POST)public String save(RequestBody Book book){System.out.println(book save... book);return {module:book save};}RequestMapping(value /{id} ,method RequestMethod.DELETE)public String delete(PathVariable Integer id){System.out.println(book delete... id);return {module:book delete};}RequestMapping(method RequestMethod.PUT)public String update(RequestBody Book book){System.out.println(book update...book);return {module:book update};}RequestMapping(value /{id} ,method RequestMethod.GET)public String getById(PathVariable Integer id){System.out.println(book getById...id);return {module:book getById};}RequestMapping(method RequestMethod.GET)public String getAll(){System.out.println(book getAll...);return {module:book getAll};}
}解决问题2使用GetMapping PostMapping PutMapping DeleteMapping代替RequestMapping(methodRequestMethod.XXX)
Controller
RequestMapping(/books)
public class BookController {// RequestMapping( method RequestMethod.POST)PostMapping//使用PostMapping简化Post请求方法对应的映射配置public String save(RequestBody Book book){System.out.println(book save... book);return {module:book save};}// RequestMapping(value /{id} ,method RequestMethod.DELETE)DeleteMapping(/{id}) //使用DeleteMapping简化DELETE请求方法对应的映射配置public String delete(PathVariable Integer id){System.out.println(book delete... id);return {module:book delete};}// RequestMapping(method RequestMethod.PUT)PutMapping //使用PutMapping简化Put请求方法对应的映射配置public String update(RequestBody Book book){System.out.println(book update...book);return {module:book update};}// RequestMapping(value /{id} ,method RequestMethod.GET)GetMapping(/{id}) //使用GetMapping简化GET请求方法对应的映射配置public String getById(PathVariable Integer id){System.out.println(book getById...id);return {module:book getById};}// RequestMapping(method RequestMethod.GET)GetMapping //使用GetMapping简化GET请求方法对应的映射配置public String getAll(){System.out.println(book getAll...);return {module:book getAll};}
}名称GetMapping PostMapping PutMapping DeleteMapping类型方法注解位置基于SpringMVC的RESTful开发控制器方法定义上方作用设置当前控制器方法请求访问路径与请求动作每种对应一个请求动作例如GetMapping对应GET请求属性value默认请求访问路径
解决问题3在Controller类上使用RestController注解等同于Controller与ResponseBody两个注解组合功能
RestController //使用RestController注解替换Controller与ResponseBody注解简化书写
RequestMapping(/books)
public class BookController {//方法省略了没写
}名称RestController类型类注解位置基于SpringMVC的RESTful开发控制器类定义上方作用设置当前控制器类为RESTful风格等同于Controller与ResponseBody两个注解组合功能
4 案例基于RESTful页面数据交互
4.1 案例效果和环境准备
4.1.1 案例效果 4.1.2 环境准备
//POJO实体类
public class Book {private Integer id;private String type;private String name;private String description;public Integer getId() {return id;}public void setId(Integer id) {this.id id;}public String getType() {return type;}public void setType(String type) {this.type type;}public String getName() {return name;}public void setName(String name) {this.name name;}public String getDescription() {return description;}public void setDescription(String description) {this.description description;}Overridepublic String toString() {return Book{ id id , type type \ , name name \ , description description \ };}
}//SpringMVC容器初始化类
public class ServletContainersInitConfig extends AbstractAnnotationConfigDispatcherServletInitializer {protected Class?[] getRootConfigClasses() {return new Class[0];}protected Class?[] getServletConfigClasses() {return new Class[]{SpringMvcConfig.class};}protected String[] getServletMappings() {return new String[]{/};}//乱码处理Overrideprotected Filter[] getServletFilters() {CharacterEncodingFilter filter new CharacterEncodingFilter();filter.setEncoding(UTF-8);return new Filter[]{filter};}
}//SpringMVC配置类
Configuration
ComponentScan({com.itheima.controller,com.itheima.config})
EnableWebMvc
public class SpringMvcConfig {
}4.2 代码实现
4.2.1 制作SpringMVC控制器并通过PostMan测试接口功能
RestController
RequestMapping(/books)
public class BookController {PostMappingpublic String save(RequestBody Book book){System.out.println(book save book);return {module:book save success};}GetMappingpublic ListBook getAll(){System.out.println(book getAll is running ...);ListBook bookList new ArrayListBook();Book book1 new Book();book1.setType(计算机);book1.setName(SpringMVC入门教程);book1.setDescription(小试牛刀);bookList.add(book1);Book book2 new Book();book2.setType(计算机);book2.setName(SpringMVC实战教程);book2.setDescription(一代宗师);bookList.add(book2);Book book3 new Book();book3.setType(计算机丛书);book3.setName(SpringMVC实战教程进阶);book3.setDescription(一代宗师呕心创作);bookList.add(book3);return bookList;}
}4.2.2 设置对静态资源的访问放行
Configuration
public class SpringMvcSupport extends WebMvcConfigurationSupport {//设置静态资源访问过滤当前类需要设置为配置类并被扫描加载Overrideprotected void addResourceHandlers(ResourceHandlerRegistry registry) {//当访问/pages/????时候从/pages目录下查找内容registry.addResourceHandler(/pages/**).addResourceLocations(/pages/);registry.addResourceHandler(/js/**).addResourceLocations(/js/); registry.addResourceHandler(/css/**).addResourceLocations(/css/); registry.addResourceHandler(/plugins/**).addResourceLocations(/plugins/);}
}4.2.3 前端页面通过异步提交访问后台控制器
//添加
saveBook () {axios.post(/books,this.formData).then((res){});
},
//主页列表查询
getAll() {axios.get(/books).then((res){this.dataList res.data;});
},