文章目錄
- 1. 獲得請求引數
- 2. 獲得基本型別引數
- 3. 獲得POJO型別引數
- 4. 獲得陣列型別引數
- 5. 獲得集合型別引數
- 6. 請求資料亂碼問題
- 7. 引數系結注解 @requestParam
- 8. 獲得Restful風格的引數
- 9. 自定義型別轉換器
- 10. 獲得Servlet相關API
- 11. 獲得請求頭
- 11.1 @RequestHeader
- 11.2 @CookieValue
- 12. 檔案上傳
- 12.1 檔案上傳客戶端三要素
- 12.2 檔案上傳原理
- 12.3 單檔案上傳步驟
- 12.4 多檔案上傳實作
- 13. 知識要點
1. 獲得請求引數
- 客戶端請求引數的格式是:
name=value&name=value… … - 服務器端要獲得請求的引數,有時還需要進行資料的封裝,SpringMVC可以接收如下型別的引數:
- 基本型別引數
- POJO型別引數
- 陣列型別引數
- 集合型別引數
2. 獲得基本型別引數
- Controller中的業務方法的引數名稱要與請求引數的name一致,引數值會自動映射匹配,

- 訪問:
http://localhost:8080/xdr630_spring_mvc_war_exploded/user/quick11?username=xdr&age=23 - 控制臺列印輸出:

3. 獲得POJO型別引數
- Controller中的業務方法的POJO引數的屬性名與請求引數的name一致,引數值會自動映射匹配,



4. 獲得陣列型別引數
- Controller中的業務方法陣列名稱與請求引數的name一致,引數值會自動映射匹配,



5. 獲得集合型別引數
- 獲得集合引數時,要將集合引數包裝到一個
POJO中才可以, - 把集合包裝到 POJO 物件當中
- 創建 VO (valueobject),封裝視圖的物件
public class VO {
private List<User> userList;
public List<User> getUserList() {
return userList;
}
public void setUserList(List<User> userList) {
this.userList = userList;
}
@Override
public String toString() {
return "VO{" +
"userList=" + userList +
'}';
}
}
- 創建jsp表單
<form action="${pageContext.request.contextPath}/user/quick14" method="post">
<%--表明是第幾個User物件的username age--%>
<input type="text" name="userList[0].username"><br>
<input type="text" name="userList[0].age"><br>
<input type="text" name="userList[1].username"><br>
<input type="text" name="userList[1].age"><br>
<input type="submit" value="提交">
</form>



-
當使用ajax提交時,可以指定
contentType為json形式,那么在方法引數位置使用@RequestBody可以直接接收集合資料而無需使用POJO進行包裝, -
創建 ajax.jsp
<script src="${pageContext.request.contextPath}/js/jquery-3.3.1.js"></script>
<script>
var userList = new Array();
userList.push({username:"zhangsan",age:18});
userList.push({username:"lisi",age:28});
$.ajax({
type:"POST",
url:"${pageContext.request.contextPath}/user/quick15",
data:JSON.stringify(userList),
contentType:"application/json;charset=utf-8"
});
</script>
- 加入組態檔
<!--開放對資源的訪問權限-->
<mvc:resources mapping="/js/**" location="/js/"/>
或
- 把原始的資料交給 Tomcat 找到資源
<mvc:default-servlet-handler/>



- 注意:通過谷歌開發者工具抓包發現,沒有加載到jquery檔案,原因是SpringMVC的前端控制器DispatcherServlet的
url-pattern配置的是/,代表對所有的資源都進行過濾操作,可以通過以下兩種方式指定放行靜態資源: - 在
spring-mvc.xml組態檔中指定放行的資源
<mvc:resources mapping="/js/**" location="/js/"/>
或
<mvc:default-servlet-handler/>
6. 請求資料亂碼問題
- 當
post請求時,資料會出現亂碼,可以設定一個過濾器來進行編碼的過濾,



<!--配置全域過濾的filter-->
<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>
</filter>
<filter-mapping>
<filter-name>CharacterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
- 再次運行:

7. 引數系結注解 @requestParam



- 當給的引數名與請求的引數名不一致時就為
null


- 這個時候就需要使用 @RequestParameter
- 當請求的引數名稱與
Controller的業務方法引數名稱不一致時,就需要通過@RequestParam注解顯示的系結, - 將請求的
name引數映射到username引數上



注解@RequestParam還有如下引數可以使用:
value:與請求引數名稱required:此在指定的請求引數是否必須包括,默認是true,提交時如果沒有此引數則報錯





defaultValue:當沒有指定請求引數時,則使用指定的默認值賦值



