隐藏

springmvc Controller接收前端参数的几种方式总结

发布:2021/7/25 14:35:07作者:管理员 来源:本站 浏览次数:809

(1) 普通方式-请求参数名和Controller方法的参数一致

	
  1. @Controller
  2. @RequestMapping("/param")
  3. public class TestParamController {
  4. private static final Logger logger = LoggerFactory.getLogger(TestParamController.class);
  5. /**
  6. * 请求参数名和Controller方法的参数一致
  7. * produces 设置返回参数的编码格式可以设置返回数据的类型以及编码,可以是json或者xml
  8. * {
  9. * @RequestMapping(value="/xxx",produces = {"application/json;charset=UTF-8"})
  10. * 或
  11. * @RequestMapping(value="/xxx",produces = {"application/xml;charset=UTF-8"})
  12. * 或
  13. * @RequestMapping(value="/xxx",produces = "{text/html;charset=utf-8}")
  14. * }
  15. * @param name 用户名
  16. * @param pwd 密码
  17. * @return
  18. *
  19. */
  20. @RequestMapping(value = "/add", method = RequestMethod.GET, produces = {"application/json;charset=UTF-8"})
  21. @ResponseBody
  22. public String addUser(String name, String pwd){
  23. logger.debug("name:" + name + ",pwd:" + pwd);
  24. return "name:" + name + ",pwd:" + pwd;
  25. }
  26.  
  27. }

如下图所示:

通过访问:http://localhost:8080/sty/param/add.action?name=张三&pwd=123456

(2) 对象方式-请求参数名和Controller方法中的对象的参数一致

	
  1. @Controller
  2. @RequestMapping("/param")
  3. public class TestParamController {
  4. private static final Logger logger = LoggerFactory.getLogger(TestParamController.class);
  5. /**
  6. * 请求参数名和Controller方法的参数一致
  7. * produces 设置返回参数的编码格式可以设置返回数据的类型以及编码,可以是json或者xml
  8. * }
  9. * @param user 用户信息
  10. * @return
  11. *
  12. */
  13. @RequestMapping(value = "/addByObject", method = RequestMethod.GET, produces = {"application/json;charset=UTF-8"})
  14. @ResponseBody
  15. public String addUserByObject(User user){
  16. logger.debug("name:" + user.getName() + ",pwd:" + user.getPwd());
  17. return "name:" + user.getName() + ",pwd:" + user.getPwd();
  18. }
  19. }

如下图所示:

通过访问:http://localhost:8080/sty/param/addByObject.action?name=张三&pwd=123456 。

(3) 自定义方法参数名-当请求参数名与方法参数名不一致时

注意可以在参数中增加@RequestParam注解。如果在方法中的参数增加了该注解,说明请求的url必须带该带有该参数,否则不能执行该方法。如果在方法中的参数没有增加该注解,说明请求的url无需带有该参数,也能继续执行该方法。

@RequestParam(defaultValue="0")可设置默认值(仅当传入参数为空时)。

@RequestParam(value="id")可接受传入参数为id的值,覆盖该注解注释的字段。

@RequestParam(name="name",defaultValue = "李四") String u_name   如果传入字段”name”为空,默认u_name的值为”李四”。若传入”name”不为空,默认u_name值为传入值。

以下只该出方法:

	
  1. /**
  2. * 自定义方法参数名-当请求参数名与方法参数名不一致时
  3. * @param u_name 用户名
  4. * @param u_pwd 密码
  5. * @return
  6. */
  7. @RequestMapping(value = "/addByDifName", method = RequestMethod.GET, produces = {"application/json;charset=UTF-8"})
  8. @ResponseBody
  9. public String addUserByDifName(@RequestParam("name") String u_name, @RequestParam("pwd")String u_pwd){
  10. logger.debug("name:" + u_name + ",pwd:" + u_pwd);
  11. return "name:" + u_name + ",pwd:" + u_pwd;
  12. }

如下图所示:

通过访问:http://localhost:8080/sty/param/addUserByDifName.action?name=张三&pwd=123456 。

(4) HttpServletRequest方式

