
1. 什么是SpringMVC參數(shù)綁定
就是將URL中的的請求參數(shù),進(jìn)行類型轉(zhuǎn)換(String或其他類型),將轉(zhuǎn)換后的值在賦值給Controller方法形參中,然后Controller就可以直接使用該形參。
2. 默認(rèn)的參數(shù)綁定類型
- HttpServletRequest
- HttpServletResponse
- HttpSession
- Model:數(shù)據(jù)模型,主要存儲要返回到客戶端的數(shù)據(jù)的。功能類似于Request對象。
- ModelMap
- 演示
@RequestMapping("/Parameter")
public Stirng parameter(HttpServletRequest request,HttpServletResponse response,
HttpSession session,Model model,ModelMap modelMap) throws Exception{
request.setAttribute("requestParameter", "request類型");
response.getWriter().write("response");
session.setAttribute("sessionParameter", "session類型");
model.addAttribute("modelParameter", "model類型");
modelMap.addAttribute("modelMapParameter", "modelMap類型");
return "success";
}
3. 簡單類型
- 請求URL
http://localhost:8080/springmvc/test/queryById?id=1&name=zhangsan
參數(shù)為id=1&name=zhangsan
-
Controller
注意:請求參數(shù)的key,需要和controller方法形參名稱一致,注意類型是否匹配。
@RequestMapping(“queryById”)
public String queryItemById(int id,String name){}
- RequestParam
-
作用:
- 相當(dāng)于request.getParameter(請求參數(shù)中的key);
- 將獲取的值,綁定到該注解修飾中的參數(shù)中;
-
屬性:
- value:URL請求參數(shù)中的key;
- required:true/false,表示該URL是否必須要帶有該參數(shù),默認(rèn)是true;
- default:如果required設(shè)置為true,但是URL中沒有指定的key,則默認(rèn)取該值進(jìn)行參數(shù)綁定。
4. POJO類型
- 請求參數(shù)
id=10&name=zhangsan
-
Controller
使用要求- 使用一個POJO類型的參數(shù)作為Contoller方法的參數(shù)形參,進(jìn)行形參綁定。
- 請求參數(shù)的key,需要和一個POJO類型的屬性名稱一致。
- 如果參數(shù)的key出現(xiàn)這種方式
address.provinceName,需要需要POJO類型中嵌套POJO類型的屬性進(jìn)行接受請求參數(shù)User#Address(address)#provinceName。
代碼
@RequestMapping("saveUser")
public String saveUser(User user,Model model) {
model.addAttribute("msg", "接收到的參數(shù):"+user.toString());
return "success";
}
public class User {
private int id;
private String username;
private Date birthday;
private String sex;
// 演示包裝POJO參數(shù)綁定
private Address address;
}
5. 日期類型
-
問題
對于字符串類型的日期參數(shù),轉(zhuǎn)換成Data的參數(shù),會有轉(zhuǎn)換類型問題。原因是因?yàn)?,SpringMVC無法確定頁面?zhèn)魅氲娜掌诟袷绞鞘裁搭愋偷?,所以無法進(jìn)行無法參數(shù)轉(zhuǎn)換。 - 解決辦法
Converter:實(shí)現(xiàn)類型轉(zhuǎn)換
public class DateConverter implements Converter<String,Date>{
@Override
public Date convert(String source) {
// 使用Java中 SimpleDateFormat API完成日期轉(zhuǎn)換
String pattern = "yyyy-MM-dd HH:mm:ss";
SimpleDateFormat dateFormat = new SimpleDateFormat(pattern );
try {
return dateFormat.parse(source);
} catch (ParseException e) {
e.printStackTrace();
}
return null;
}
}
將Converter注冊到處理器適配器中
<!-- 配置注解方式處理器對應(yīng)的適配器和映射器,同時還注入了很多其他的bean -->
<mvc:annotation-driven
conversion-service="conversionService" />
<!-- 配置ConversionService -->
<bean id="conversionService"
class="org.springframework.context.support.ConversionServiceFactoryBean">
<property name="converters">
<set>
<bean class="com.springmvc.controller.converter.DateConverter"></bean>
</set>
</property>
</bean>
6. 集合或者類型
6.1 元素是簡單類型的集合或數(shù)組
-
注意
- 直接使用LIst集合或者數(shù)組作為形參,List集合會報(bào)錯。
- 直接使用POJO類型作為形參,并且該P(yáng)OJOlei類型擁有一個List集合屬性或者數(shù)組屬性。這種情況下List和數(shù)組都可以成功接收參數(shù)。
- 請求參數(shù)key和形參名稱或者屬性名稱要一致。
- 請求參數(shù)
id=1&id=2&id=3
-
Controller方法
第一個和第三個是成功的,第二個不成功。
@RequestMapping("findUserByIds")
public String findUserByIds(Integer[] id,Model model) {
model.addAttribute("msg", "接收到的參數(shù):"+id);
return "success";
}
@RequestMapping("findUserByIds2")
public String findUserByIds2(List<Integer> id,Model model) {
model.addAttribute("msg", "接收到的參數(shù):"+id);
return "success";
}
@RequestMapping("findUserByIds3")
public String findUserByIds3(User user,Model model) {
model.addAttribute("msg", "接收到的參數(shù):"+user.getUid());
return "success";
}
public class User {
// 演示批量簡單類型參數(shù)接收
private List<Integer> uid = new ArrayList<>();
}
6.2 元素是POJO的類型或數(shù)組
-
注意
- 直接使用List集合或者數(shù)組作為形參,都會報(bào)錯。
- 必須使用POJO類型作為形參,并且該P(yáng)OJO類型擁有一個List集合屬性或者數(shù)組屬性。這種情況下List和數(shù)組都可以成功接收參數(shù)。
- 請求參數(shù)key和屬性名稱要一致。
-
請求參數(shù)
POST請求
<!-- 將request請求參數(shù),綁定到[元素是POJO類型的List集合或Map集合]參數(shù) -->
<form action="${pageContext.request.contextPath}/user/updateUser" method="post">
<!-- itemList[集合下標(biāo)]:集合下標(biāo)必須從0開始 -->
<!-- 輔助理解:先將name屬性封裝到一個Item對象中,再將該Item對象放入itemList集合的指定下標(biāo)處 -->
購買商品1名稱:<input type="text" name="itemList[0].name"><br />
購買商品1價(jià)格:<input type="text" name="itemList[0].price"><br />
購買商品2名稱:<input type="text" name="itemList[1].name"><br />
購買商品2價(jià)格:<input type="text" name="itemList[1].price"><br />
<input type="submit" value="保存">
</form>
GET請求
itemList[0].id=1&itemList[0].name=zhangsan&itemList[0].price=100&itemList[1].id=2&itemList[1].name=lisi&itemList[1].price=200
- Controller方法
@RequestMapping("updateUser")
public String updateUser(User user,Model model) {
model.addAttribute("msg", "接收到的參數(shù):"+user.getUid());
return "success";
}
public class User {
// 將request請求參數(shù),綁定到[元素是POJO類型的List集合]參數(shù)
private List<Item> itemList = new ArrayList<>();
}
6.3 Map集合
-
注意
- 需要使用POJO類型來接受,POJO類型中有一個Map類型的參數(shù)。
- Map類型的屬性和名稱,要求和請求參數(shù)[]前面的名稱一致。
- Map的key要唯一,value要求是一個POJO類型。
- 請求參數(shù)
itemMap['item1'].name=zhangsan&itemMap['item1'].price=100&itemMap['item2'].name=lisi&itemMap['item2'].price=200
- POJO
public class User {
// 將request請求參數(shù),綁定到[元素是POJO類型的Map集合]參數(shù)
private Map<String, Item> itemMap = new HashMap<>();
}
public class Item {
private Integer id;
private String name;
private Float price;
private String pic;
private Date createtime;
}
7. 文件類型
-
注意
JSP
form表單需要設(shè)置enctype=multipart/form-data
第三方依賴
commons-fileupload
commons-io
SpirngMVC的支持
MultipartResolver:解析文件類型的參數(shù),綁定到MultipartFile類型的參數(shù)中,需要在springmvc.xml配置
MultipartFile:通過該參數(shù),可以獲取文件數(shù)據(jù),包括文件名稱和文件內(nèi)容。
- 代碼配置
JSP
<!-- 文件類型參數(shù)綁定 -->
<form action="${pageContext.request.contextPath}/fileupload" method="post" enctype="multipart/form-data">
圖片:<input type="file" name="uploadFile" /><br />
<input type="submit" value="上傳" />
</form>
springmvc.xml
<!-- 配置多部件解析器 -->
<bean id="multipartResolver"
class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<!-- 限制上傳文件的大小,最大可以上傳多大,單位是字節(jié) -->
<property name="maxUploadSize" value="5000000"></property>
</bean>
Controller
@RequestMapping("fileupload")
public String findUserById(MultipartFile uploadFile,Model model) throws Exception {
//編寫文件上傳邏輯(mvc模式和三層結(jié)構(gòu)模式)
//三層模式:表現(xiàn)層(controller、action)、業(yè)務(wù)層(service、biz)、持久層(dao、mapper)
//MVC模式主要就是來解決表現(xiàn)層的問題的(原始的表現(xiàn)層是使用Servlet編寫,即編寫業(yè)務(wù)邏輯,又編寫視圖展示)
if(uploadFile != null){
System.out.println(uploadFile.getOriginalFilename());
//原始圖片名稱
String originalFilename = uploadFile.getOriginalFilename();
//如果沒有圖片名稱,則上傳不成功
if(originalFilename != null && originalFilename.length()>0)
{
//存放圖片的物理路徑
String picPath = "E:\\";
//獲取上傳文件的擴(kuò)展名
String extName = originalFilename.substring(originalFilename.lastIndexOf("."));
//新文件的名稱
String newFileName = UUID.randomUUID()+extName;
//新的文件
File newFile = new File(picPath+newFileName);
//把上傳的文件保存成一個新的文件
uploadFile.transferTo(newFile);
//同時需要把新的文件名更新到數(shù)據(jù)庫中
}
}
model.addAttribute("msg", "文件上傳成功");
return "success";
}