8. 獲得Restful風格的引數
- Restful是一種軟體架構風格、設計風格,而不是標準,只是提供了一組設計原則和約束條件,主要用于客戶端和服務器互動類的軟體,基于這個風格設計的軟體可以更簡潔,更有層次,更易于實作快取機制等,
- Restful風格的請求是使用“
url+請求方式”表示一次請求目的的,HTTP 協議里面四個表示操作方式的動詞如下:
GET:用于獲取資源POST:用于新建資源PUT:用于更新資源DELETE:用于洗掉資源
- 例如:

- 上述
url地址/user/1中的1就是要獲得的請求引數,在SpringMVC中可以使用占位符進行引數系結,地址/user/1可以寫成/user/{id},占位符{id}對應的就是1的值,在業務方法中我們可以使用@PathVariable注解進行占位符的匹配獲取作業,

- 訪問:


9. 自定義型別轉換器
-
SpringMVC 默認已經提供了一些常用的型別轉換器,例如客戶端提交的字串轉換成
int型進行引數設定, -
但是不是所有的資料型別都提供了轉換器,沒有提供的就需要自定義轉換器,例如:日期型別的資料就需要自定義轉換器,
-
時間格式不匹配


-
自定義型別轉換器的開發步驟:
- 定義轉換器類實作
Converter介面

public class DateConverter implements Converter<String,Date> {
@Override
public Date convert(String dataStr) {
//將日期的字串轉成日期物件 回傳
Date date = null;
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM:dd");
try {
date = format.parse(dataStr);
} catch (ParseException e) {
e.printStackTrace();
}
return date ;
}
}
- 在組態檔中宣告轉換器
<!--宣告轉換器-->
<bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean">
<property name="converters">
<list>
<bean class="com.xdr630.coverter.DateConverter"></bean>
</list>
</property>
</bean>
- 在
<annotation-driven>中參考轉換器
<!--mvc注解驅動-->
<mvc:annotation-driven conversion-service="conversionService"/>
-
再次訪問:

-
控制臺查看:

10. 獲得Servlet相關API
SpringMVC支持使用原始ServletAPI物件作為控制器方法的引數進行注入,常用的物件如下:
- HttpServletRequest
- HttpServletResponse
- HttpSession



11. 獲得請求頭
11.1 @RequestHeader
- 使用
@RequestHeader可以獲得請求頭資訊,相當于web階段學習的request.getHeader(name)
@RequestHeader注解的屬性如下:
value:請求頭的名稱required:是否必須攜帶此請求頭


- 控制臺:

11.2 @CookieValue
- 使用
@CookieValue可以獲得指定Cookie的值 @CookieValue注解的屬性如下:
value:指定cookie的名稱required:是否必須攜帶此cookie



- 控制臺:

12. 檔案上傳
12.1 檔案上傳客戶端三要素
- 表單項
type=“file” - 表單的提交方式是
post - 表單的
enctype屬性是多部分表單形式,及enctype=“multipart/form-data”


12.2 檔案上傳原理
- 當form表單修改為多部分表單時,
request.getParameter()將失效, enctype=“application/x-www-form-urlencoded”時,form表單的正文內容格式是:key=value&key=value&key=value- 當form表單的
enctype取值為Mutilpart/form-data時,請求正文內容就變成多部分形式:

12.3 單檔案上傳步驟
- 匯入
fileupload和io坐標
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.1</version>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.4</version>
</dependency>
- 組態檔上傳決議器
<!--組態檔上傳決議器-->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<!--上傳檔案總大小-->
<property name="maxUploadSize" value="5242800"/>
<!--上傳單個檔案的大小-->
<property name="maxUploadSizePerFile" value="5242800"/>
<!--上傳檔案的編碼型別-->
<property name="defaultEncoding" value="UTF-8"/>
</bean>
- 撰寫檔案上傳代碼

-
測驗:

-
控制臺:

-
把檔案進行保存




-
控制臺:

-
查看保存的路徑

12.4 多檔案上傳實作
- 多檔案上傳,只需要將頁面修改為多個檔案上傳項,將方法引數
MultipartFile型別修改為MultipartFile[]即可





13. 知識要點
MVC實作資料請求方式
- 基本型別引數
- POJO型別引數
- 陣列型別引數
- 集合型別引數
MVC獲取資料細節
- 中文亂碼問題
- @RequestParam 和 @PathVariable
- 自定義型別轉換器
- 獲得Servlet相關API
- @RequestHeader 和 @CookieValue
- 檔案上傳
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/348359.html
標籤:java
上一篇:Sequential And Linked Lists - 順序表 和 鏈表 - 順序表部分 - java
下一篇:Java基礎“容器集合“
