zoukankan      html  css  js  c++  java
  • Springmvc之接受请求参数二

    Springmvc之接受请求参数

    准备工作

      • 新建一个表单提交
        • 请求地址: http://localhost:8080/ProjectName/user/login.do
        • <form action="<%=request.getContextPath()%>/user/login.do" method="post">
              username:<input type="text" name="username"> <br>
              password:<input type="text" name="password"> <br>
              age:<input type="text" name="age">
              <input type="submit" value="提交">
          </form>

     

    【不推荐】HttpServletRequest

    • 直接使用HttpServeletRequest作为方法参数,spring会自动为其注入
    • 需要手动转换参数的类型
    • @RequestMapping(value="/login.do")
          public String login(HttpServletRequest request,HttpServletResponse response){
              String username=request.getParameter("username");
              String password=request.getParameter("password");
              int age=Integer.parseInt(request.getParameter("age"));  //转换类型
              System.out.println(username+"--->"+password);
              return "success";
          }

      直接在方法中声明对应的参数(name的属性必须和方法参数一致)

        • 表单中的name属性要和方法中的参数一致
        • 涉及到类型转换,直接在方法中申明不同类型的参数即可
        • 优点: 方便,并且可以使Springmvc自动处理数据类型
      @RequestMapping(value = "/login.do")
          public String login(String username,String password,Integer age) {
              System.out.println(username + "--->" + password+"----->"+age);
              return "success";
          }

      【推荐】@RequestParam

      • 使用该注解可以获取请求参数,方法中的参数可以与表单中的name属性不一致
      • 使用@RequestParam这个获取的值必须包含在请求参数中,否则报错,除非设置required属性为false
        • /**
               * 使用@RequestParam获取请求参数
               * @RequestParam()中的value属性为form表单中对应的name属性
               * 自动转换数据类型,只需要定义方法参数为所需的数据类型即可,spring会为我们自动转换
               */
              @RequestMapping(value = "/login.do")
              public String login(@RequestParam(value = "username") String name,
                      @RequestParam("password") String pwd,@RequestParam("age") Integer age) {
                  System.out.println(name + "--->" + pwd+"----->"+age);
                  return "success";
              }

          属性

            • value 指定请求中对应的属性名称,这个就像表单中定义的name属性
            • required
              指定是否这个参数必须包含在请求地址中,默认是true,即是如果不包含这个参数那么就会报错。
            • defaultValue 指定默认的值,如果设置了required=false,并且没有设置这个值,那么默认的是null,但是也是可以使用这个属性来设置参数默认的值。当然对于设置了int类型的参数,那么并没有指定其值,那么将会报错,因为int类型没有null,只有Integer类型的才有,因此需要设置成Integer
        • /*
               * 这里的获取请求参数中的username,age的值
               * 其中username的这个注解默认的是required=true,因此这个是不可以没有的
               * age的这个注解设置了required=false,表示可以没有这个参数,但是如果没有这个参数,那么默认的是null,但是int类型的没有null,因此也会是报错的,有两种解决方式:
               *      1) 通过defalutValue设置其默认的值
               *      2) 如果我们就想要设其为null,可以使用封装类Integer类型即可
               */
              @RequestMapping(value = "/testRequestParams")
              public String testRequestParams(@RequestParam(value="username") String username,@RequestParam(value="age",required=false) int age) {
                  System.out.println("username,age  "+ username+"  ,  "+age);
                  return SUCCESS;
              }

          【推荐】使用自定义数据类型(JavaBean)

          • 如果传过来的请求参数很多,那么我们使用上面的方法获取请求参数,需要申明很多的方法参数。但是我们可以将传递过来的请求参数封装成一个JavaBean,那么我们直接传入一个JavaBean对象即可接收全部的请求参数。
          • 声明一个User类,其中必须为每一个属性添加 set方法,并且其中的变量名要和表单中的name属性一致
          • public class User {
                private String username;
                private String password;
                private int age;
                public int getAge() {
                    return age;
                }
                public void setAge(int age) {
                    this.age = age;
                }
                public String getUsername() {
                    return username;
                }
                public void setUsername(String username) {
                    this.username = username;
                }
                public String getPassword() {
                    return password;
                }
                public void setPassword(String password) {
                    this.password = password;
                }
                @Override
                public String toString() {
                    return "User [username=" + username + ", password=" + password + "]";
                }
            
            }
              • 那么我们此时的UserController中的login方法如下:
            @RequestMapping(value = "/login.do")
                public String login(User user) {
                    System.out.println(user);
                    return "success";
                }

            总结

              • 以上的所有方法并不冲突,可以混合使用
            /**
                 * 混合使用案例
                */
                @RequestMapping(value = "/login.do")
                public String login(User user,@RequestParam("gender")String gender) {
                    System.out.println(user);
                    return "success";
                }
            • 不建议使用HttpServletRequest方法获取,另外两种方法都是非常好用的方法,根据实际情况进行选取即可
  • 相关阅读:
    [LeetCode]N-Queens
    [LeetCode]Anagrams
    [LeetCode]Permutations II
    [LeetCode]Permutations
    [STL]heap和priority_queue
    [STL]deque和stack、queue
    10、小易记单词--2017网易春招
    29、剑指offer--最小的K个数
    28、剑指offer--数组中出现次数超过一半的数字
    9、涂棋盘--2017网易春招
  • 原文地址:https://www.cnblogs.com/a8457013/p/9069902.html
Copyright © 2011-2022 走看看