SpringMVC中控制器接收JSP頁面表單的參數接收方式詳解及細節注意(400錯誤)

控制器方法中參數的接收

(1)之前的參數接收:java

String  param = req.getParameter(name);web

(2)SpringMVC簡化這個操做,只須要給控制器方法添加參數便可spring

a:本質上仍是調用上述方法進行接收,只不過作了封裝服務器

b:參數類型(特殊類型除外,例如:Date)能夠自動轉換app

注意:jsp

(1)表單中的name屬性值和方法列表值保持一致,若是不一致,不會報錯,但那是接收到的值是null,須要注意的是,int類型的參數不能是null,因此服務器和頁面都會報錯:因此,爲避免這種錯誤,在定義實體類的時候實體類中的屬性類型基本類型最好定義成包裝類型post

(2)當接收到的數據屬日期類型時,若是僅僅使用Date做爲接收參數類型時,是不能解決問題的,由於日期是有格式定義的,而且表單中的日期格式必需要和方法參數列表中的日期格式一一對應,否則也會報錯;能夠經過註解@DateTimeFormat(pattern = "yyyy-MM-dd") Date birthday,兩次避免錯誤;此外,在SpringMVC中,400類型的錯誤,通常都是因爲接收參數類型不匹配所形成的測試

(3)當參數列表爲Boolean類型的數據時,表單中提交的參數值能夠是true或者false,可以正常接收,也能夠是1或者0,其中1表明true,0表明false優化

婚否: <input type="radio" name="married" value="1"> 已婚ui

     <input type="radio" name="married" value="0"> 未婚<br>

(4)當方法參數列表爲一個對象時,SpringMV也能夠進行參數接收,不過要求對象的屬性名稱必須和表單中的name值保持一致。其中,若是對象中的屬性爲另外一個對象,在表單中能夠經過對象名.屬性名來進行對屬性的賦值

地址: <select name="address.city">

(5)當方法參數列表爲list集合,表單中的name屬性值,能夠經過下面方式進行命名:

 地址1: <select name="addrList[0].city">

(6)不能使用map集合做爲方法參數列表

<form action="${pageContext.request.contextPath}/demo1" method="post">
    用戶名: <input type="text" name="username"><br>
    年齡: <input type="text" name="age"><br>
    生日: <input type="text" name="birthday">yyyy-MM-dd<br>
    愛好: <input type="checkbox" name="hob" value="java"> java
    <input type="checkbox" name="hob" value="C++"> C++
    <input type="checkbox" name="hob" value="PHP"> PHP<br>
    婚否: <input type="radio" name="married" value="1"> 已婚
    <input type="radio" name="married" value="0"> 未婚<br>
    地址: <select name="address.city">
    <option value="北京">北京</option>
    <option value="上海">上海</option>
    <option value="天津">天津</option>
</select><br>
    地址1: <select name="addrList[0].city">
    <option value="北京">北京</option>
    <option value="上海">上海</option>
    <option value="天津">天津</option>
</select><br>
    地址2: <select name="addrList[1].city">
    <option value="北京">北京</option>
    <option value="上海">上海</option>
    <option value="天津">天津</option>
</select><br>
    <input type="submit" value="提交">
</form>

  

package com.bjsxt.controller;

import com.bjsxt.pojo.User;
import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

import java.util.Arrays;
import java.util.Date;

@Controller
public class DemoController {

    @RequestMapping("/demo1")
    public String demo1(User user) {
        System.out.println(user);
        return "index.jsp";
    }

    @RequestMapping("/demo2")
    public String demo2(String username,
                        Integer age,
                        @DateTimeFormat(pattern = "yyyy-MM-dd") Date birthday,
                        String[] hob,
                        Boolean married) {
        System.out.println("username = " + username);
        System.out.println("age = " + age);
        System.out.println("birthday = " + birthday);
        System.out.println("hob = " + Arrays.toString(hob));
        System.out.println("married = " + married);
        return "index.jsp";
    }
}

  

public class User implements Serializable {
  //此處省略getter和setter方法,正常測試時須要添加 private String username; private Integer age; @DateTimeFormat(pattern = "yyyy-MM-dd") private Date birthday; private String[] hob; private Boolean married; private Address address; private List<Address> addrList = new ArrayList<>(); }

  

public class Address implements Serializable {
    private String city;
}

請求參數的進階優化

使用SpringMVC進行參數接收,這種方式存在的問題:

(1)若是前臺傳遞的參數和後臺接收的參數名稱不一致

(2)若是參數爲空(null,「 」),怎麼處理

(3)如何對參數進行限制

解決名稱不一致問題

@RequestParam:能夠對請求參數進行加工,經常使用屬性以下:

(1)value:用於定義參數的名稱,若是同名,能夠不寫

(2)required:布爾值,用於表示參數是否必須接收

true默認值,表示必須傳遞,不然會拋出400錯誤

false表示能夠不進行傳遞,使用null爲參數賦值

(3)defaultValue:默認值,當接收到的參數爲null或者空字符串時,默認值生效

注:當使用defalutValue時,required無效

@RequestMapping("/demo")
public String demo(
        @RequestParam(value = "page", defaultValue = "1") int page,
        @RequestParam(required = false, defaultValue = "10") int size) {
    System.out.println("page = " + page);
    System.out.println("size = " + size);
    return "index.jsp";
}

  

對參數進行限制

在某些狀況下,傳遞的參數是有限制的,例如管理系統中,要求管理員登陸時,用戶名和密碼必須傳遞,同時,又要求用戶名必須爲admin。

這時,就能夠經過@RequestMapping進行限制

@RequestMapping:用於給控制器進行映射,使用位置是在一個方法上

控制器類:對當前控制器中全部的方法添加訪問前綴(窄化:使路徑匹配更加精確)

屬性:

value:默認屬性,用於配置映射的路徑,/login

能夠精確匹配:/demo

模糊後綴匹配:/demo.xxx

能夠目錄匹配:/demo/

params:用於對請求參數作限制

method:表示當前控制器方法能處理的請求參數,例如get或者post

produces:能夠設置響應頭,須要配置@ResponseBody註解來使用

@RequestMapping(value = "/login", params = {"username=admin", "password"})
public String login(String username, String password) {
    System.out.println("username = " + username);
    System.out.println("password = " + password);
    return "index.jsp";
}

  

Restful風格參數的傳遞

Restful風格的參數傳遞:即參數假裝到路徑中,參數也做爲路徑的一部分

傳統方式傳參: localhost:8080/demo?name=admin&pwd=123

Restful風格: localhost:8080/demo/admin/123

例如:京東商城,書旗網

Restful風格傳參須要配置@pathvariable註解SpEL一塊兒實現:

{name}/{pwd}相似於佔位符

@RequestMapping("/rest/{name}/{pwd}")
public String rest(
        @PathVariable("name") String username,
        @PathVariable String pwd) {
    System.out.println("username = " + username);
    System.out.println("pwd = " + pwd);
    return "/index.jsp";
}

  

<a href="${pageContext.request.contextPath}/rest/zhangsan/123">Restful風格傳參</a>
相關文章
相關標籤/搜索