以下只给出该方法:

	
  1. /**
  2.  
  3. * 通过HttpServletRequest接收
  4.  
  5. * @param request
  6.  
  7. * @return
  8.  
  9. */
  10.  
  11. @RequestMapping(value = "/addByHttpServletRequest", method = RequestMethod.GET, produces = {"application/json;charset=UTF-8"})
  12.  
  13. @ResponseBody
  14.  
  15. public String addUserByHttpServletRequest(HttpServletRequest request){
  16.  
  17. String name = request.getParameter("name");
  18.  
  19. String pwd = request.getParameter("pwd");
  20.  
  21. logger.debug("name:" + name + ",pwd:" + pwd);
  22.  
  23. return "name:" + name + ",pwd:" + pwd;
  24.  
  25. }

如下图所示:

通过访问:http://localhost:8080/sty/param/addByHttpServletRequest.action?name=张三&pwd=123456

(5) @PathVariable获取路径中的参数接收

参考:https://www.iteye.com/blog/zhlj11-1885005 。

注:url含有中文名称时,因为编码问题,无法进行映射,需要修改tomcat下的conf文件夹下的server.xml中的URIEncoding=”UTF-8”,对URL编码设置就可以解决中文问题。

对于经常遇到路径在有符号”.”问题,因为springmvc默认是把点后面的信息作为文件后缀,需要修改默认值:

	
  1. <bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping">
  2. <property name="interceptors" ref="localeChangeInterceptor"/>
  3. <property name="useDefaultSuffixPattern" value="false" />
  4. </bean>

另外,这时候如果只设置这个,请求可以传递到对于的controller,但传过去的数据会有问题,只会传最后一个点前面的数据,除非你在最后加上“/”,比如/news/测试.点/  这样就会把“测试.点”当作整体,不然只会得到“测试”。这时候我们可以这样设置@RequestMapping("/news/{title:.*}")

以下只给出该方法(本次不进行中文及特殊符号测试):

	
  1. /**
  2.  
  3. * 通过@PathVariable获取路径中的参数
  4.  
  5. * @param name 用户名
  6.  
  7. * @param pwd 密码
  8.  
  9. * @return
  10.  
  11. */
  12.  
  13. @RequestMapping(value = "/add/{name}/{pwd}", method = RequestMethod.GET, produces = {"application/json;charset=UTF-8"})
  14.  
  15. @ResponseBody
  16.  
  17. public String addUserByPathVariable(@PathVariable String name, @PathVariable String pwd){
  18.  
  19. logger.debug("name:" + name + ",pwd:" + pwd);
  20.  
  21. return "name:" + name + ",pwd:" + pwd;
  22.  
  23. }

如下图所示:

通过访问:http://localhost:8080/sty/param/add/zhangsan/123456.action

(6) @RequestBody-JSON方式接收

以上方式(1)/(2)/)(3)/(4)/(5)都是非JSON方式,也就是说如果使用JSON方式提交,会报错(在第二种对象方式中,将get请求方式修改为POST,并将上送数据修改为JSON串方式):

此时未引入jackson-databind.jar依赖。并在springmvc.xml文件未进行开启json格式的支持,也就是说未加入以下代码:

	
  1. <!-- 同时开启json格式的支持-->
  2. <mvc:annotation-driven></mvc:annotation-driven>

提交请求打印未有报错,但是返回的数据为null,如图所示:

若开启json格式的支持,测试也如上图所示,也并能正常返回。

原因:因为为在字段名称之前未使用@RequestBody注解。

eg1(测试普通对象)

