开发者社区> 技术小甜> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

Spring MVC 传值方式总结

简介:
+关注继续查看

前端传到Controller:

方法1

通过HttpServletRequest 。写法如下:

1
2
3
4
5
6
7
8
9
@Controller
public class MyTestController {
@RequestMapping("/print")
public String PrintInfo(HttpServletRequest request) {
System.out.println("name:" +request.getParameter("name"));
System.out.println("age:" + request.getParameter("age"));
return "testpage";
}
}

HttpServletRequest类是Servlet中的类型,代表了一个Servlet请求。无论Post还是Get请求,都能通过这种方式获取到。

比如上面的代码,通过Get方法,如下地址

http://127.0.0.1:8080/WebApp/print?name=zhangsan&age=30

也可以通过Post方法,使用Postman工具模拟一个post请求,都可以将值传到Controller。

这招可以获得Cookie以及Session数据。

还可以通过注解@Autowired,将HttpServletRequest 自动的注入进来,不必担心多线程下的并发问题,因为这里HttpServletRequest注入的是一个AOP proxy ,而不是一个普通bean 。每次请求过来,都会检查线程本地属性,来获取真正的Request对象。这些都是Spring自动配置的默认场景。可以参阅https://docs.spring.io/spring/docs/current/spring-framework-reference/html/beans.html#beans-factory-scopes-other-injection

但是不推荐使用这个方法,因为这种方法破坏了对一个注入对象的常规理解,造成混乱。

代码如下:

1
2
3
4
5
6
7
8
9
10
11
@Controller
public class MyTestController {
@Autowired
private HttpServletRequest request;
@RequestMapping(value="/print")
public String PrintInfo() {
System.out.println("name:" +request.getParameter("name"));
System.out.println("age:" + request.getParameter("age"));
return "testpage";
}
}

方法2

使用路径变量。写法如下:

1
2
3
4
5
6
7
8
9
@Controller
public class MyTestController {
@RequestMapping("/print/{name}/{age}")
public String PrintInfo(@PathVariable String name, @PathVariable int age) {
System.out.println("name:" + name);
System.out.println("age:" + age);
return "testpage";
}
}

@RequestMapping中的{}中即为路径变量,该变量还需要在方法的参数值出现,并且标记@PathVariable。

通过URL匹配的方式既可以实现传值,这是REST风格的一种传值方式。

上面的例子,只需输入URL:

http://127.0.0.1:8080/WebApp/print/ZhangSan/30

controller接收到传值,输出:

name:ZhangSan

age:30

@RequestMapping("/print/{name}/{age}")是@RequestMapping(Value="/print/{name}/{age}")的缩写形式,本质上是一样的。

方法3

参数名匹配的方式:

1
2
3
4
5
6
7
8
9
@Controller
public class MyTestController {
@RequestMapping(value="/print")
public String PrintInfo(String name, int age) {
System.out.println("name:" +name);
System.out.println("age:" + age);
return "testpage";
}
}

或者:

