目录
本章学习源码Github地址: https://github.com/GuiZhouAndroid/MySpringMVCAllProject/tree/master/SpringMVCDemo02_submitdata
前四种数据注入的方式,会自动进行类型转换,但无法自动转换日期类型。
在表单中,填入姓名和年龄,提交时,数据会自动类型转换并将其注入到后台形参中,借助——>HandlerAdapter完成数据类型转换。
- <form action="${pageContext.request.contextPath}/one.do" method="post">
- 姓名:<input type="text" name="myname"><br/>
- 年龄:<input type="text" name="myage"><br/>
- <input type="submit" value="单个数据提交">
- form>
- /**
- *
- *
- */
- @RequestMapping(value = "/one.do")
- public String one(String myname, int myage) {
- System.out.println("后台接收姓名===" + myname);
- System.out.println("后台接收年龄===" + (myage+100));
- return "main";
- }
注意:如果是get请求方式,在Tomcat 8以后乱码被官方解决了,而post请求方式则会出现乱码问题,如姓名出现中文乱码,一堆问号或其他符号——??????,就需要在web.xml配置Spring默认乱码过滤器。(以下代码配置最好放在web.xml最前,因为web中的配置自上而下按顺序执行,在最前面解决中文乱码,可以保障后面的Servlet或监听器等配置信息不出现乱码错误)如下:
-
- <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
- version="4.0">
-
- <filter>
- <filter-name>encodingfilter-name>
- <filter-class>org.springframework.web.filter.CharacterEncodingFilterfilter-class>
-
- <init-param>
- <param-name>encodingparam-name>
- <param-value>UTF-8param-value>
- init-param>
- <init-param>
- <param-name>forceRequestEncodingparam-name>
- <param-value>trueparam-value>
- init-param>
- <init-param>
- <param-name>forceResponseEncodingparam-name>
- <param-value>trueparam-value>
- init-param>
- filter>
-
- <filter-mapping>
- <filter-name>encodingfilter-name>
-
- <url-pattern>/*url-pattern>
- filter-mapping>
- ......
SpringMVC会根据请求参数名和实体属性名进行匹配,自动为该对象填充属性值,并且支持属性级联。在提交过程请求中,保证请求参数的名称与实体类中成员变量的名称一致,则可以自动创建对象,则可以自动注入数据、自动类型转换、自动注入数据到实体对象中,可以直接调用。借助——>HandlerAdapter完成数据类型转换、把表单数据封装到实体中(User)。
- <form action="${pageContext.request.contextPath}/two.do" method="post">
- <%-- 对象属性名称与输入框name属性值必须保持一致 --%>
- <%-- private String name; --%>
- <%-- private int age; --%>
- 姓名:<input type="text" name="name"><br/>
- 年龄:<input type="text" name="age"><br/>
- <input type="submit" value="对象封装注入">
- form>
- 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;
- }
-
- @Override
- public String toString() {
- return "User{" +
- "name='" + name + '\'' +
- ", age=" + age +
- '}';
- }
- }
- /**
- * private String name;//姓名
- * private int age;//年龄
- *
- *
- */
- @RequestMapping(value = "/two.do")
- public String two(User user) {
- System.out.println("后台接收姓名===" + user.getName());
- System.out.println("后台接收年龄===" + (user.getAge() + 100));
- return "main";
- }
仅限于超链接或地址拦提交数据。前端是一杠一值(/任意值/任意值),后端一杠一大括号(/{任意值}/{任意值}),使用注解@PathVariable来解析。
注意: @PathVariable("值"),里面的值必须与“/{值}”保持一致,否则无法接收,注入失败。借助——>HandlerAdapter
<a href="${pageContext.request.contextPath}/three/张松/24.do">动态占位符注入a>
- /**
- * /three/张松/24.do
- */
- @RequestMapping(value = "/three/{name}/{age}.do")
- public String three(@PathVariable("name") String myName, @PathVariable("age") int myAge) {
- System.out.println("后台接收姓名===" + myName);
- System.out.println("后台接收年龄===" + (myAge + 100));
- return "main";
- }
提交请求的参数与表单action方法中形参的名称不一致,使用注解@RequestParam来解析。
注意:@RequestParam("值"),里面的值必须与请求参数名保持一致,否则无法接收,注入失败。借助——>HandlerAdapter
参数注入错误举例:前端提交myage,后端接收age
- <form action="${pageContext.request.contextPath}/four.do" method="post">
- <%-- String name, int age --%>
- 姓名:<input type="text" name="myname"><br/>
- 年龄:<input type="text" name="myage"><br/>
- <input type="submit" value="映射名称不一致">
- form>
- /**
- *
- *
- */
- @RequestMapping(value = "/four.do")
- public String four(@RequestParam("myname") String name, @RequestParam("myage") int age) {
- System.out.println("后台接收姓名===" + name);
- System.out.println("后台接收年龄===" + (age + 100));
- return "main";
- }
使用Servlet最初那一招,特别注意:参数不支持自动类型转换,需开发中自己解决。
- <form action="${pageContext.request.contextPath}/five.do" method="post">
- <%-- String name, int age --%>
- 姓名:<input type="text" name="myname"><br/>
- 年龄:<input type="text" name="myage"><br/>
- <input type="submit" value="HttpServletRequest手工提取">
- form>
- /**
- *
- *
- */
- @RequestMapping(value = "/five.do")
- public String five(HttpServletRequest request) {
- System.out.println("后台接收姓名===" + request.getParameter("myname"));
- //获取到参数,需要自己进行类型转换
- System.out.println("后台接收年龄===" + (Integer.parseInt(request.getParameter("myage")) + 100));
- return "main";
- }
- @RequestMapping("/cookie.do")
- public String getCookie(@CookieValue("JSESSIONID") String sessionId){
- System.out.println("后台接收Cookie===" +sessionId);
- return "main";
- }
仅自己学习记录,如有错误,敬请谅解~,谢谢~~~