Spring MVC中控制器接受参数的类方式有以下几种:
- 普通参数:只要保证前端参数名称和传入控制器的参数名称一致即可,适合参数较少的情况;
- pojo类型:如果前端传的是一个pojo对象,只要保证参数名称和pojo属性一致即可;
- 注解方式:当前端参数名和控制器名称不一致时可以使用注解方式,比如前端是param_id,而控制器中是paramId的情况;
- URL方式:当前端以restful格式传递参数时,后台使用这种方式接受;
- JSON方式:前后端如果用json方式交互时,可以使用这种方式,这是常用的方式;
- 列表方式:如果前端传的是一个列表,列表元素可以是基本类型也可以是引用类型,使用这种方式接受;
- 表单序列化方式:有时候如果表单数据较少,控制器可以用这种方式接受表单序列化后的数据;
以上七中类型,我将一一进行总结,这几种方式花了我一天时间测试调试,真实醉了,看着简单,实践起来总会出现你意想不到的问题,所以还是能动手就不吵吵!
下面是我创建的页面,包含了八种方式(注意⚠️:上面说的七种中,列表方式根据元素类型分成了基本类型和引用类型)
以上八种方式,我将一一进行介绍,举出实例,本文介绍控制器接受简单参数类型的方式。
这种方式要求http传递的参数名称和控制器中的参数名称一致,这样不需要注解就能获取了。下面举实例,场景是这样的:
在上图简单参数传递中输入名称和描述点击提交按钮之后进入一个新的页面,在这个页面获取到刚才传过来的参数。参数传递的过程为:
1⃣️点击提交按钮之后表单提交给对应的控制器;
2⃣️控制器接受参数,并将参数渲染到对应的视图中;
3⃣️显示渲染后的页面;
这三个步骤需要两个页面和一个控制器,下面直接贴代码:
1、输入参数页面
1 <%@ page language="java" contentType="text/html; charset=UTF-8" 2 pageEncoding="UTF-8"%> 3 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 4 <html> 5 <head> 6 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 7 <% 8 String root = request.getContextPath(); 9 String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() 10 + root + "/"; 11 %> 12 <script type="text/javascript" 13 src="<%=basePath%>jslib/jquery-1.8.3.min.js"></script> 14 <script type="text/javascript" src="<%=basePath%>jslib/jquery.form.js"></script> 15 <script type="text/javascript" src="<%=basePath%>js/param.js"></script> 16 <link href="<%=basePath%>css/param.css" type="text/css" rel="stylesheet"> 17 <title>Insert title here</title> 18 </head> 19 <body> 20 21 <!-- 简单参数传递 --> 22 <p style="text-align: center;color: red;font-size: x-large;">Spring MVC控制器接受参数方式测试</p> 23 <div class="param"> 24 <div class="simple public"> 25 <p style="text-align: center;">简单参数传递</p> 26 <form id="paramForm" action="<%=basePath%>param/simpleParam" 27 method="post"> 28 <table> 29 <tr> 30 <td>名称:</td> 31 <td><input type="text" name="paramName" value=""></td> 32 </tr> 33 <tr> 34 <td>描述:</td> 35 <td><input type="text" name="paramDesc" value=""></td> 36 </tr> 37 <tr> 38 <td></td> 39 <td style="text-align: right;"><input type="submit" 40 value="提交" id="setSimpleParam"></td> 41 </tr> 42 </table> 43 </form> 44 </div> 45 46 </body> 47 </html>
注意上面代码中红色加粗的部分,在spring MVC中获取引入静态资源的方式,我是这样引入的,因为如果使用相对路径会报错,找不到资源,除此之外,还要在web.xml中配置静态资源的拦截,否则引入jscss等静态资源是会报404,尽管路径没错。配置如下:
1 <servlet-mapping> 2 <servlet-name>default</servlet-name> 3 <url-pattern>*.js</url-pattern> 4 </servlet-mapping> 5 6 <servlet-mapping> 7 <servlet-name>default</servlet-name> 8 <url-pattern>*.css</url-pattern> 9 </servlet-mapping>
还可以配置图片等的路径。
2、控制器
@Controller @RequestMapping("/param") public class ParamController { /** * 获取简单参数:参数名称必须和表单中的name保持一致 * * @param paramname * @param paramDesc * @return */ @RequestMapping(value = "simpleParam", method = RequestMethod.POST) public ModelAndView getSimpleParam(String paramName, String paramDesc) { ModelAndView mv = new ModelAndView(); System.out.println(paramName); System.out.println(paramDesc); mv.addObject("paramName", paramName); mv.addObject("paramDesc", paramDesc); mv.setViewName("simpleParam"); return mv; } }
在上面的控制器中,需要注意以下两点:
- 方法接受参数的方式是直接传参数名,这个参数名就是第一步表单中的两个参数,也就是http协议传递给后台的参数,它们必须保持一致,否则会接受失败!
- 控制器返回的视图名称是simpleParam,所以接下来需要创建这个页面;
3、创建返回视图
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!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=UTF-8"> <title>Simple Param</title> </head> <body> <h2> 获取到的参数名称:<label>${paramName }</label> <br /> 获取到的参数描述:<label>${paramDesc }</label> </h2> </body> </html>
这个视图中渲染了控制器返回的数据,获取的参数名就是控制器通过addObject()方法设置的键名;
通过以上三步,就完成了简单参数的传递和接受过程,下面进行测试,在页面输入名称和描述,如下图所示:
提交之后的结果如下:
可以看到获取成功了。
4、总结
这种方式一般比较适合参数较少的情况,而且一定一定要保持控制器中的参数名和前端传递的参数名是完全一样的,这样Spring MVC才能自动映射。显然,当参数较多时,这种方式会在控制器传多个参数,显得不太好看,这个时候我们可以将这些参数封装成一个pojo对象,具体过程看下一篇文章。