1
2
3
4
5
6
7
8
9
@Controller
public class MyTestController {
@RequestMapping(value="/print")
public String PrintInfo(@RequestParam("name") String name,@RequestParam("age"int age) {
System.out.println("name:" +name);
System.out.println("age:" + age);
return "testpage";
}
}

当请求传入的参数名字和controller

中代码的名字一样的时候,两种方式都可以,区别在于使用了注解@RequestParam,可以设置一个默认值来处理到null值。

1
@RequestParam(value="name", defaultValue="John")

但是如果请求中参数的名字和变量名不一样的时候,就只能使用@RequestParam注解。例如请求的参数为如下的时候:

http://localhost:8080/WebApp/print?user_name=somename&user_age=30

Controller代码只能如下的写法

1
2
3
4
@RequestMapping(value="/print")
public String PrintInfo(@RequestParam("user_name") String name, @RequestParam("user_age")int age) {
...
}

尽量使用@RequestParam注解,因为这样可以清晰的知道该参数来自Request,可读性高。

方法4

传递请求头中的参数,需要用到@RequestHeader注解,该注解将Header中的值绑定到参数上,可以获取一个,多个或者所有的参数。例如

1
2
3
4
5
6
7
8
9
10
@Controller
public class MyTestController {
@RequestMapping(value="/print")
public String PrintInfo(@RequestHeader Map<String, String> headers) {
for (String elem: headers.keySet()) {
System.out.println(elem + " : " + headers.get(elem));
}
return "testpage";
}
}

或者

1
2
3
4
5
6
7
8
9
10
@Controller
public class MyTestController {
@RequestMapping(value="/print")
public String PrintInfo(@RequestHeader("User-Agent") String userAgent) {
System.out.println("12");
System.out.println("name:" +userAgent);
//System.out.println("age:" + age);
return "testpage";
}
}

方法5

使用到@RequestBody注解,得到整个RequestBody的信息

1
2
3
4
5
6
7
8
@Controller
public class MyTestController {
@RequestMapping(value="/print")
public String PrintInfo(@RequestBody String body) {
System.out.println("body:" +body);
return "testpage";
}
}

@RequestBody可以将Json数据直接映射程Java对象。例如:

方法6

采用@ModelAttribute注解,命名匹配,Post中的参数值和Model中的参数值一致的话,会自动绑定到该值。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
@Controller
public class MyTestController {
@RequestMapping(value="/print")
public String PrintInfo(@ModelAttribute User user) {
System.out.println("6");
System.out.println("Name:" +user.getName());
System.out.println("Age:" +user.getAge());
return "testpage";
}
}
public class User {
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}

然后当Post的值中有name和age时,Controller中的user对象会自动附上值。

Controller传递到JSP

方法1

使用ModelAndView类,代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
@RequestMapping("/hello")
public ModelAndView showMessage() {
ModelAndView mv = new ModelAndView("helloworld");
mv.addObject("userList", GetUserList());
return mv;
}
public List<User> GetUserList()
{
List<User> lst=new ArrayList<User>();
User user1=new User();
user1.setName("zhangsan");
user1.setAge(20);
lst.add(user1);
User user2=new User();
user2.setName("lisi");
user2.setAge(30);
lst.add(user2);
return lst;
}

JSP页面中:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Spring 4 MVC -HelloWorld</title>
</head>
<body>
<c:forEach items="${userList}" var="user">
${user.name} ${user.age}
<br />
</c:forEach>
</body>
</html>

ModelAndView 初始化的时候,设置了view的名字,同时也把对象存起来,直接传给view。简单实用。


方法2

使用Model或者ModelMap

(Model是一个接口,ModelMap实现了Model接口)

该方法和ModelAndView方法相似,只是Model和View分开来了,通过返回一个String来找到View,Model是注入到Controller的一个参数,通过对它添加属性,在jsp端读取值。代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
@Controller
public class HelloWorldController {
String message = "Welcome to Spring MVC!";
@RequestMapping("/hello")
public String showMessage(Model model) {
model.addAttribute("userList", GetUserList());
return "helloworld";
}
public List<User> GetUserList()
{
List<User> lst=new ArrayList<User>();
User user1=new User();
user1.setName("zhangsan");
user1.setAge(10);
lst.add(user1);
User user2=new User();
user2.setName("lisi");
user2.setAge(33);
lst.add(user2);
return lst;
}
}

JSP页面中:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Spring 4 MVC -HelloWorld</title>
</head>
<body>
<c:forEach items="${userList}" var="user">
${user.name} ${user.age}
<br />
</c:forEach>
</body>
</html>






















本文转自cnn23711151CTO博客,原文链接:http://blog.51cto.com/cnn237111/1894506 ,如需转载请自行联系原作者

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
springboot(四):thymeleaf使用详解
在上篇文章springboot(二):web综合开发中简单介绍了一下thymeleaf,这篇文章将更加全面详细的介绍thymeleaf的使用。thymeleaf 是新一代的模板引擎,在spring4.0中推荐使用thymeleaf来做前端模版引擎。 thymeleaf介绍 简单说, Thymeleaf 是一个跟 Velocity、FreeMarker 类似的模板引擎,它可
1108 0
SpringBoot整合elasticsearch
在这一篇文章开始之前,你需要先安装一个ElasticSearch,如果你是mac或者linux可以参考https://www.jianshu.com/p/e47b451375ea,如果是windows可以自定百度一下。
1451 0
SpringBoot使用RabbitMQ(二)
springboot使用rabbitmq发送回调队列
2878 0
使用 Spring Boot 开发分布式微服务时,我们面临什么问题!
Spring Cloud 是一系列框架的有序集合。它利用 Spring Boot 的开发便利性巧妙地简化了分布式系统基础设施的开发,如服务发现注册、配置中心、消息总线、负载均衡、断路器、数据监控等,都可以用 Spring Boot 的开发风格做到一键启动和部署。Spring Cloud 并没有重复制造轮子,它只是将目前各家公司开发的比较成熟、经得起实际考验的服务框架组合起来,通过 Spring Boot 风格进行再封装屏蔽掉了复杂的配置和实现原理,最终给开发者留出了一套简单易懂、易部署和易维护的分布式系统开发工具包。
0 0
SpringBoot【整合JSP】
SpringBoot中默认是不支持jsp的,但是我们某些情况下可以又需要用到,所以本文记录下SpringBoot整合jsp的过程
0 0
Spring Boot 实现定时任务的 4 种方式
定时任务实现的几种方式: Timer:这是java自带的java.util.Timer类,这个类允许你调度一个java.util.TimerTask任务。使用这种方式可以让你的程序按照某一个频度执行,但不能在指定时间运行。一般用的较少。
0 0
Spring Boot 应用可视化监控,一目了然!
Spring Boot 应用可视化监控,一目了然!
0 0
redis在springboot中的使用
redis在springboot中的使用
0 0
SpringBoot——SpringBoot集成MyBatis
SpringBoot——SpringBoot集成MyBatis
0 0
+关注
文章
问答
文章排行榜
最热
最新
相关电子书
更多
Spring框架入门
立即下载
Java Spring Boot开发实战系列课程【第7讲】:Spring Boot 2.0安全机制与MVC身份验证实战(Java面试题)
立即下载
Java Spring Boot开发实战系列课程【第15讲】:Spring Boot 2.0 API与Spring REST Docs实战
立即下载