前端传到 Controller:
方法 1
通过 HttpServletRequest . 写法如下:
- 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 请求, 都能通过这种方式获取到.
可以通过 Post 方法, 使用 Postman 工具模拟一个 post 请求, 都可以将值传到 Controller.
这招可以获得 Cookie 以及 Session 数据.
还可以通过注解 @Autowired, 将 HttpServletRequest 自动的注入进来, 不必担心多线程下的并发问题, 因为这里 HttpServletRequest 注入的是一个 AOP proxy , 而不是一个普通 bean . 每次请求过来, 都会检查线程本地属性, 来获取真正的 Request 对象. 这些都是 Spring 自动配置的默认场景.
但是不推荐使用这个方法, 因为这种方法破坏了对一个注入对象的常规理解, 造成混乱.
代码如下:
- @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
使用路径变量. 写法如下:
- @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
参数名匹配的方式:
- @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";
- }
- }
或者:
- @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 值.
@RequestParam(value="name", defaultValue="John")
但是如果请求中参数的名字和变量名不一样的时候, 就只能使用 @RequestParam 注解.
Controller 代码只能如下的写法
- @RequestMapping(value="/print")
- public String PrintInfo(@RequestParam("user_name") String name, @RequestParam("user_age")int age) {
- ...
- }
尽量使用 @RequestParam 注解, 因为这样可以清晰的知道该参数来自 Request, 可读性高.
方法 4
传递请求头中的参数, 需要用到 @RequestHeader 注解, 该注解将 Header 中的值绑定到参数上, 可以获取一个, 多个或者所有的参数. 例如
- @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";
- }
- }
或者
- @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 的信息
- @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 中的参数值一致的话, 会自动绑定到该值.
- @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 类, 代码如下:
- @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 页面中:
- <%@ 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 端读取值. 代码如下:
- @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 页面中:
- <%@ 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>
来源: http://www.jianshu.com/p/5cac55bb7ab7