請求參數的綁定

1.綁定的機制
 
我們都知道,表單中請求參數都是基於 key=value 的。
SpringMVC 綁定請求參數的過程是通過把表單提交請求參數,作爲控制器中方法參數進行綁定的。
例如:
<a href="account/findAccount?accountId=10">查詢賬戶</a>
中請求參數是:
accountId=10
/**
* 查詢賬戶
* @return
*/
@RequestMapping("/findAccount")
public String findAccount(Integer accountId) {
System.out.println("查詢了賬戶。。。。"+accountId);
return "success";
}
 
2.支持的數據類型:
 
基本類型參數:
包括基本類型和 String 類型
POJO 類型參數:
包括實體類,以及關聯的實體類
數組和集合類型參數:
包括 List 結構和 Map 結構的集合(包括數組)
SpringMVC 綁定請求參數是自動實現的,但是要想使用,必須遵循使用要求。
如果是基本類型或者 String 類型:
要求我們的參數名稱必須和控制器中方法的形參名稱保持一致。(嚴格區分大小寫)
如果是 POJO 類型,或者它的關聯對象:
要求表單中參數名稱和 POJO 類的屬性名稱保持一致。並且控制器方法的參數類型是 POJO 類型。
如果是集合類型,有兩種方式:
第一種:
要求集合類型的請求參數必須在 POJO 中。在表單中請求參數名稱要和 POJO 中集合屬性名稱相同。
List 集合中的元素賦值,使用下標。
Map 集合中的元素賦值,使用鍵值對。
第二種:
接收的請求參數是 json 格式數據。需要藉助一個註解實現。
 
使用示例
 
1 基本類型和 String 類型作爲參數
jsp 代碼:
<!-- 基本類型示例 -->
<a href="account/findAccount?accountId=10&accountName=zhangsan">查詢賬戶</a>
控制器代碼:
/**
* 查詢賬戶
* @return
*/
@RequestMapping("/findAccount")
public String findAccount(Integer accountId,String accountName) {
System.out.println("查詢了賬戶。。。。"+accountId+","+accountName);
return "success";
}
 
2 POJO 類型作爲參數
實體類代碼:
/**
* 賬戶信息
* @author 黑馬程序員
* @Company http://www.ithiema.com
* @Version 1.0
*/
public class Account implements Serializable {
private Integer id;
private String name;
private Float money;
private Address address;
//getters and setters
}
/**
* 地址的實體類
* @author 黑馬程序員
* @Company http://www.ithiema.com
* @Version 1.0
*/
public class Address implements Serializable {
private String provinceName;
private String cityName;
//getters and setters
}
jsp 代碼:
<!-- pojo 類型演示 -->
<form action="account/saveAccount" method="post">
賬戶名稱:<input type="text" name="name" ><br/>
賬戶金額:<input type="text" name="money" ><br/>
賬戶省份:<input type="text" name="address.provinceName" ><br/>
賬戶城市:<input type="text" name="address.cityName" ><br/>
<input type="submit" value="保存">
</form>
控制器代碼:
/**
* 保存賬戶
* @param account
* @return
*/
@RequestMapping("/saveAccount")
public String saveAccount(Account account) {
System.out.println("保存了賬戶。。。。"+account);
return "success";
}
 
3 POJO 類中包含集合類型參數
實體類代碼:
/**
* 用戶實體類
* @author 黑馬程序員
* @Company http://www.ithiema.com
* @Version 1.0
*/
public class User implements Serializable {
private String username;
private String password;
private Integer age;
private List<Account> accounts;
private Map<String,Account> accountMap;
//getters and setters
@Override
public String toString() {
return "User [username=" + username + ", password=" + password + ", age="
+ age + ",\n accounts=" + accounts
+ ",\n accountMap=" + accountMap + "]";
}
}
jsp 代碼:
<!-- POJO 類包含集合類型演示 -->
<form action="account/updateAccount" method="post">
用戶名稱:<input type="text" name="username" ><br/>
用戶密碼:<input type="password" name="password" ><br/>
用戶年齡:<input type="text" name="age" ><br/>
賬戶 1 名稱:<input type="text" name="accounts[0].name" ><br/>
賬戶 1 金額:<input type="text" name="accounts[0].money" ><br/>
賬戶 2 名稱:<input type="text" name="accounts[1].name" ><br/>
賬戶 2 金額:<input type="text" name="accounts[1].money" ><br/>
賬戶 3 名稱:<input type="text" name="accountMap['one'].name" ><br/>
賬戶 3 金額:<input type="text" name="accountMap['one'].money" ><br/>
賬戶 4 名稱:<input type="text" name="accountMap['two'].name" ><br/>
賬戶 4 金額:<input type="text" name="accountMap['two'].money" ><br/>
<input type="submit" value="保存">
</form>
控制器代碼:
/**
* 更新賬戶
* @return
*/
@RequestMapping("/updateAccount")
public String updateAccount(User user) {
System.out.println("更新了賬戶。。。。"+user);
return "success";
}
 
4 請求參數亂碼問題
post 請求方式:
web.xml 中配置一個過濾器
<!-- 配置 springMVC 編碼過濾器 -->
<filter>
<filter-name>CharacterEncodingFilter</filter-name>
<filter-class>
org.springframework.web.filter.CharacterEncodingFilter
</filter-class>
 
<!-- 設置過濾器中的屬性值 -->
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
<!-- 啓動過濾器 -->
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<!-- 過濾所有請求 -->
<filter-mapping>
<filter-name>CharacterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
springmvc 的配置文件中可以配置,靜態資源不過濾:
<!-- location 表示路徑,mapping 表示文件,**表示該目錄下的文件以及子目錄的文件 -->
<mvc:resources location="/css/" mapping="/css/**"/>
<mvc:resources location="/images/" mapping="/images/**"/>
<mvc:resources location="/scripts/" mapping="/javascript/**"/>
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章