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方法獲取,另外兩種方法都是非常好用的方法,根據實際情況進行選取即可


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM