目录点击跳转
什么是SpringMVC
- SpringMVC是一个Web框架
- SpringMVC是基于Servlet API构建的
MVC又是个啥呢?
MVC定义:
- Model 是应用程序中用于处理数据逻辑的部分,通常模型对象负责在数据库读取数据.(一些实体model等等)
- View 这里的视图应用程序中处理数据显示的部分.通常视同是依据模型数据创建的(由一些(jsp)框架加数据模型然后经过渲染呈现在服务器上的,这里的视图并非前端页面,这里的视图类似于运行在控制台上的信息)
- Controller程序中处理用户交互的部分.通常控制器负责从视图读取数据,控制用户输入,并向模型发送数据
SpringMVC 和MVC
SpringMVC作用
SpringMVC核心功能
- 连接功能:将用户输入的
url
和java
程序中的方法连接起来,访问一个地址可以调用我们的Spring程序 - 获取参数功能;想办法获取到用户在浏览器给我们传输的数据参数
- 输入数据功能: 拿到请求处理了业务数据,我们需要能够将响应数据发送给用户
SpringMVC项目创建和连接
编写Web接口代码用于浏览器访问
注意:
- 用于浏览器访问的接口只能用
@Controller
注解 - SpringMVC项目默认返回的是html静态页面,加上
@ResponseBody
取消默认可以返回静态页面以及文本数据等 @RequestMapping
注解设置路由,类上的可以省略,方法上的路由不能省略,前端通过ip+端口+这里的路径
访问该方法
package com.example.demo.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller //只能用Controller注解,直接和客户端交互!
@ResponseBody //默认只能返回静态页面(html) 加上该注解可以返回text/html
@RequestMapping("/user") //设置路由,url一级路径,可省略类上的路由!
public class UserController {
@RequestMapping("/get") //设置路由,url二级路径,这里就不能省略!
public String getUser(){
return "Hello 刘备";
}
}
启动项目:
浏览器输入对应的url
:
@RequestMapping 注解
- 基础使用:
基础使用就是在类上和方法上注册接口的路由映射
如果同时修饰类和方法,那用户访问的url路径就要包含这地址类+方法上的路由映射
也可以直接修饰方法直接访问方法路由映射
- @RequestMapping 是 post 还是 get 请求
@RequestMapping可用这两个请求方法访问
我们查看一下@RequestMapping
注解中可以访问的请求方法类型!
可以看到基本的请求方法都可以访问!
那如何设置指定请求访问访问呢?
GetMapping和PostMapping
- get请求的3种写法
//默认写法所有请求方法都可以访问
@RequestMapping("/index")
//指定get方法访问
@RequestMapping(value="/index",method = RequestMethod.GET)
//指定get方法访问
@GetMapping("/index")
我们通过其他请求方法进行访问
方法不允许
- @post请求的3种方法也是如此
//默认
@RequestMapping("/index")
//设置指定方法
@RequestMapping(value="/index",method = RequestMethod.POST)
@PostMapping("/index")
通过get请求访问!
获取参数
传递单个参数
@Controller
@RequestMapping(value = "/parame",method = RequestMethod.POST)//接收post请求
@ResponseBody //可以返回非静态页面!
public class GetParameter {
@RequestMapping("/get")
public void getSingerParamer(String name){
System.out.println("客户端发来的name: "+name);
}
}
启动项目后在浏览器发送一个post请求给服务器即可
可以看到SpringMVC接收请求直接通过参数就拿到了客户端的请求信息,不用使用之前Servlet通过Request请求中的信息读取!
注意
当前后端参数名称不一致时:
不一致,服务器端将获取不到客户端传来的数据
传递对象
对象实体类
@Data //生成get/setter等方法
public class User {
private String id;
private String name;
private String password;
}
获取到一个对象参数
@Controller
@ResponseBody
@RequestMapping("/user")
public class GetUser {
@RequestMapping("/get")
public void getUser(User user){
System.out.println(user.toString());
}
}
前端命名要和对象中的属性名相同
表单参数传递/传递多个参数(非对象)
@Controller
@RequestMapping(value = "/parame",method = RequestMethod.POST)//接收post请求
@ResponseBody //可以返回非静态页面!
public class GetParameter {
@RequestMapping("/get")
public void getSingerParamer(String name,Integer password){
System.out.println("客户端发来的name: "+name);
System.out.println("客户端发来的password: "+password);
}
}
后端参数重命名(后端参数映射)
我们如何解决这样的问题呢?
- 让客户端和我们后端的参数名匹配!
- 在我们服务器后端进行参数映射
显然第一种方法不是很科学,咱也不能这样子命令前端,都是打工人!
我们可以通过后端参数映射解决这个问题!
直接改参数名嘛? 显然可取,但是当我们已经用该参数写了好多代码时,这不就裂开了!
我们可以在方法头参数前加一个注解即可!
通过 @RequestParam
注解进行参数映射!
这样我们既不用改动前端的代码,也不用改变我们的参数名称就可以实现后端参数重命名!
@Controller
@RequestMapping(value = "/parame",method = RequestMethod.POST)//接收post请求
@ResponseBody //可以返回非静态页面!
public class GetParameter {
@RequestMapping("/get")
public void getSingerParamer(@RequestParam("username") String name, Integer password){
System.out.println("客户端发来的name: "+name);
System.out.println("客户端发来的password: "+password);
}
}
设置参数必传(@RequestParam)
当我们加了这个注解后如果,前端的名称不匹配,就会报错!
可能你会疑惑,刚刚没重命名都只是接收不到数据而已,也不会报错呀!
为啥会这样呢?
修改默认参数必传
@RequestParame("username",requird=false)
修改required
属性值为false即可修改默认!
修改为false
后,我们没有传递username参数也不会报错!
RequestBody接收json数据
我们直接前端发送json数据给服务器:
显然服务器接收不到!
我们通过在参数上加上@RequestBody
就可以接收到json数据了!
获取URL中的参数@PathVariable
@ResponseBody
@Controller
@RequestMapping("/user")
public class Path {
@GetMapping("get/{name}/{password}")
public void getPathVariable(@PathVariable String name,@PathVariable String password){
System.out.println("name:"+name);
System.out.println("password:"+password);
}
}
上传文件@RequestPart
@Controller
@ResponseBody
@RequestMapping("/file")
public class ParamePart {
@RequestMapping("/get")
public void getPart(@RequestPart MultipartFile file) throws IOException {
//将前端的文件保存在服务器路径
String filePath = file.getOriginalFilename();
//文件保存路径
String path = "D:/java/上传/"+filePath;
//创建文件对象
File desc = new File(path);
//该文件目录在磁盘中不存在,就创建该目录
if(!desc.exists()){
desc.mkdir();
}
//上传到该目录下
file.transferTo(desc);
}
}
未上传前
启动项目!
上传文件
注意:
获取Cookie/Session/header
@Controller
@RequestMapping("/header")
public class Param {
@RequestMapping("/get")
public void getHeader(HttpServletRequest request, HttpServletResponse response){
//这里获取cookie方式和之前Servlet一样,因为SpringMVC基于Servlet API
//获取cookie
Cookie[] cookies = request.getCookies();
System.out.println(Arrays.toString(cookies));
//获取Header中的其他信息
String UserAgent = request.getHeader("User-Agent");
System.out.println(UserAgent);
}
}
@Controller
@RequestMapping("/header")
public class Param {
@RequestMapping("/get")
public void getHeader(HttpServletRequest request, HttpServletResponse response){
//这里获取cookie方式和之前Servlet一样,因为SpringMVC基于Servlet API
//获取cookie
Cookie[] cookies = request.getCookies();
System.out.println(Arrays.toString(cookies));
//获取Header中的其他信息
String UserAgent = request.getHeader("User-Agent");
System.out.println(UserAgent);
}
@RequestMapping("/get1")
public String get1(@RequestHeader("User-Agent") String UserAgent , @CookieValue("bug") String cookieValue){
System.out.println("UserAgent:"+UserAgent+" \n Cookie bug:"+cookieValue);
return " ";
}
}
返回数据
返回静态页面
@Controller
@ResponseBody
@RequestMapping
public class TestMapping {
//@GetMapping("/index")
@RequestMapping(value = "/index",method = RequestMethod.GET)
public String getMapper(){
return "index.html";
}
}
返回text/html
@ResponseBody
@RequestMapping
public class TestMapping {
//@GetMapping("/index")
@RequestMapping(value = "/index",method = RequestMethod.GET)
public String getMapper(){
return "<h1>index</h1>";
}
}
返回JSON对象
@RestController //这个注解是@ResponseBody和@Controller组合!
public class GetJson {
@RequestMapping("/getJson")
public HashMap<String,Integer> getJson(){
HashMap<String,Integer> map = new HashMap<>();
map.put("刘备",18);
map.put("曹操",21);
map.put("诸葛亮",88);
return map;
}
}
我们通过Fiddler
抓包可以看到服务器返回的响应信息就是JSON
格式的数据!
请求转发或请求重定向
- forward : 请求转发
- redirect : 请求重定向
@Controller
@RequestMapping("/root")
public class Return {
@RequestMapping("/index1")
public String index1(){
//请求转发
return "forward:/index.html";
}
@RequestMapping("/index2")
public String index3(){
//请求重定向
return "redirect:/index.html";
}
}
forward
请求转发
redirect
请求重定向
注意:
forward和redirect区别
这两个如何区分呢?
请求转发外部资源丢失问题
请求转发forward
如果需要的资源和访问的页面不在通一个页面下,会导致外部资源丢失!
通过redirect
请求重定向!!!
通过forward
请求转发
外部资源丢失!
@RequestBody说明
- @RequestBody返回的值如果是字符会转成text/html,如果返回的是对象会转成application/json返回给前端
- @RequestBody可以用来修饰类或者方法,修饰类表示类中所有的方法都会返回html或者json,而不是视图
@RestController
是@Controller
和@ResponseBody
组合注解