Spring MVC 传值方式总结
前端传到Controller:
方法1
通过HttpServletRequest 。写法如下:
@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
但是不推荐使用这个方法,因为这种方法破坏了对一个注入对象的常规理解,造成混乱。
代码如下:
@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注解。例如请求的参数为如下的时候:
http://localhost:8080/WebApp/print?user_name=somename&user_age=30
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>

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
Python过渡性模块重载(递归重载模块)
0.说明 因为正常情况下使用reload重载模块时只是重载顶层模块,对于模块内部的import语句并不会执行重载,也就是说,reload执行的重载只是针对顶层的,即top level only。 有必要写一个过渡性模块重载的函数。 1.过渡性模块重载 下面的代码来自《Python学习手册》第四版P605,可以完美地实现这个功能: """ reloadall.py:transitivelyreloadnestedmodules """ importtypes fromimpimportreload defstatus(module): print('reloading'+module.__name__) deftransitive_reload(module,visited): ifnotmoduleinvisited: status(module) reload(module) visited[module]=None forattrobjinmodule.__dict__.values(): iftype(attrobj)==types.ModuleType: transitive_...
- 下一篇
LVS原理详解
一、集群简介 什么是集群 计算机集群简称集群是一种计算机系统,它通过一组松散集成的计算机软件和/或硬件连接起来高度紧密地协作完成计算工作。在某种意义上,他们可以被看作是一台计算机。集群系统中的单个计算机通常称为节点,通常通过局域网连接,但也有其它的可能连接方式。集群计算机通常用来改进单个计算机的计算速度和/或可靠性。一般情况下集群计算机比单个计算机,比如工作站或超级计算机性能价格比要高得多。 集群就是一组独立的计算机,通过网络连接组合成一个组合来共同完一个任务 LVS在企业架构中的位置: 以上的架构只是众多企业里面的一种而已。绿色的线就是用户访问请求的数据流向。用户-->LVS负载均衡服务器--->apahce服务器--->mysql服务器&memcache服务器&共享存储服务器。并且我们的mysql、共享存储也能够使用LVS再进行负载均衡。 ---------------小结------------------------- 集群:就是一组相互独立的计算机,通过高速的网络组成一个计算机系统,每个集群节点都是运行其自己进程的一个独立服务器。对网络用户来...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS7设置SWAP分区,小内存服务器的救世主
- Windows10,CentOS7,CentOS8安装MongoDB4.0.16
- 设置Eclipse缩进为4个空格,增强代码规范
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- SpringBoot2全家桶,快速入门学习开发网站教程
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- Eclipse初始化配置,告别卡顿、闪退、编译时间过长
- CentOS8安装Docker,最新的服务器搭配容器使用
- Docker安装Oracle12C,快速搭建Oracle学习环境
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题