代码如下所示,

	
  1. /**
  2.  
  3. * RequestBody-JSON 对象方式
  4.  
  5. * @param user
  6.  
  7. * @return
  8.  
  9. */
  10.  
  11. @RequestMapping(value = "/addByObjectJSON", produces = {"application/json;charset=UTF-8"})
  12.  
  13. @ResponseBody
  14.  
  15. public String addUserByObjectJSON(@RequestBody User user){
  16.  
  17. logger.debug("name:" + user.getName() + ",pwd:" + user.getPwd());
  18.  
  19. return "name:" + user.getName() + ",pwd:" + user.getPwd();
  20.  
  21. }
  1. 测试结果如图所示(访问 http://localhost:8080/sty/param/addByObjectJSON.action ):

eg2(测试List对象)

代码如下所示,

	
  1. /**
  2. * RequestBody-JSON List对象方式
  3. * @param users
  4. * @return
  5. */
  6. @RequestMapping(value = "/addByListJSON", produces = {"application/json;charset=UTF-8"})
  7. @ResponseBody
  8. public String addUsersByListJSON(@RequestBody List<User> users){
  9. StringBuilder sb = new StringBuilder("{");
  10. if(null != users){
  11. for(User user : users){
  12. sb.append("{" + "name:" + user.getName() + ",pwd:" + user.getPwd() + "}");
  13. }
  14. }
  15. sb.append("}");
  16. logger.debug(sb.toString());
  17. return sb.toString();
  18. }

测试结果

  1. 测试结果如图所示(访问 http://localhost:8080/sty/param/addByListJSON.action  ):

eg3(测试Map对象)

代码如下图所示:

	
  1. /**
  2.  
  3. * RequestBody-JSON Map对象方式
  4.  
  5. * @param users
  6.  
  7. * @return
  8.  
  9. */
  10.  
  11. @RequestMapping(value = "/addByMapJSON", produces = {"application/json;charset=UTF-8"})
  12.  
  13. @ResponseBody
  14.  
  15. public String addUsersByMapJSON(@RequestBody Map<String, User> users){
  16.  
  17. StringBuilder sb = new StringBuilder("{");
  18.  
  19. if(null != users){
  20.  
  21. Iterator it = users.keySet().iterator();
  22.  
  23. while(it.hasNext()){
  24.  
  25. User user = users.get(it.next());
  26.  
  27. sb.append("{" + "name:" + user.getName() + ",pwd:" + user.getPwd() + "}");
  28.  
  29. }
  30.  
  31. }
  32.  
  33. sb.append("}");
  34.  
  35. logger.debug(sb.toString());
  36.  
  37. return sb.toString();
  38.  
  39. }

测试结果

  1. 测试结果如图所示(访问 http://localhost:8080/sty/param/addByMapJSON.action ):

  1. 另外附部分源码:

User.java

		
  1. package com.mjs.study.action.dto;
  2.  
  3. /**
  4. * @Description
  5. * @ClassName User
  6. * @Author Administrator
  7. * @Data 2019/10/13 2:43
  8. * @Version 1.0
  9. */
  10. public class User {
  11. private String name;
  12. private String pwd;
  13. private String sex;
  14.  
  15. public String getName() {
  16. return name;
  17. }
  18.  
  19. public void setName(String name) {
  20. this.name = name;
  21. }
  22.  
  23. public String getPwd() {
  24. return pwd;
  25. }
  26.  
  27. public void setPwd(String pwd) {
  28. this.pwd = pwd;
  29. }
  30.  
  31. public String getSex() {
  32. return sex;
  33. }
  34.  
  35. public void setSex(String sex) {
  36. this.sex = sex;
  37. }
  38. }
  1. TestParamController.java
		
  1. package com.mjs.study.action;
  2.  
  3. import com.github.pagehelper.PageInfo;
  4. import com.mjs.study.action.dto.User;
  5. import org.slf4j.Logger;
  6. import org.slf4j.LoggerFactory;
  7. import org.springframework.stereotype.Controller;
  8. import org.springframework.web.bind.annotation.*;
  9.  
  10. import javax.servlet.http.HttpServletRequest;
  11. import java.util.Iterator;
  12. import java.util.List;
  13. import java.util.Map;
  14.  
  15. /**
  16. * @Description 测试springmvc传入参数
  17. * @ClassName TestParamController
  18. * @Author Administrator
  19. * @Data 2019/10/13 1:33
  20. * @Version 1.0
  21. */
  22. @Controller
  23. @RequestMapping("/param")
  24. public class TestParamController {
  25. private static final Logger logger = LoggerFactory.getLogger(TestParamController.class);
  26. /**
  27. * 请求参数名和Controller方法的参数一致
  28. * produces 设置返回参数的编码格式 可以设置返回数据的类型以及编码,可以是json或者xml
  29. * {
  30. * @RequestMapping(value="/xxx",produces = {"application/json;charset=UTF-8"})
  31. * 或
  32. * @RequestMapping(value="/xxx",produces = {"application/xml;charset=UTF-8"})
  33. * 或
  34. * @RequestMapping(value="/xxx",produces = "{text/html;charset=utf-8}")
  35. * }
  36. * @param name 用户名
  37. * @param pwd 密码
  38. * @return
  39. *
  40. */
  41. @RequestMapping(value = "/add", method = RequestMethod.GET, produces = {"application/json;charset=UTF-8"})
  42. @ResponseBody
  43. public String addUser(String name, String pwd){
  44. logger.debug("name:" + name + ",pwd:" + pwd);
  45. return "name:" + name + ",pwd:" + pwd;
  46. }
  47.  
  48. /**
  49. * 自定义方法参数名-当请求参数名与方法参数名不一致时
  50. * @param u_name 用户名
  51. * @param u_pwd 密码
  52. * @return
  53. */
  54. @RequestMapping(value = "/addByDifName", method = RequestMethod.GET, produces = {"application/json;charset=UTF-8"})
  55. @ResponseBody
  56. public String addUserByDifName(@RequestParam(name="name",defaultValue = "李四") String u_name, @RequestParam("pwd")String u_pwd){
  57. logger.debug("name:" + u_name + ",pwd:" + u_pwd);
  58. return "name:" + u_name + ",pwd:" + u_pwd;
  59. }
  60.  
  61. /**
  62. * 请求参数名和Controller方法的参数一致
  63. * produces 设置返回参数的编码格式 可以设置返回数据的类型以及编码,可以是json或者xml
  64. * @param user 用户信息
  65. * @return
  66. *
  67. */
  68. @RequestMapping(value = "/addByObject", produces = {"application/json;charset=UTF-8"})
  69. @ResponseBody
  70. public String addUserByObject(User user){
  71. logger.debug("name:" + user.getName() + ",pwd:" + user.getPwd());
  72. return "name:" + user.getName() + ",pwd:" + user.getPwd();
  73. }
  74.  
  75. /**
  76. * RequestBody-JSON 对象方式
  77. * @param user
  78. * @return
  79. */
  80. @RequestMapping(value = "/addByObjectJSON", produces = {"application/json;charset=UTF-8"})
  81. @ResponseBody
  82. public String addUserByObjectJSON(@RequestBody User user){
  83. logger.debug("name:" + user.getName() + ",pwd:" + user.getPwd());
  84. return "name:" + user.getName() + ",pwd:" + user.getPwd();
  85. }
  86.  
  87. /**
  88. * RequestBody-JSON List对象方式
  89. * @param users
  90. * @return
  91. */
  92. @RequestMapping(value = "/addByListJSON", produces = {"application/json;charset=UTF-8"})
  93. @ResponseBody
  94. public String addUsersByListJSON(@RequestBody List<User> users){
  95. StringBuilder sb = new StringBuilder("{");
  96. if(null != users){
  97. for(User user : users){
  98. sb.append("{" + "name:" + user.getName() + ",pwd:" + user.getPwd() + "}");
  99. }
  100. }
  101. sb.append("}");
  102. logger.debug(sb.toString());
  103. return sb.toString();
  104. }
  105. /**
  106. * RequestBody-JSON Map对象方式
  107. * @param users
  108. * @return
  109. */
  110. @RequestMapping(value = "/addByMapJSON", produces = {"application/json;charset=UTF-8"})
  111. @ResponseBody
  112. public String addUsersByMapJSON(@RequestBody Map<String, User> users){
  113. StringBuilder sb = new StringBuilder("{");
  114. if(null != users){
  115. Iterator it = users.keySet().iterator();
  116. while(it.hasNext()){
  117. User user = users.get(it.next());
  118. sb.append("{" + "name:" + user.getName() + ",pwd:" + user.getPwd() + "}");
  119. }
  120. }
  121. sb.append("}");
  122. logger.debug(sb.toString());
  123. return sb.toString();
  124. }
  125. /**
  126. * 通过HttpServletRequest接收
  127. * @param request
  128. * @return
  129. */
  130. @RequestMapping(value = "/addByHttpServletRequest", method = RequestMethod.GET, produces = {"application/json;charset=UTF-8"})
  131. @ResponseBody
  132. public String addUserByHttpServletRequest(HttpServletRequest request){
  133. String name = request.getParameter("name");
  134. String pwd = request.getParameter("pwd");
  135. logger.debug("name:" + name + ",pwd:" + pwd);
  136. return "name:" + name + ",pwd:" + pwd;
  137. }
  138.  
  139. /**
  140. * 通过@PathVariable获取路径中的参数
  141. * @param name 用户名
  142. * @param pwd 密码
  143. * @return
  144. */
  145. @RequestMapping(value = "/add/{name}/{pwd}", method = RequestMethod.GET, produces = {"application/json;charset=UTF-8"})
  146. @ResponseBody
  147. public String addUserByPathVariable(@PathVariable String name, @PathVariable String pwd){
  148. logger.debug("name:" + name + ",pwd:" + pwd);
  149. return "name:" + name + ",pwd:" + pwd;
  150. }
  151. }

该部分和个人github部分内容同步。