1简介
springmvc是web层的框架,通过对servlet进行封装,接收前端发过来请求和数据然后经过处理并将处理的结果响应给前端。
- 掌握基于springmvc获取请求参数和响应json数据的操作
- 掌握REST开发风格
传统的三层架构为web、service、dao,web层主要由servlet来处理,用于页面请求数据处理以及响应数据给前端,但servlet处理请求和数据的时候,存在的问题是一个servlet只能处理一个请求。
针对web层进行优化,采用MVC设计模式,设计为controller、model、view,其中controller负责处理请求和数据的接收,接收后将其转发给service进行业务处理,service调用dao对数据进行增删改查,dao处理后将数据转发给service,service再交给controller,controller根据需求组装成model和view,model和view组合起来生成页面转发给前端浏览器。
上面的模式是同步调用,逐渐跟不上需求,因此异步调用慢慢的走到了前台,是较为流行的处理方式
因为是异步调用,所以后端不需要view视图,去除,但是前端如果通过异步调用的方式去进行交互,后台就需要将返回的数据转换成Json格式进行返回。
springmvc主要职责:
- controller接受请求并处理数据
- 将请求和数据转发给业务层
- 业务层去调dao层
- 将响应数据转换成json返回前端
2入门案例
- 创建web项目
通过maven创建,创建后设置打包方式为war包,然后点击project settings设置faces,添加目录结构和核心配置文件,之后将WEB-INF目录移动到webapp下,web工程完成 - 导入坐标
servlet的包要导入scope防止与tomcat中的servlet冲突,插件导入tomcat更便捷 - 配置类
@Configuration
@ComponentScan("com.itheima.controller")
public class SpringMvcConfig {
}
- controller
@Controller
public class UserController {
@RequestMapping("/save")
@ResponseBody
public String save(){
System.out.println("user save");
return "{'module':'springmvc'}";
}
@RequestMapping("/delete")
@ResponseBody
public String delete(){
System.out.println("delete");
return "{'module':'springmvc'}";
}
}
这里添加 @ResponseBody注解是讲返回的数据作为字符串,如果不加这个注解的话,服务器会按照返回的值去项目里寻找这个jsp文件,寻找网页进行返回。
@ResponseBody
- 配置类
public class ServletContainersInitConfig extends AbstractDispatcherServletInitializer{
//加载springMVC容器配置
protected WebApplicationContext createServletApplicationContext() {
AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext();
ctx.register(SpringMvcConfig.class);
return ctx;
}
//设置哪些请求归属springMVC处理
protected String[] getServletMappings() {
return new String[]{"/"};
}
//加载spring容器配置
protected WebApplicationContext createRootApplicationContext() {
return null;
}
}
工作流程解析:
- 服务器启动,执行ServletContainersInitConfig类,初始化web容器
- 执行createServletApplicationContext方法,创建了WebApplicationContext对象,该方法加载SpringMVC的配置类SpringMvcConfig来初始化SpringMVC的容器。
- 加载springmvc配置类
- 扫描ComponentScan加载对应的Bean
- 加载controller执行映射方法
bean加载控制:
简单的说就是springconfig设置加载spring用到的bean,springmvconfig加载springmvc用到的bean,不要冲突
3请求与响应(重点)
3.1 post和get请求的小问题
问题1 get请求乱码问题:
如果我们通过地址栏传参带的参数中含有中文,接收到的参数会出现中文乱码问题。tomcat8.5以后的版本已经解决,tomcat7的话,在配置文件插件的配置部分添加
<uriEncoding>UTF-8</uriEncoding><!--访问路径编解码字符集-->
问题2 postman发送post请求所用格式:
表单样式:x-www-form-uriencoded
问题3 post处理中文乱码
配置过滤器CharacterEncodingFilter
3.2 五种类型参数传递
- 普通参数
- POJO类型参数
- 嵌套POJO类型参数
- 数组类型参数
- 集合类型参数
- 普通参数类型:地址参数名与形参变量名相同,定义形参即可接收参数。
如果不一样,使用@RequestParam注解
- pojo数据类型:请求参数名与形参对象属性名相同,定义POJO类型形参即可接收参数
pojo:
发送请求和参数:
后台接收参数:
- 嵌套pojo类型:按照层次结构书写
- 数组类型参数
数组参数:请求参数名与形参对象属性名相同且请求参数为多个,定义数组类型即可接收参数
发送请求和参数
前台请求:
后台接收:
- 集合类型
如果按照数组的绑定关系绑定集合会报错,原因是SpringMVC将List看做是一个POJO对象来处理,将其创建一个对象并准备把前端的数据封装到对象中,但是List是一个接口无法创建对象,所以报错。
我们通过对其添加@RequestParam注解来解决问题,这是与数组不同的地方。
4 json数据传输参数
前面我们说过,现在比较流行的开发方式为异步调用。前后台以异步方式进行交换,传输的数据使用的是JSON,所以前端如果发送的是JSON数据,后端该如何接收?
对于JSON数据类型,我们常见的有三种:
- json普通数组([“value1”,“value2”,“value3”,…])
- json对象({key1:value1,key2:value2,…})
- json对象数组([{key1:value1,…},{key2:value2,…}])
json普通数组:
postman发送json数据
参数前添加@RequestBody
添加注解后,将外部传递的json数组数据映射到形参的集合对象中作为数据
json对象数据
请求体里写json对象即可
后端接收数据:
往形参对象上添加@RequestBody注解即可完成封装
Json对象数组
集合中保存多个POJO该如何实现?
请求和数据的发送:
后端接收:
总结:
SpringMVC接收JSON数据的实现步骤为:
(1)导入jackson包
(2)使用PostMan发送JSON数据
(3)开启SpringMVC注解驱动,在配置类上添加@EnableWebMvc注解
(4)Controller方法的参数前添加@RequestBody注解
@RequestBody与@RequestParam区别?
区别:
- @RequestParam用于接收url地址传参,表单传参【application/x-www-formurlencoded】
- @RequestBody用于接收json数据【application/json】
应用:
- 后期开发中,发送json格式数据为主,@RequestBody应用较广
- 如果发送非json格式数据,选用@RequestParam接收请求参数
5响应
SpringMVC接收到请求和数据后,进行一些了的处理,当然这个处理可以是转发给Service,
Service层再调用Dao层完成的,不管怎样,处理完以后,都需要将结果告知给用户。
** 设置返回页面(了解)**
- 此处未加注解,会去项目里寻找page.jsp进行跳转
跳转结果:
** 设置返回文本内容(了解)**
返回结果:
响应json对象(对象)
- 响应pojo对象
返回值为实体类对象,设置返回值为实体类类型,即可实现返回对应对象的json数据,需要依赖
@ResponseBody注解和@EnableWebMvc注解