• (Spring笔记)SpringMVC中前端提交数据到后端的五种注入参数方式


    目录

    一、单个数据注入

    二、对象封装注入

    三、动态占位符注入(RESTful规范)

    四、映射名不一致

    五、HttpServletRequest手工提取

    六、补充其它——Cookie映射注入

    七、总结


    本章学习源码Github地址: https://github.com/GuiZhouAndroid/MySpringMVCAllProject/tree/master/SpringMVCDemo02_submitdata

            前四种数据注入的方式,会自动进行类型转换,但无法自动转换日期类型。


    一、单个数据注入

            在表单中,填入姓名和年龄,提交时,数据会自动类型转换并将其注入到后台形参中,借助——>HandlerAdapter完成数据类型转换。

    1. <form action="${pageContext.request.contextPath}/one.do" method="post">
    2. 姓名:<input type="text" name="myname"><br/>
    3. 年龄:<input type="text" name="myage"><br/>
    4. <input type="submit" value="单个数据提交">
    5. form>
    1. /**
    2. *
    3. *
    4. */
    5. @RequestMapping(value = "/one.do")
    6. public String one(String myname, int myage) {
    7. System.out.println("后台接收姓名===" + myname);
    8. System.out.println("后台接收年龄===" + (myage+100));
    9. return "main";
    10. }

            注意:如果是get请求方式,在Tomcat 8以后乱码被官方解决了,而post请求方式则会出现乱码问题,如姓名出现中文乱码,一堆问号或其他符号——??????,就需要在web.xml配置Spring默认乱码过滤器。(以下代码配置最好放在web.xml最前,因为web中的配置自上而下按顺序执行,在最前面解决中文乱码,可以保障后面的Servlet或监听器等配置信息不出现乱码错误)如下:

    1. <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
    2. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    3. xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
    4. version="4.0">
    5. <filter>
    6. <filter-name>encodingfilter-name>
    7. <filter-class>org.springframework.web.filter.CharacterEncodingFilterfilter-class>
    8. <init-param>
    9. <param-name>encodingparam-name>
    10. <param-value>UTF-8param-value>
    11. init-param>
    12. <init-param>
    13. <param-name>forceRequestEncodingparam-name>
    14. <param-value>trueparam-value>
    15. init-param>
    16. <init-param>
    17. <param-name>forceResponseEncodingparam-name>
    18. <param-value>trueparam-value>
    19. init-param>
    20. filter>
    21. <filter-mapping>
    22. <filter-name>encodingfilter-name>
    23. <url-pattern>/*url-pattern>
    24. filter-mapping>
    25. ......

    二、对象封装注入

            SpringMVC会根据请求参数名和实体属性名进行匹配,自动为该对象填充属性值,并且支持属性级联。在提交过程请求中,保证请求参数的名称与实体类中成员变量的名称一致,则可以自动创建对象,则可以自动注入数据、自动类型转换、自动注入数据到实体对象中,可以直接调用。借助——>HandlerAdapter完成数据类型转换、把表单数据封装到实体中(User)。

    1. <form action="${pageContext.request.contextPath}/two.do" method="post">
    2. <%-- 对象属性名称与输入框name属性值必须保持一致 --%>
    3. <%-- private String name; --%>
    4. <%-- private int age; --%>
    5. 姓名:<input type="text" name="name"><br/>
    6. 年龄:<input type="text" name="age"><br/>
    7. <input type="submit" value="对象封装注入">
    8. form>
    1. public class User {
    2. private String name;//姓名
    3. private int age;//年龄
    4. public String getName() {
    5. return name;
    6. }
    7. public void setName(String name) {
    8. this.name = name;
    9. }
    10. public int getAge() {
    11. return age;
    12. }
    13. public void setAge(int age) {
    14. this.age = age;
    15. }
    16. @Override
    17. public String toString() {
    18. return "User{" +
    19. "name='" + name + '\'' +
    20. ", age=" + age +
    21. '}';
    22. }
    23. }
    1. /**
    2. * private String name;//姓名
    3. * private int age;//年龄
    4. *
    5. *
    6. */
    7. @RequestMapping(value = "/two.do")
    8. public String two(User user) {
    9. System.out.println("后台接收姓名===" + user.getName());
    10. System.out.println("后台接收年龄===" + (user.getAge() + 100));
    11. return "main";
    12. }


    三、动态占位符注入(RESTful规范)

            仅限于超链接或地址拦提交数据。前端是一杠一值(/任意值/任意值),后端一杠一大括号(/{任意值}/{任意值}),使用注解@PathVariable来解析。

            注意: @PathVariable(""),里面的值必须与“/{值}保持一致,否则无法接收,注入失败。借助——>HandlerAdapter

    <a href="${pageContext.request.contextPath}/three/张松/24.do">动态占位符注入a>
    1. /**
    2. * /three/张松/24.do
    3. */
    4. @RequestMapping(value = "/three/{name}/{age}.do")
    5. public String three(@PathVariable("name") String myName, @PathVariable("age") int myAge) {
    6. System.out.println("后台接收姓名===" + myName);
    7. System.out.println("后台接收年龄===" + (myAge + 100));
    8. return "main";
    9. }


    四、映射名不一致

            提交请求的参数与表单action方法中形参的名称不一致,使用注解@RequestParam来解析。

            注意:@RequestParam(""),里面的值必须与请求参数名保持一致,否则无法接收,注入失败。借助——>HandlerAdapter

            参数注入错误举例:前端提交myage,后端接收age

    1. <form action="${pageContext.request.contextPath}/four.do" method="post">
    2. <%-- String name, int age --%>
    3. 姓名:<input type="text" name="myname"><br/>
    4. 年龄:<input type="text" name="myage"><br/>
    5. <input type="submit" value="映射名称不一致">
    6. form>
    1. /**
    2. *
    3. *
    4. */
    5. @RequestMapping(value = "/four.do")
    6. public String four(@RequestParam("myname") String name, @RequestParam("myage") int age) {
    7. System.out.println("后台接收姓名===" + name);
    8. System.out.println("后台接收年龄===" + (age + 100));
    9. return "main";
    10. }


    五、HttpServletRequest手工提取

            使用Servlet最初那一招,特别注意:参数不支持自动类型转换,需开发中自己解决。

    1. <form action="${pageContext.request.contextPath}/five.do" method="post">
    2. <%-- String name, int age --%>
    3. 姓名:<input type="text" name="myname"><br/>
    4. 年龄:<input type="text" name="myage"><br/>
    5. <input type="submit" value="HttpServletRequest手工提取">
    6. form>
    1. /**
    2. *
    3. *
    4. */
    5. @RequestMapping(value = "/five.do")
    6. public String five(HttpServletRequest request) {
    7. System.out.println("后台接收姓名===" + request.getParameter("myname"));
    8. //获取到参数,需要自己进行类型转换
    9. System.out.println("后台接收年龄===" + (Integer.parseInt(request.getParameter("myage")) + 100));
    10. return "main";
    11. }


    六、补充其它——Cookie映射注入

    1. @RequestMapping("/cookie.do")
    2. public String getCookie(@CookieValue("JSESSIONID") String sessionId){
    3. System.out.println("后台接收Cookie===" +sessionId);
    4. return "main";
    5. }


    七、总结

    仅自己学习记录,如有错误,敬请谅解~,谢谢~~~

  • 相关阅读:
    【算法练习Day26】分发饼干&&摆动序列&& 最大子数组和
    Docker安装使用
    WebRTC目录结构
    shell实现部署ftp提供共享yum仓库
    21. 合并两个有序链表 (Python 实现)
    pixhawk飞控和自习开发的stm32芯片通讯问题
    电脑技巧:推荐一款桌面增强工具AquaSnap
    arm day 9
    物料凭证过账时有用的BAdI和User exit
    Python错题集-8:AttributeError(找不到对应的对象的属性)
  • 原文地址:https://blog.csdn.net/qq_39038178/article/details/125910765