SpringMVC 跳转、收参、参数传递

SpringMVC 的跳转方式

与普通的 JavaWeb 项目相同,跳转又两种方式,转发和重定向,其不同之处:转发跳转前后是同一次请求,地址栏不会改变,而跳转是指返回给浏览器端 3xx 状态码让其重新向建议 URL 发出新的请求,同时地址栏发生改变。

Controller 跳转到页面

页面可以是 JSP、Thymeleaf 模板等,是直接展示给前端浏览器的视图,有转发(Forward)和重定向(Redirect)两种方式

  1. forward:SpringMVC 默认的跳转到页面就是 forward 跳转,注意页面逻辑名前不要写 /
1
2
return "页面逻辑名";
return "index";
  1. redirect:即重定向页面跳转,使用 redirect: 关键字,注意 redirect 跳转页面不会经过试图解析器!(这里是一个坑,一定要注意)
1
2
return "redirect:/index.jsp"; // 跳转到本项目的某一个页面
return "redirect:https://www.baidu.com"; // 跳转到其他网页

Controller 跳转到 Controller

同样有转发(Forward)和重定向(Redirect)两种方式

  1. forward:使用关键字 forward:
1
return "forward:/跳转类上@RequestMapping的值/跳转方法上@RequestMapping的值";
  1. redirect:使用关键字 redirect:
1
return "redirect:/跳转类上@RequestMapping的值/跳转方法上@RequestMapping的值";

SpringMVC 的参数接收

SpringMVC 中使用控制器方法参数来收集客户端浏览器的请求参数,只要保证前台传递的参数名和后台控制器方法的参数名相同,SpringMVC 可以自动根据指定类型完成类型的转换操作

接收零散类型参数

SpringMVC 可以直接接受八种基本类型、String、日期类型

前台传递参数

  • 普通 GET 请求
1
http://localhost:8080/springmvc/param/test?name=zhangsan&age=19&sex=true&salary=11.11&bir=2012/12/12
  • 普通 POST 请求(表单提交)
1
2
3
4
5
6
7
8
<form action="${pageContext.request.contextPath}/param/test" method="post">
用户名: <input type="text" name="name"/> <br>
年龄: <input type="text" name="age"/> <br>
性别: <input type="text" name="sex"> <br>
工资: <input type="text" name="salary"> <br>
生日: <input type="text" name="bir"> <br>
<input type="submit" value="提交"/>
</form>
  • AJAX 异步 GET/POST 请求
    在 AJAX 发送请求的方法中,指明要访问的控制器路径,JSON 格式参数(注意键名必须和控制器方法参数名相同),回调函数即可

后台控制器接收参数

1
2
3
4
5
6
7
8
9
10
11
12
13
@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 方法名中的)相同

后台控制器接收

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// 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 请求
1
http://localhost:8080/springmvc/param/test2?names=zhangsan&names=lisi&names=wangwu
  • 普通 POST 请求(表单提交)
1
2
3
4
5
6
7
8
<form action="${pageContext.request.contextPath}/param/test2" method="post">
爱好: <br>
看书: <input type="checkbox" name="names"/>
看电视:<input type="checkbox" name="names"/>
吃饭: <input type="checkbox" name="names"/>
玩游戏: <input type="checkbox" name="names"/>
<input type="submit" value="提交"/>
</form>

注意:接收数组类型数据时前台传递多个相同的参数名会自动放入同一个数组中,参数名就是控制器参数中的数组名

后台控制器接收

1
2
3
4
5
6
7
@RequestMapping("/test2")
public String test2(String[] names){
for (String name : names) {
System.out.println(name);
}
return "index";
}

接收集合类型参数

SpringMVC 不支持在控制器方法参数中接受集合类型参数,如果要接收集合类型参数必须使用对象封装要接收接收类型才可以

前台传递参数

  • 普通 GET 请求
1
http://localhost:8080/springmvc/param/test3?lists=zhangsan&lists=lisi&lists=wangwu
  • 普通 POST 请求(表单提交)
1
2
3
4
5
6
7
8
<form action="${pageContext.request.contextPath}/param/test3" method="post">
爱好: <br>
看书: <input type="checkbox" name="lists"/>
看电视:<input type="checkbox" name="lists"/>
吃饭: <input type="checkbox" name="lists"/>
玩游戏: <input type="checkbox" name="lists"/>
<input type="submit" value="提交"/>
</form>

后台控制器接收

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
// 1.封装接收集合类型对象---->在spring mvc中用来接收集合类型参数
public class CollectionVO {
private List<String> lists;

public List<String> getLists() {
return lists;
}

public void setLists(List<String> lists) {
this.lists = lists;
}
}

// 2.控制器中接收集合类型参数
@RequestMapping("/test3")
public String test3(CollectionVO collectionVO){
List<String> list = collectionVO.getLists();
for(String s : list) {
System.out.println(s);
}

return "index";
}

接收参数中文乱码解决方案

在使用 SpringMVC 过程中 GET 方式接收请求参数时会出现中文乱码,需要自行指定编码方式

1
<Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443" URIEncoding="UTF-8"/>

SpringMVC 的数据传递

这里的数据传递是指将 Controller 里的数据保存到对应的作用域,供跳转之后的组件,例如另外一个 Controller 或者模板页面使用

Forward 跳转

  1. 使用 Servlet 中原生的的 Request 作用域传递数据
1
request.setAttribute("key",value);
  1. 使用 SpringMVC 中封装的 Model 对象传递数据,其底层也是对 Request 作用域的封装
1
model.addAttribute(key,value);

Redirect 跳转

1.使用 URL 拼接参数进行数据传递

1
url?name=zhangsan&age=21

2.使用 session 作用域

1
2
session.setAttribute(key,value);
session.getAttribute(key);

注意

以上 request 对象和 model 对象都可以从 Controller 方法的参数中直接声明,session 对象和 JavaWeb 阶段一样从 request 对象获得

1
2
3
4
5
6
7
8
9
@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