学习 Spring MVC 我们只需要掌握以下 3 个功能:
对于 Spring MVC 来说,掌握了以上 3 个功能就相当于掌握了 Spring MVC。
Spring MVC 可以基于 Spring Boot 创建,也就是创建⼀个 Spring Boot 项⽬,勾选上 Spring Web 模块即可,如下图所示:
创建⼀个 UserController 类,实现⽤户到 Spring 程序的互联互通,具体实现代码如下:
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller // 让 spring 框架启动时,加载
@ResponseBody // 返回⾮⻚⾯数据
@RequestMapping("/user") // 路由器规则注册
public class UserController {
// 路由器规则注册
@RequestMapping("/hi")
public String sayHi(){
return "Hi,Spring MVC.
";
}
}
这样实现之后,当访问地址:http://localhost:8080/user/hi 时就能打印“hello,spring mvc”的信息了。
@ResponseBody 返回的值如果是字符会转换成 text/html,如果返回的是对象会转换成 application/json 返回给前端。
@ResponseBody 可以⽤来修饰⽅法或者是修饰类,修饰类表示类中的所有⽅法都会返回 html 或者 json,⽽不是视图
@RequestMapping 是 Spring Web 应⽤程序中最常被⽤到的注解之⼀,它是⽤来注册接⼝的路由映射的。
路由映射:所谓的路由映射指的是,当⽤户访问⼀个 url 时,将⽤户的请求对应到程序中某个类的某个⽅法的过程就叫路由映射
@RequestMapping 即可修饰类,也可以修饰⽅法,当修饰类和⽅法时,访问的地址是类 + ⽅法
@RequestMapping 也可以直接修饰⽅法
@Controller
@RequestMapping("/web")
public class WebController {
@RequestMapping("/index")
public String index(){
return "/index.html";
}
}
@ResponseBody
// @RequestMapping(value = "/indexData",method = RequestMethod.POST)
// @PostMapping("/indexData")
@GetMapping("/indexData")
get 请求的 3 种写法:
// 写法1
@RequestMapping("/index")
// 写法2
@RequestMapping(value = "/index",method = RequestMethod.GET)
// 写法3
@GetMapping("/index")
post 请求的 2 种写法:
// 写法1
@RequestMapping(value = "/index",method = RequestMethod.POST)
// 写法2
@PostMapping("/index")
@Slf4j
@RestController
@RequestMapping("/param")
public class ParamController {
@RequestMapping("/get14")
public Map<String,String> get14(){
Map<String,String> map = new HashMap<>();
map.put("k1","v1");
map.put("k2","v2");
map.put("k3","v3");
map.put("k4","v4");
return map;
}
}
@RequestMapping("/get1")
public String get1(HttpServletRequest request){
String name = request.getParameter("name");
return "name:"+name;
}
@RequestMapping("/get2")
public String get2(String name){
return "name:"+name;
}
@RequestMapping("/get3")
public String get3(String name,Integer age){
return "name:"+name +"| age:"+age;
}
@RequestMapping("/get4")
public String get4(Integer age){
return "age:"+age;
}
@RequestMapping("/get5")
public String get5(int age){
return "age:"+age;
}
@RequestMapping("/get6")
public String get6(Student student){
return student.toString();
}
某些特殊的情况下,前端传递的参数 key 和我们后端接收的 key 可以不⼀致,⽐如前端传递了⼀个 time 给后端,⽽后端⼜是有 createtime 字段来接收的,这样就会出现参数接收不到的情况,如果出现 这种情况,我们就可以使⽤ @RequestParam 来重命名前后端的参数值。
@RequestMapping("/get7")
public String get7(@RequestParam(name = "n") String name){
return "name:"+name;
}
如果我们的实际业务前端的参数是⼀个⾮必传的参数,我们可以通过设置 @RequestParam 中的 required=false 来避免不传递时报错,
@RequestMapping("/get7")
public String get7(@RequestParam(name = "n",required = false) String name){
return "name:"+name;
}
@RequestMapping("/get8")
public String get8(@RequestBody Student student){
log.info(student.toString());
return student.toString();
}
@RequestMapping("/get9/{shopid}/{dealid}")
public String get9(@PathVariable Integer shopid,@PathVariable("dealid") Integer dealId){
return "shopId:"+shopid + "|dealId:"+dealId;
}
@RequestMapping("/get10")
public String get10(@RequestPart("file") MultipartFile file) throws IOException {
log.info(file.getOriginalFilename());
file.transferTo(new File("D:/temp/"+file.getOriginalFilename()));
return "success";
}
@RequestMapping("/get11")
public String get11(@CookieValue(name = "bite1", required = false) String bite){
return "bite:"+bite;
}
@RequestMapping("/get12")
public String get12(@SessionAttribute(required = false) String username){
return "username:"+username;
}
@RequestMapping("/set1")
public String set1(HttpSession session){
session.setAttribute("username","bite");
return "success";
}
@RequestMapping("/get13")
public String get13(@RequestHeader("Host") String host){
return "host:"+host;
}
forward VS redirect
return 不但可以返回⼀个视图,还可以实现跳转,跳转的⽅式有两种:
请求转发如果资源和转发的⻚⾯不在⼀个⽬录下,会导致外部资源不可访问,演示示例如下。
@Controller
@RequestMapping("/index")
public class IndexController {
/**
* 请求转发
* @return
*/
@RequestMapping("/forward")
public String forward(){
return "forward:/index.html";
}
/**
* 请求重定向
* @return
*/
@RequestMapping("/redirect")
public String redirect(){
return "redirect:/index.html";
}
}
forward 和 redirect 具体区别如下: