1.大体概述
新增注解
1.@controller // 类上 controller层的bean类
2.@RequestMapping("/xx") //类上和方法上 路径请求前缀
3.@RsponseBody //类上 给浏览器返回指定json数据(本质上是字符串信息)
4.@RestController // 类注解 等同于@Controller与@ResponseBody两个注解组合功能
5.@RequsestParam("xx name")//参数注解: 参数中当请求参数名与形参变量名不同 别名关联
6.@EnableWebMvc //配置类 开启json数据类型自动转换
7.@RequestBody //参数注解 接受浏览器给我们的数据是json
8.@PathVariable //参数注解 绑定路径参数与处理器方法形参间的关系 出现根据id查询或者根据id删除使用
9.@GetMapping(查询) @PostMapping(增加) @PutMapping(修改) @DeleteMapping(删除) //方法注解
@RequestBody、@RequestParam、@PathVariable区别和应用
1.区别
@RequestParam用于接收url地址传参或表单传参
@RequestBody用于接收json数据 3种接受数据
@PathVariable用于接收路径参数,使用{参数名称}描述路径参数
2.应用
1.后期开发中,发送请求参数超过1个时,以json格式为主,@RequestBody应用较广
2.如果发送非json格式数据,选用@RequestParam接收请求参数
3.采用RESTful进行开发,当参数数量较少时,例如1个,可以采用@PathVariable接收请求路径变量,通常用于传递id值
1.springMVC概述
1. SpringMVC是一种基于Java实现MVC模型的轻量级Web框架
2. 优点
1. 使用简单,开发便捷(相比于Servlet):接受请求参数 和响应结果
1. 灵活性强
SpringMvc就是让我们编写一个个的Controller,相当于以前的servlet
处理请求,通常将结果转换成json响应给客户端
2.在Controller中如何定义访问路径,如何响应数据?
在controller下的方法上写@RequestMapping("/save") 设置访问路径
3.单次请求过程
前端发送请求想访问save--->springmvc拦截-->转发到类下的方法路径@RequestMapping("/save")
4.springmvc加载bean 和 spring加载bean 怎么区分
1.在springconfig核心配置类
@ComponentScan精确扫描({"com.itheima.service","com.itheima.dao"})
2.创建springMvcConfig类
@ComponentScan精确扫描("com.itheima.controller")
5.在config包下创建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[]{"/"};
}
}
2.SpringMvc入门
1.实现步骤
1 创建web工程(Maven结构)
2 设置tomcat服务器,加载web工程(tomcat插件)
3 导入坐标(SpringMVC+Servlet)
4 创建处理器类BrandController
// 添加@Controller 注解 表示当前对象交给springMvc容器来管理
创建处理方法:seleteAllBrand方法
// 添加@ResponseBody 默认情况,表示方法会查找响应的响应页面返回给前端
// 添加@RequestMapping("/selectAll") //设置当前处理器方法,处理具体请求路径
5 编写SpringMVC配置类,加载处理请求的Bean。(一次操作) //本质还是spring配置类
// @Configuration //表示配置类
// @ComponentScan("com.itheima") //扫包路径
6 加载SpringMVC配置类,并设置SpringMVC请求拦截的路径
public class ServletConfig extends AbstractDispatcherServletInitializer{
//web容器配置类 取代web.xml文件
//创建容器
AnnotationConfigWebApplicationContext context = new AnnotationConfigWebApplicationContext();
//注册容器
context.register(SpringMvcConfig.class);
return context;
代码演示
【第一步】创建web工程(Maven结构)
骨架创建-->导入缺少java和resourse
【第二步】设置tomcat服务器,加载web工程(tomcat插件)
<build>
<plugins>
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.1</version>
<configuration>
<port>80</port>
<path>/</path>
</configuration>
</plugin>
</plugins>
</build>
【第三步】导入坐标(SpringMVC+Servlet)
<dependencies>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.2.10.RELEASE</version>
</dependency>
</dependencies>
第四步 创建处理器类BrandController
//处理器类 :取代Servlet 处理各种前端请求
@Controller //注解 当前对象交给spring容器来管理 SpringMvc
@RequestMapping("/brands") //请求前缀 添加在处理器上,设置当前处理器处理模块请求,请求映射值,配置模块的名称+s
public class BrandController {
//开发前后端模式:html+ajax----web层
@ResponseBody //默认情况,次注解 方法会查找响应的响应页面返回给前端
//注解作用
@RequestMapping("/selectAll") //设置当前处理器方法,处理具体请求路径
public String selectAllBrand(){
return "selectAll Brand.......";
}
@ResponseBody
@RequestMapping("/add")
public String addBrand(){
return "addBrand.......";
}
@ResponseBody
@RequestMapping("/delete")
public String deleteBrand(){
return "deleteBrand.......";
}
@ResponseBody
@RequestMapping("/update")
public String updateBrand(){
return "updateBrand.......";
}
第五步 编写SpringMVC配置类
@Configuration //表示配置类
@ComponentScan("com.itheima") //扫包
public class SpringMvcConfig {
}
第六步 加载SpringMVC配置类
//服务器启动时:自动获取当前配置类,获取当前tomcat服务器基本配置 此类配置向房屋web.xml(配置tomcat)
public class ServletConfig extends AbstractDispatcherServletInitializer{
//1.配置创建springmvc 容器
@Override
protected WebApplicationContext createServletApplicationContext() {
//创建web容器
AnnotationConfigWebApplicationContext context = new AnnotationConfigWebApplicationContext();
//注册容器
context.register(SpringMvcConfig.class);
return context;
}
//2.告知tomcat 那些请求
@Override
protected String[] getServletMappings() {
return new String[]{"/"}; //所有的请求都交给springMvc来处理
}
//3.配置创建 加载 spring 容器
@Override
protected WebApplicationContext createRootApplicationContext() {
//创建web容器
AnnotationConfigWebApplicationContext context = new AnnotationConfigWebApplicationContext();
//注册容器
context.register(SpringConfig.class);
return context;
}
//附:
// 解决resquset 请求参数乱码问题
//tomcat调用此方法,获取当前项目中配置的过滤器,应用过滤器 解决post乱码问题
//快捷方式 右键-->generate-->Override method-->找到filter的过滤器生成
//4. 在pom.xml添加tomcat7插件处配置UTF-8字符集,解决GET请求中文乱码问题。
@Override
protected Filter[] getServletFilters() {
//创建字符集过滤器
CharacterEncodingFilter encodingFilter = new CharacterEncodingFilter();
//设置字符集
encodingFilter.setEncoding("utf-8");
return new Filter[]{encodingFilter};
}
}
3.接受请求8种(g5j3)与响应4种
tomcat启动顺序 1.启动servletConfig加载容器类 -->启动springmvcconfig类-->启动controller
1.接受get数据用的注解
@RequestParam :请求参数名与形参名不同时
@ResponseBody :在方法上都加 准没错
2.接收json数据用的注解
1.记得添加json转换用的依赖坐标 具体下面有
@EnableWebMvc注解 :开启json数据类型自动转换 //config配置类开启
@ResponseBody注解 ://方法上 返回给浏览器为json
@RequestBody注解 ://参数中,外部的json对象 保存到形参中
3.响应json数据使用到的注解
@ResponseBody注解 ://方法上 返回给浏览器为json
@EnableWebMvc注解 :开启json数据类型自动转换 //config配置类开启
2.接受请求参数传递
1.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'}";
}
附:get请求中文乱码的话,在tomcat插件可以解决
<build>
<plugins>
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.1</version>
<configuration>
<port>80</port><!--tomcat端口号-->
<path>/</path> <!--虚拟目录-->
<uriEncoding>UTF-8</uriEncoding><!--访问路径编解码字符集-->
</configuration>
</plugin>
</plugins>
</build>
2.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请求中文乱码处理
在加载SpringMVC配置的配置类中指定字符过滤器
// 解决resquset 请求参数乱码问题
//tomcat调用此方法,获取当前项目中配置的过滤器,应用过滤器 解决post乱码问题
//快捷方式 右键-->generate-->Override method-->找到filter的过滤器生成
//4. 在pom.xml添加tomcat7插件处配置UTF-8字符集,解决GET请求中文乱码问题。
@Override
protected Filter[] getServletFilters() {
//创建字符集过滤器
CharacterEncodingFilter encodingFilter = new CharacterEncodingFilter();
//设置字符集
encodingFilter.setEncoding("utf-8");
return new Filter[]{encodingFilter};
}
1.接受请求五种get类型的参数介绍
1.普通参数
2.POJO类型参数
3.嵌套POJO类型参数
4.数组类型参数
5.集合类型参数
1.普通参数
//普通参数:请求参数名与形参名不同时,使用@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'}";
}
2.POJO类型参数
定义一个javabean类 参数一致
POJO参数:请求参数名与形参对象属性名相同,定义POJO类型形参即可接收参数
@data //注解替代下面手动方法
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'}";
}
3.嵌套POJO类型参数 又名POJO对象中包含POJO对象
public class User {
private String name;
private int age;
private Address address;
//同学们自己添加getter/setter/toString()方法
}
public class Address {
private String province;
private String city;
private Address address;
}
嵌套POJO参数:请求参数名与形参对象属性名相同,按照对象层次结构关系即可接收嵌套POJO属性参数
//嵌套POJO参数:嵌套属性按照层次结构设定名称即可完成参数传递
@RequestMapping("/pojoContainPojoParam")
@ResponseBody
publicStringpojoContainPojoParam(Useruser){
System.out.println("pojo嵌套pojo参数传递 user ==> "+user);
return"{'module':'pojo contain pojo param'}";
}
4.数组类型参数
数组参数:请求参数名与形参对象属性名相同且请求参数为多个,定义数组类型即可接收参数
//数组参数:同名请求参数可以直接映射到对应名称的形参数组对象中
@RequestMapping("/arrayParam")
@ResponseBody
public String arrayParam(String[] likes){
System.out.println("数组参数传递 likes ==> "+ Arrays.toString(likes));
return "{'module':'array param'}";
}
5.集合类型参数
集合保存普通参数:请求参数名与形参集合对象名相同且请求参数为多个,@RequestParam绑定参数关系
//集合参数:同名请求参数可以使用@RequestParam注解映射到对应名称的集合对象中作为数据
@RequestMapping("/listParam")
@ResponseBody
public String listParam(@RequestParam List<String> likes){
System.out.println("集合参数传递 likes ==> "+ likes);
return "{'module':'list param'}";
}
2.接受三种json字符串数据传参
1.使用注解
@EnableWebMvc注解 :开启json数据类型自动转换 //config配置类开启
@ResponseBody注解:参数上 浏览器给的参数是json
2.json数据三种参数介绍
1. json普通数组(["","","",...])
2. json对象({key:value,key:value,...})
3. json对象数组([{key:value,...},{key:value,...}])
3.模拟三种参数传输
传递json普通数组
1.首先添加json数据转换相关坐标
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.0</version>
</dependency>
2.模拟小飞人 设置发送json数据(请求body中添加json数据)
1.设置body 2.设置raw 3.设置json 4.添加["game
","music","travel"]
3.config开启自动转换json数据的支持
@Configuration
@ComponentScan("com.itheima.controller")
//开启json数据类型自动转换
@EnableWebMvc
public class SpringMvcConfig {
}
4.在Controller中编写方法接收json参数
//集合参数:json格式
//1.开启json数据格式的自动转换,在配置类中开启@EnableWebMvc
//2.使用@RequestBody注解将外部传递的json数组数据映射到形参的集合对象中作为数据
@RequestMapping("/listParamForJson")
@ResponseBody //返回给浏览器为json //参数中,浏览器给我的数据json
public String listParamForJson(@RequestBody List<String> likes){
System.out.println("list common(json)参数传递 list ==> "+likes);
return "{'module':'list common for json param'}";
}
传递json对象
注:POJO参数:json数据与形参对象属性名相同,定义POJO类型形参即可接收参数
在小飞人模拟发送json数据
在Controller中编写方法接收json参数
//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'}";
}
传递json对象数组
注:POJO集合参数:json数组数据与集合泛型属性名相同,定义List类型形参即可接收参数
//集合参数:json格式
//1.开启json数据格式的自动转换,在配置类中开启@EnableWebMvc
//2.使用@RequestBody注解将外部传递的json数组数据映射到形参的保存实体类对象的集合对象中,要求属性名称一一对应
@RequestMapping("/listPojoParamForJson")
@ResponseBody
public String listPojoParamForJson(@RequestBody List<User> list){
System.out.println("list pojo(json)参数传递 list ==> "+list);
return "{'module':'list pojo for json param'}";
}
4.请求映射路径前缀
1.RequestMapping
@Controller
//类上方配置的请求映射与方法上面配置的请求映射连接在一起,形成完整的请求映射路径
@RequestMapping("/user")//1级路径
public class UserController {
//请求路径映射
@RequestMapping("/save") //二级路径此时save方法的访问路径是:/user/save
@ResponseBody
public String save(){
System.out.println("user save ...");
return "{'module':'user save'}";
}
}