一、请求参数的绑定 1、绑定说明 我们都知道,表单中请求参数都是基于key=value的。 SpringMVC绑定请求参数的过程是通过把表单提交请求参数,作为控制器中方法参数进行绑定的。 例如:
<a href ="param/testParam?username=hehe&password=1234" >
@RequestMapping ("/testParam" ) public String testParam (String username,String password) { System.out.println("执行了..." ); System.out.println("用户名为:" + username ); System.out.println("密码为" + password); return "success" ; }
控制器中方法参数 就直接被赋值为请求的参数。 可以直接进行输出。
(1)支持的数据类型: 1.基本类型参数: 包括基本类型和String类型 ,要求我们的参数名称必须和控制器中方法的形参名称保持一致。(严格区分大小写)
2.POJO类型参数: 包括实体类JavaBean ,以及关联的实体类 ,要求表单中参数名称和POJO类的属性名称保持一致。并且控制器方法的参数类型是POJO类型。
3.数组和集合类型参数: 包括List结构和Map结构 的集合(包括数组)
第一种: 要求集合类型的请求参数必须在POJO中。在表单中请求参数名称要和POJO中集合属性名称相同。 给List集合中的元素赋值,使用下标。 给Map集合中的元素赋值,使用键值对。
第二种: 接收的请求参数是json格式数据。需要借助一个注解 实现。
SpringMVC绑定请求参数是自动实现的,但是要想使用,必须遵循使用要求。
@RequestMapping ("/testParam" ) public String testParam (String username,String password) { System.out.println("执行了..." ); System.out.println("用户名为:" + username ); System.out.println("密码为" + password); return "success" ; } @RequestMapping ("/saveAccount" ) public String saveAccount (Account account) { System.out.println("执行了saveAccount..." ); System.out.println(account); return "success" ; }
<form action ="param/saveAccount" method ="post" > 姓名:<input type ="text" name ="username" /> <br /> 密码:<input type ="text" name ="password" /> <br /> 金额:<input type ="text" name ="money" /> <br /> <%-- 引用类型的封装-- %> 用户姓名:<input type ="text" name ="user.uname" /> <br /> 用户年龄:<input type ="text" name ="user.age" /> <br /> <input type ="submit" value ="提交" > </form > 把数据封装到Account类中,类中存在list,map的集合 <form action ="param/saveAccount" method ="post" > 姓名:<input type ="text" name ="username" /> <br /> 密码:<input type ="text" name ="password" /> <br /> 金额:<input type ="text" name ="money" /> <br /> <%-- 引用类型的封装-- %> 用户姓名:<input type ="text" name ="list[0].uname" /> <br /> 用户年龄:<input type ="text" name ="list[0].age" /> <br /> 用户姓名:<input type ="text" name ="map['one'].uname" /> <br /> 用户年龄:<input type ="text" name ="map['one'].age" /> <br /> <input type ="submit" value ="提交" > </form >
(2)请求参数乱码问题 当请求参数包含中文时,就会出现乱码问题。在web中,我们使用了response.setCharacterEncoding(“UTF-8”); 来设置编码。但在SpringMVC中通过设置过滤器(Filter)来对所有访问的路径进行,拦截设置编码。
<filter > <filter-name > characterEncodingFilter</filter-name > <filter-class > org.springframework.web.filter.CharacterEncodingFilter</filter-class > <init-param > <param-name > encoding</param-name > <param-value > UTF-8</param-value > </init-param > </filter > <filter-mapping > <filter-name > characterEncodingFilter</filter-name > <url-pattern > /*</url-pattern > </filter-mapping >
2、特殊的绑定说明 自定义类型转换器:在SpringMVC中,会相对智能的把String类型的请求参数,转化成int类型。但一些特殊的类型,需要自己配置自定义类型转换器进行转换。
自定义类型转换器 <form action ="param/saveUser" method ="post" > 用户姓名:<input type ="text" name ="uname" /> <br /> 用户年龄:<input type ="text" name ="age" /> <br /> 用户生日:<input type ="text" name ="date" > <br /> <input type ="submit" value ="提交" > </form >
提交表单时,用2019-9-6这样不标准的格式进行输入,如果不配置转换器,输出就会为出错。
@RequestMapping ("/saveUser" ) public String saveUser (User user) { System.out.println("执行了saveUser..." ); System.out.println(user); return "success" ; }
所以我们需要配置一个自定义类型转换器,进行转换为Date。
(1)定义一个类,实现Converter接口 ,该接口有两个泛型,就是将什么转换成什么的说明。例如把字符串转换成日期
public class StringToDateConverter implements Converter <String ,Date > { @Override public Date convert (String date) { if (source == null ) { throw new RuntimeException("请您传入数据" ); } DateFormat df = new SimpleDateFormat("yyyy-MM-dd" ); try { return df.parse(date); } catch (ParseException e) { throw new RuntimeException("数据类型转换出现错误" ); } } }
(2)在spring配置文件中配置类型转换器 。 将自定义的转换器 注册到 类型转换服务 中去。
<bean id ="converterService" class ="org.springframework.context.support.ConversionServiceFactoryBean" > <property name ="converters" > <array > <bean class ="com.itcast.web.utils.StringToDateConverter" > </bean > </array > </property > </bean >
(3)在annotation-driven标签中引用配置的类型转换服务 ,在springmvc配置文件中默认的组件生效(适配器,前端控制器)不需要配置。
<mvc:annotation-driven conversion-service ="conversionService" > </mvc:annotation-driven >
3、使用原生的Servlet的API 由于是SpringMVC框架,所以原来的Servlet变成了现在的控制器Controller。所以我们如果要使用原来的例如:HttpServletRequest,HttpServletResponse,HttpSession等等…
就需要把上述对象,直接写在控制的方法参数中使用。 例如:
@RequestMapping ("/testServlet" ) public String testServlet (HttpServletRequest request, HttpServletResponse response) { System.out.println("执行了testServlet..." ); HttpSession session = request.getSession(); System.out.println(session); ServletContext servletContext = session.getServletContext(); System.out.println(servletContext); System.out.println(response); return "success" ; }
二、常用的注解 1、RequestParam 把请求中指定名称的参数 给 控制器中的形参 赋值。
@RequestMapping ("/testRequestParam" ) public String testRequestParam (@RequestParam(name = "username" ) String username) { System.out.println("执行了testRequestParam()..." ); System.out.println(username); return "success" ; }
<a href ="springmvc/useRequestParam?username=test" > requestParam注解</a >
故直接将url中的username直接赋值给controller中的参数。
2、RequestBody 顾名思义:用于获取请求体内容 直接使用得到是 key=value & key=value…结构的数据。
注意:get请求方式不适用 。
@RequestMapping ("/testRequestBody" ) public String testRequestBody (@RequestBody String body) { System.out.println("执行了testRequestBody()..." ); System.out.println(body); return "success" ; }
3、PathVaribale 用于绑定url中的占位符 。例如:请求url中 /delete/{id} ,这个{id}就是url占位符 。
<a href ="anno/testPathVariable/10" > testPathVariable</a >
@RequestMapping (value = "/testPathVariable/{id}" ,method = RequestMethod.PUT) public String testPathVariable (@PathVariable(name = "id" ) String id) { System.out.println("执行了testPathVariable()..." ); System.out.println(id); return "success" ; }
{id}直接拿取到url中的参数
顾名思义:用于获取请求消息头 。
<a href ="anno/testRequestHeader" > testRequestHeader</a >
@RequestMapping ("/testRequestHeader" ) public String testRequestHeader (@RequestHeader(value = "Accept" ) String header) { System.out.println("执行了testRequestHeader()..." ); System.out.println(header); return "success" ; }
5、CookieValue 顾名思义:用于把指定cookie名称的值传入控制器方法参数 。
<a href ="anno/testCookieValue" > testCookieValue</a >
@RequestMapping ("/testCookieValue" ) public String testCookieValue (@CookieValue(value = "JSESSIONID" ) String cookieValue) { System.out.println("执行了testCookieValue()..." ); System.out.println(cookieValue); return "success" ; }
6、ModelAttribute 出现在方法上,表示当前方法会在控制器的方法执行之前,先执行 。它可以修饰没有返回值的方法,也可以修饰有具体返回值的方法。
出现在参数上,获取指定的数据给参数赋值。
作用:当表单提交数据不是完整的实体类数据时,保证没有提交数据的字段使用数据库对象原来的数据。
@RequestMapping ("/testModelAttribute" ) public String testModelAttribute (@ModelAttribute("user" ) User user) { System.out.println("执行了testModelAttribute()..." ); System.out.println(user); return "success" ; } @ModelAttribute public User showUser (String username, Map<String,User> map) { System.out.println("执行了showUser()..." ); User user = new User(); user.setUname(username); user.setAge(20 ); user.setDate(new Date()); map.put("user" ,user); return user; }
7、SessionAttribute 作用:用于多次执行控制器方法间的参数共享 。将数据存储到request域中,再存储到session中,可以获取session值也可以删除session值 。
<form action ="anno/testSessionAttributes" method ="post" > 用户姓名:<input type ="text" name ="username" /> <br /> 用户年龄:<input type ="text" name ="age" /> <br /> <input type ="submit" value ="提交" > </form > <a href ="anno/getSessionAttributes" > getSessionAttributes</a > <a href ="anno/delSessionAttributes" > delSessionAttributes</a >
@RequestMapping ("/testSessionAttributes" ) public String testSessionAttributes (Model model) { System.out.println("执行了testSessionAttributes()..." ); model.addAttribute("msg" ,"哈哈" ); return "success" ; } @RequestMapping ("/getSessionAttributes" ) public String getSessionAttributes (ModelMap modelMap) { System.out.println("执行了getSessionAttributes()..." ); String msg =(String) modelMap.get("msg" ); System.out.println(msg); return "success" ; } @RequestMapping ("/delSessionAttributes" ) public String delSessionAttributes (SessionStatus status) { System.out.println("执行了delSessionAttributes()..." ); status.setComplete(); return "success" ; }