SpringMVC Controller接收参数总结

布满荆棘的人生 2024-02-18 16:31 104阅读 0赞
  1. SpringMVC Controller接收参数总结
  2. 何平行者
  3. 关注
  4. 2016.11.10 19:28*
  5. 字数 738
  6. 阅读 8587
  7. 评论 3
  8. 喜欢 40
  9. 赞赏 2
  10. 本文中Controller的开发环境如下表格所示
  11. 系统/工具
  12. 版本号
  13. OS
  14. Windows
  15. 7 Home Basic
  16. Java
  17. 1.7.0_79
  18. Eclipse
  19. Mars.1
  20. Release (4.5.1)
  21. Maven
  22. 3.3.9
  23. Postman
  24. 4.8.1
  25. Tomcat
  26. 7.0.47
  27. Maven对应Pom主要依赖配置
  28. <dependency>
  29. <groupId>org.springframework</groupId>
  30. <artifactId>spring-webmvc</artifactId>
  31. <version>4.3.1.RELEASE</version>
  32. </dependency>
  33. <dependency>
  34. <groupId>org.springframework</groupId>
  35. <artifactId>spring-web</artifactId>
  36. <version>4.3.1.RELEASE</version>
  37. </dependency>
  38. 基本数据类型
  39. SpringMVC Controller各方法参数绑定首先支持Java所有基本类型(包括: byteshortintlongfloatdoublecharstringboolean),以及基本类型对应封装高级类(包括:StringBuilderStringBuffer)。
  40. 代码示例如下所示(这里仅以intInteger类型做例子,其他类型实现方式与此类同):
  41. @Controller
  42. @RequestMapping("param")
  43. public class ParamController {
  44. @RequestMapping(value="/int", method=RequestMethod.POST)
  45. @ResponseBody
  46. public String requestInt(int param) {
  47. return "Request successful. Post param : Int - " + param;
  48. }
  49. @RequestMapping(value="/integer", method=RequestMethod.POST)
  50. @ResponseBody
  51. public String requestInteger(Integer param) {
  52. return "Request successful. Post param : Integer - " + param;
  53. }
  54. //......
  55. }
  56. 集合类型
  57. List
  58. 除了基本类型,Spring Controller各方法参数绑定还支持集合类型,这里拿常用的ListMap举例,如果直接拿集合类作为绑定参数,写法上与基本类型类似,不同的是需要在参数处增加注解@RequestParam(),具体代码示例如下所示:
  59. @RequestMapping(value="/list", method=RequestMethod.POST)
  60. @ResponseBody
  61. public String requestList(@RequestParam("listParam[]") List<String> param) {
  62. return "Request successful. Post param : List<String> - " + param.toString();
  63. }
  64. 对应Postman的请求如下:
  65. Postman Post请求及应答图示.png
  66. 对应Ajax的请求如下:
  67. var strList = new Array();
  68. strList.push("field1");
  69. strList.push("field2");
  70. function postList() {
  71. $.ajax({
  72. type:"POST",
  73. url:"http://localhost:8080/Learn-Spring-MVC/list",
  74. data:{"listParam" : strList},
  75. dataType:"json",
  76. success:function(result) {
  77. //......
  78. },
  79. error:function(result) {
  80. //......
  81. }
  82. });
  83. }
  84. 关于List做为Controller参数,除了String本人还测试Integer以及Double类型,其他类型未作测试。这里面@RequestParam()必须增加"listParam[]"如果你的Web端是别的名字,换成相应名称即可,如果只用@RequestParam注解的话,请求会接到HTTP Status 400 - Required List parameter 'xxx' is not present的提示信息。
  85. Map
  86. Map类型作为参数,只需要使用@RequestParam注解即可,这里Map对应的key-value基本是String类型,value可以为Object,代码示例如下所示:
  87. @RequestMapping(value="/map", method=RequestMethod.POST)
  88. @ResponseBody
  89. public String requestList(@RequestParam Map<String, Object> param) {
  90. return "Request successful. Post param : Map - " + param;
  91. }
  92. 对应Postman的请求如下:
  93. Postman Post请求及应答图示.png
  94. 对应Ajax的请求如下:
  95. function postMap() {
  96. $.ajax({
  97. type:"POST",
  98. url:"http://localhost:8080/Learn-Spring-MVC/map",
  99. data:{field1:"field1",field2:1},
  100. dataType:"json",
  101. success:function(result) {
  102. //......
  103. },
  104. error:function(result) {
  105. //......
  106. }
  107. });
  108. }
  109. Map作为参数的话,会把Ajax请求中的全部数据转换为key-value存入Map对应中,具体可参见Spring官方文档关于@RequestParam部分
  110. 自定义类型
  111. 自定义People类,具体类内容如下代码所示:
  112. public class People implements Serializable{
  113. private static final long serialVersionUID = 1L;
  114. private String name;
  115. private short age;
  116. private Map<String, String> relationship;
  117. public String getName() {
  118. return name;
  119. }
  120. public void setName(String name) {
  121. this.name = name;
  122. }
  123. public short getAge() {
  124. return age;
  125. }
  126. public void setAge(short age) {
  127. this.age = age;
  128. }
  129. public Map<String, String> getRelationship() {
  130. return relationship;
  131. }
  132. public void setRelationship(Map<String, String> relationship) {
  133. this.relationship = relationship;
  134. }
  135. @Override
  136. public String toString() {
  137. return "People [name=" + name + ", age=" + age + ", relationship=" + relationship + "]";
  138. }
  139. }
  140. 对应Controller方法代码如下所示,主要的不同点就是需要在自定义类前添加@ModelAttribute注解:
  141. @RequestMapping(value="/people", method=RequestMethod.POST)
  142. @ResponseBody
  143. public String requestPeople(@ModelAttribute People people) {
  144. return "Get request is successful. Post param : User Class - " + people.toString();
  145. }
  146. 对应Ajax的请求如下:
  147. var people = {
  148. name:"Heacewalker",
  149. age:25,
  150. relationship:{"boss":"BigBoss"}
  151. }
  152. function postClick() {
  153. $.ajax({
  154. type:"POST",
  155. url:"http://localhost:8080/Learn-Spring-MVC/people",
  156. data:people,
  157. dataType:"json",
  158. success:function(result) {
  159. //......
  160. },
  161. error:function(result) {
  162. //......
  163. }
  164. });
  165. }
  166. 对应Postman的请求如下:
  167. Postman Post请求及应答图示.png
  168. 这里再说一下,如果自定义类中包含集合的话,要如何处理参数的问题,首先定义包含集合的类,具体代码如下所示:
  169. public class Address {
  170. private String code;
  171. private String address;
  172. public String getCode() {
  173. return code;
  174. }
  175. public void setCode(String code) {
  176. this.code = code;
  177. }
  178. public String getAddress() {
  179. return address;
  180. }
  181. public void setAddress(String address) {
  182. this.address = address;
  183. }
  184. @Override
  185. public String toString() {
  186. return "Address [code=" + code + ", address=" + address + "]";
  187. }
  188. }
  189. public class Link {
  190. private List<Address> address;
  191. public List<Address> getAddress() {
  192. return address;
  193. }
  194. public void setAddress(List<Address> address) {
  195. this.address = address;
  196. }
  197. @Override
  198. public String toString() {
  199. return "Link [address=" + address + "]";
  200. }
  201. }
  202. 最后是Controller部分的代码,示例如下:
  203. @RequestMapping(value="/link", method=RequestMethod.POST)
  204. @ResponseBody
  205. public String requestLink(@ModelAttribute Link link) {
  206. return "Get request is successful. Post param : User Class - " + link.toString();
  207. }
  208. Postman Post请求及应答图示.png
  209. 对应Postman的请求如下:
  210. Postman Post请求及应答图示.png
  211. 对应Ajax的请求如下:
  212. <form onsubmit="return PostData()">
  213. <input name="address[0].address" value="AKB"/>
  214. <input name="address[0].code" value="48"/>
  215. <input name="address[1].address" value="HKT"/>
  216. <input name="address[1].code" value="48"/>
  217. <input type="submit" value="提交"/>
  218. </form>
  219. ......
  220. function PostData() {
  221. $.ajax({
  222. type:"POST",
  223. url:"http://localhost:8080/Learn-Spring-MVC/link",
  224. data:'',
  225. success:function(result) {
  226. //......
  227. },
  228. error:function(result) {
  229. //......
  230. }
  231. });
  232. }
  233. 通过URL路径传递参数并接收,具体Controller代码如下所示:
  234. @RequestMapping(value="/path/{key}/{value}", method=RequestMethod.POST)
  235. @ResponseBody
  236. public String requestPath(@PathVariable String key, @PathVariable String value) {
  237. return "Get request is successful. Path param : key - " + key + "; value - " + value;
  238. }
  239. 对应Postman的请求如下:
  240. Postman Post请求及应答图示.png
  241. 最后,说一下用HttpServletRequest接收请求参数的方法,Controller代码如下所示,Controller接收到的参数值均为String类型:
  242. @RequestMapping(value="/request", method=RequestMethod.POST)
  243. @ResponseBody
  244. public String request(HttpServletRequest arg0, HttpServletResponse arg1) {
  245. return "Get request is successful. Post param : param1 - " + arg0.getParameter("param1") +
  246. "; param2 - " + arg0.getParameter("param2") +
  247. "; param3 - " + arg0.getParameter("param3");
  248. }
  249. 对应Ajax请求:
  250. var idList = new Array();
  251. idList.push("1");
  252. idList.push("2");
  253. idList.push("3");
  254. function postTest() {
  255. $.ajax({
  256. type:"POST",
  257. url:"http://localhost:8080/Learn-Spring-MVC/request",
  258. data:{"param1":"test","param2":2,"param3":JSON.stringify(idList)},
  259. dataType:"json",
  260. success:function(result) {
  261. //......
  262. },
  263. error:function(result) {
  264. //......
  265. }
  266. });
  267. }
  268. 这里idList是集合类型,如果不是用JSON.stringify()进行转换的话,到Controller层接收到的参数值对应则为null
  269. 参考资料:SpringMVC的各种参数绑定方式

发表评论

表情:
评论列表 (有 0 条评论,104人围观)

还没有评论,来说两句吧...

相关阅读

    相关 SpringMVC-参数接收

    > 逐个参数接收  只要保证请求参数名与该请求处理方法的参数名相同即可  SpringMVC 绑定请求参数是自动实现的,但是要想使用,必须遵循使用要求: 1、如果是基本类