## SpringMVC 的跳转方式
与普通的 JavaWeb 项目相同,跳转又两种方式,转发和重定向,其不同之处:转发跳转前后是同一次请求,地址栏不会改变,而跳转是指返回给浏览器端 3xx 状态码让其重新向建议 URL 发出新的请求,同时地址栏发生改变。
### Controller 跳转到页面
页面可以是 JSP、Thymeleaf 模板等,是直接展示给前端浏览器的视图,有转发(Forward)和重定向(Redirect)两种方式
1. `forward`:SpringMVC 默认的跳转到页面就是 `forward` 跳转,注意页面逻辑名前不要写 `/`
```java
return "页面逻辑名";
return "index";
```
2. `redirect`:即重定向页面跳转,使用 `redirect:` 关键字,注意 `redirect` 跳转页面不会经过试图解析器!(这里是一个坑,一定要注意)
```java
return "redirect:/index.jsp"; // 跳转到本项目的某一个页面
return "redirect:https://www.baidu.com"; // 跳转到其他网页
```
### Controller 跳转到 Controller
同样有转发(Forward)和重定向(Redirect)两种方式
1. `forward`:使用关键字 `forward:`
```java
return "forward:/跳转类上@RequestMapping的值/跳转方法上@RequestMapping的值";
```
2. `redirect`:使用关键字 `redirect:`
```java
return "redirect:/跳转类上@RequestMapping的值/跳转方法上@RequestMapping的值";
```
## SpringMVC 的参数接收
SpringMVC 中使用**控制器方法参数**来收集客户端浏览器的请求参数,只要保证前台传递的参数名和后台控制器方法的参数名相同,SpringMVC 可以自动根据指定类型完成类型的转换操作
### 接收零散类型参数
SpringMVC 可以直接接受八种基本类型、String、日期类型
#### 前台传递参数
* 普通 GET 请求
```
http://localhost:8080/springmvc/param/test?name=zhangsan&age=19&sex=true&salary=11.11&bir=2012/12/12
```
* 普通 POST 请求(表单提交)
```html
```
* AJAX 异步 GET/POST 请求
在 AJAX 发送请求的方法中,指明要访问的控制器路径,JSON 格式参数(注意键名必须和控制器方法参数名相同),回调函数即可
#### 后台控制器接收参数
```java
@Controller
@RequestMapping("/param")
public class ParamController {
@RequestMapping("/test")
public String test(String name, Integer age, Boolean sex,Double salary,Date bir){
System.out.println("姓名: "+name);
System.out.println("年龄: "+age);
System.out.println("性别: "+sex);
System.out.println("工资: "+salary);
System.out.println("生日: "+bir);
return "index";
}
}
```
**注意**:SpringMVC 在接受日期类型参数时默认格式为 `yyyy/MM/dd HH:mm:ss` ,但是可以在控制器方法参数中指定其解析格式 `@DateTimeFormat(pattern = "yyyy-MM-dd") Date bir`
### 接收对象类型参数
前台传递参数的方式与上面相同,但是要注意传递的参数名要和要封装的对象(一般是 POJO 或者 VO)中的属性名(setter 方法名中的)相同
#### 后台控制器接收
```java
// 1.定义对象
public class User {
private String name;
private Integer age;
private Double salary;
private Boolean sex;
private Date bir;
}
// 2.控制器中接收
@RequestMapping("/test1")
public String test1(User user){
System.out.println("接收的对象: "+user);
return "index";
}
```
### 接收数组类型参数
#### 前台传递参数
#### 前台传递参数
* 普通 GET 请求
```
http://localhost:8080/springmvc/param/test2?names=zhangsan&names=lisi&names=wangwu
```
* 普通 POST 请求(表单提交)
```html
```
**注意**:接收数组类型数据时前台传递多个相同的参数名会自动放入同一个数组中,参数名就是控制器参数中的数组名
#### 后台控制器接收
```java
@RequestMapping("/test2")
public String test2(String[] names){
for (String name : names) {
System.out.println(name);
}
return "index";
}
```
### 接收集合类型参数
SpringMVC 不支持在控制器方法参数中接受集合类型参数,如果要接收集合类型参数必须使用对象封装要接收接收类型才可以
#### 前台传递参数
* 普通 GET 请求
```
http://localhost:8080/springmvc/param/test3?lists=zhangsan&lists=lisi&lists=wangwu
```
* 普通 POST 请求(表单提交)
```html
```
#### 后台控制器接收
```java
// 1.封装接收集合类型对象---->在spring mvc中用来接收集合类型参数
public class CollectionVO {
private List lists;
public List getLists() {
return lists;
}
public void setLists(List lists) {
this.lists = lists;
}
}
// 2.控制器中接收集合类型参数
@RequestMapping("/test3")
public String test3(CollectionVO collectionVO){
List list = collectionVO.getLists();
for(String s : list) {
System.out.println(s);
}
return "index";
}
```
### 接收参数中文乱码解决方案
在使用 SpringMVC 过程中 GET 方式接收请求参数时会出现中文乱码,需要自行指定编码方式
```xml
```
## SpringMVC 的数据传递
这里的数据传递是指将 Controller 里的数据保存到对应的作用域,供跳转之后的组件,例如另外一个 Controller 或者模板页面使用
### Forward 跳转
1. 使用 Servlet 中原生的的 Request 作用域传递数据
```java
request.setAttribute("key",value);
```
2. 使用 SpringMVC 中封装的 `Model` 对象传递数据,其底层也是对 Request 作用域的封装
```java
model.addAttribute(key,value);
```
### Redirect 跳转
1.使用 URL 拼接参数进行数据传递
```java
url?name=zhangsan&age=21
```
2.使用 session 作用域
```java
session.setAttribute(key,value);
session.getAttribute(key);
```
### 注意
以上 `request` 对象和 `model` 对象都可以从 Controller 方法的参数中直接声明,`session` 对象和 JavaWeb 阶段一样从 `request` 对象获得
```java
@GetMapping("test")
public String test(HttpServletRequest request, HttpServletResponse response, Model model) {
request.setAttribute("user1",new User());
model.addAttribute("user2",new User());
HttpSession session = request.getSession();
session.setAttribute("user3",new User());
User user = (User)session.getAttribute("user3");
return "index";
}
```
## 参考
[百知教育 SpringMVC](https://www.bilibili.com/video/BV1WD4y1D7kz)

SpringMVC 跳转、收参、数据传递