SpringMVC
概念:
1.SpringMVC是Spring框架后续开发的web模块.主要负责与前端用户进行交互.
2.SpringMVC基于Servlet进行开发的框架,目的简化前后端的调用.
SpringMVC入门案例
创建项目
勾选jar包
测试Tomact服务器是否正常使用
编辑HelloController
package com.jt.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
public class HelloController {
@RequestMapping("/hello")
@ResponseBody
public String hello(){
return "你好MVC";
}
}
页面效果
URL1: http://localhost:8080/hello
URL2: http://127.0.0.1:8080/hello
SpringMVC底层实现原理
重要组件:
1. 前端控制器 DispatcherServlet
2. 处理器映射器 handlerMapping
3. 处理器适配器 handlerAdapter
4. 视图解析器 ViewResolver
SpringMVC调用流程:
1. 用户发起请求之后,第一步访问就是前端控制器.
2. 前端控制器只负责请求的转发/响应. 没有办法直接处理业务.
3.当SpringMVC容器启动时,处理器映射器首先会加载所有的@RequestMapping注解.将请求路径与方法进行绑定.保存到Map中. Map</url,method方法>, 当前端控制器发送请求被处理器映射器接收.如果URL地址匹配,则告知应该执行哪个方法.如果url地址不匹配.,则提示用户404
前端控制器得知将要执行的方法是谁,但是前端控制只能转发,没有办法执行业务.
所以请求处理器适配器执行业务逻辑.
处理器适配器针对配置文件(xml方式/注解方式/其它方式)的格式,挑选合适的处理器去执行业务逻辑. 业务执行成功之后返回ModelAndView对象 Model:业务数据 View:页面
历史版本: 需要返回页面名称,及将数据填充到页面中
6. 前端控制器接收到返回的ModelAndView之后,交给视图解析器去解析数据. 视图解析器通过自身的配置获取页面的名称 (/web/user.html).
7. 最终通过经过视图渲染,将数据填充到页面中.最终用户看到的页面就包含了业务数据.
前后端分离方式:
关键用法: @ResponseBody 要求返回业务数据并且转化为JSON串. 程序直接跳过6-7直接将数据返回给用户.
SpringMVC 参数接收用法
Servlet版本:
package com.jt.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@Controller
public class UserController {
@RequestMapping("/findUser")
@ResponseBody //响应 JSON
//request.getParameter返回值都是string类型
public String findUser(HttpServletRequest request, HttpServletResponse response){
String id = request.getParameter("id");
//将string类型转化为int
int intid=Integer.parseInt(id);
String name = request.getParameter("name");
return intid+":"+name;
}
}
运行结果:
MVC版本
方式一:直接接收
优点:自动转化参数类型
package com.jt.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
public class UserController {
@RequestMapping("/findUser2")
@ResponseBody
public String findUser2(Integer id,String name){
return id+":"+name;
}
}
运行结果:
优化
package com.jt.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@RestController //@Controller+@ResponseBody
@RequestMapping("/user")
public class UserController {
@RequestMapping("/findUser")
//request.getParameter返回值都是string类型
public String findUser(HttpServletRequest request, HttpServletResponse response){
String id = request.getParameter("id");
//将string类型转化为int
int intid=Integer.parseInt(id);
String name = request.getParameter("name");
return intid+":"+name;
}
@RequestMapping("/findUser2")
public String findUser2(Integer id,String name){
return id+":"+name;
}
}
方式二:使用对象接收参数
/**
* url:http://localhost:8080/user/getUser?id=1&name=李四&age=18
* 返回值: User对象
* 知识点:
* 当遇到多个参数时,可以使用对象封装.
* 要求对象的属性必须与参数名称一致,同时必须有Set/Get方法.
* SpringMVC会自动的将参数赋值给对象的属性.
*/
@RequestMapping("/getUser")
public User getUser(User user){
return user;
}
RestFul结构
RestFul语法
1.URL中请求的参数使用/分割
用户写的: http://localhost:8080/user/restFul/1/张三
2.服务器端参数接收时,变量使用{xx}进行包裹,并且位置固定.
3.利用@PathVariable注解,动态获取路径中的数据,要求名称必须匹配
/**
* RestFul结构 动态接收参数
* url: http://localhost:8080/user/restFul/1/张三
* 返回值: 返回User对象
* 难点: 需要从URL的路径中获取参数!!!
* 语法:
* 1.服务器端参数接收时,变量使用{xx}进行包裹,并且位置固定.
* 2.利用@PathVariable注解,动态获取路径中的数据,要求名称必须匹配
*/
@RequestMapping("/restFul/{id}/{name}")
public User restFul(@PathVariable Integer id,
@PathVariable String name){
User user = new User();
user.setId(id);
user.setName(name);
return user;
}
运行结果:
运行
RestFul结构对象传参
/**
* URL: http://localhost:8080/user/restFul2/1/王五/18
* RestFul对象接收:
* 如果对象的属性与{key}相同,则可以使用对象接收.
* 用途: restFul结构 一般用于更新操作
* @param user
* @return
*/
@RequestMapping("/restFul2/{id}/{name}")
public User restFul2(User user){
return user;
}
运行结果
请求类型与业务的关系
请求类型
规则: 随着业务深入,请求类型与业务渐渐的绑定.
新增: post请求类型 @PostMapping("")
删除: delete请求类型 @DeleteMapping("")
修改: put请求类型 @PutMapping("")
查询: get请求类型 @GetMapping("")
package com.jt.controller;
import com.jt.jopo.User;
import org.springframework.web.bind.annotation.*;
@RestController //@Controller+@ResponseBody
@RequestMapping("/user")
public class UserController {
@GetMapping("/restful2/{id}/{name}")
public User restful2(User user){
return user;
}
}
运行结果:
注解:
@RequestMapping():负责用户的请求路径与后台服务器的映射关系
@ResponseBody:将服务器的返回值转化为JSON
@RestController:@RestController==@Controller+@ResponseBody
@PathVariable:动态获取路径中的数据,要求名称必须匹配
@PostMapping(""):新增:post请求类型
@DeleteMapping(""):删除: delete请求类型
@PutMapping(""):put请求类型 @PutMapping("")
@GetMapping(""):get请求类型 @GetMapping("")