SpringMVC的資料響應
SpringMVC的資料響應方式
1, 頁面跳轉
直接返回字串
通過ModelAndView物件返回
2) 回寫資料
直接返回字串
返回物件或集合
頁面跳轉
2. 返回ModelAndView物件
3. 向request域儲存資料
② 通過ModelAndView的 addObject() 方法設定
回寫資料
1. 直接返回字串
Web基礎階段,客戶端訪問伺服器端,如果想直接回寫字串作為響應體返回的話,只需要使用
response.getWriter().print(“hello world”) 即可,那麼在Controller中想直接回寫字串該怎樣呢?
① 通過SpringMVC框架注入的response物件,使用response.getWriter().print(“hello world”) 回寫數
據,此時不需要檢視跳轉,業務方法返回值為void。
② 將需要回寫的字串直接返回,但此時需要通過@ResponseBody註解告知SpringMVC框架,方法
返回的字串不是跳轉是直接在http響應體中返回。
@RequestMapping(value = "/quick6" ) @ResponseBody //告知springmvc框架 不進行檢視跳轉 直接進行資料響應 public String save6(HttpServletResponse response) throws IOException { return "hello study06!"; }
在非同步專案中,客戶端與伺服器端往往要進行json格式字串互動,此時我們可以手動拼接json字串返回。
@RequestMapping(value = "/quick7" )
@ResponseBody
public String save7() {
return "{\"username\":\"zhangsan\",\"age\":18}";
}
上述方式手動拼接json格式字串的方式很麻煩,開發中往往要將複雜的java物件轉換成json格式的字串,
我們可以使用web階段學習過的json轉換工具jackson進行轉換,匯入jackson座標
<!--jackson--> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-core</artifactId> <version>2.9.0</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.9.0</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-annotations</artifactId> <version>2.9.0</version> </dependency>
通過jackson轉換json格式字串,回寫字串。
@RequestMapping(value = "/quick8" )
@ResponseBody
public String save8() throws JsonProcessingException {
User user=new User();
user.setUsername("lisi");
user.setAge(30);
//使用json轉換工具 將物件轉換成json格式的字串返回
ObjectMapper objectMapper = new ObjectMapper();
String json = objectMapper.writeValueAsString(user);
return json;
}
通過SpringMVC幫助我們對物件或集合進行json字串的轉換並回寫,為處理器介面卡配置訊息轉換引數,
指定使用jackson進行物件或集合的轉換,因此需要在spring-mvc.xml中進行如下配置:
<!--配置處理器對映器-->
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
<property name="messageConverters">
<list>
<!--json的轉換器 MappingJackson2HttpMessageConverter -->
<bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"></bean>
</list>
</property>
</bean>
返回物件或集合
@RequestMapping(value = "/quick9" )
@ResponseBody
//期望SpringMVC自動將User轉換成json格式的字串---------》spring-mvc.xml中配置介面卡
public User save9() throws JsonProcessingException {
User user=new User();
user.setUsername("wangwu");
user.setAge(30);
return user;
}
2. 返回物件或集合
在方法上新增@ResponseBody就可以返回json格式的字串,但是這樣配置比較麻煩,配置的程式碼比較多,
因此,我們可以使用mvc的註解驅動代替上述配置。
<!--mvc的註解驅動-->
<mvc:annotation-driven/>
在 SpringMVC 的各個元件中,處理器對映器、處理器介面卡、檢視解析器稱為 SpringMVC 的三大元件。
使用<mvc:annotation-driven>自動載入 RequestMappingHandlerMapping(處理對映器)和
RequestMappingHandlerAdapter( 處 理 適 配 器 ),可用在Spring-xml.xml配置檔案中使用
<mvc:annotation-driven>替代註解處理器和介面卡的配置。
同時使用<mvc:annotation-driven>預設底層就會整合jackson進行物件或集合的json格式字串的轉換。
SpringMVC 獲得請求資料
客戶端請求引數的格式是:name=value&name=value… …
伺服器端要獲得請求的引數,有時還需要進行資料的封裝,SpringMVC可以接收如下型別的引數:
基本型別引數
POJO型別引數
陣列型別引數
集合型別引數
獲得基本型別引數
Controller中的業務方法的引數名稱要與請求引數的name一致,引數值會自動對映匹配。
獲得POJO型別引數
Controller中的業務方法的POJO引數的屬性名與請求引數的name一致,引數值會自動對映匹配
獲得陣列型別引數
Controller中的業務方法陣列名稱與請求引數的name一致,引數值會自動對映匹配。
獲得集合型別引數
public class User {
private String username;
private int age;
public String getUsername() {
return username;
}
public class Vo {
private List<User> userList;
public List<User> getUserList() {
return userList;
}
@RequestMapping(value = "/quick14")
@ResponseBody
public void save14(Vo vo){
System.out.println(vo);
}
<form action="${pageContext.request.contextPath}/user/quick14" method="post">
<%--表明是第一個User物件的username age--%>
<input type="text" name="userList[0].username"><br/> <%--userLiset集合第一個user物件的 username--%>
<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">
</form>
請求資料亂碼問題
當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>
引數繫結註解@requestParam
當請求的引數名稱與Controller的業務方法引數名稱不一致時,就需要通過@RequestParam註解顯示的繫結
@RequestMapping(value = "/quick16" )
@ResponseBody //localhost:8080/study_spring_mvc/user/quick16?username=zhangsan
//localhost:8080/study_spring_mvc/user/quick16?name=zhangsan
public void save10(@RequestParam(value="name",required = false,defaultValue = "哈哈哈哈") String username) {
System.out.println(username); // @RequestParam
//value:與請求引數名稱
// required:此在指定的請求引數是否必須包括,預設是true,提交時如果沒有此引數則報錯
//defaultValue:當沒有指定請求引數時,則使用指定的預設值賦值
}
獲得請求頭
@RequestHeader 使用@RequestHeader可以獲得請求頭資訊,相當於web階段學習的request.getHeader(name)
value:請求頭的名稱
required:是否必須攜帶此請求頭
@CookieValue
@RequestMapping(value = "/quick18" )
@ResponseBody //@CookieValue 獲取Cookie頭
public void save18(@CookieValue(value = "JSESSIONID") String jsessionId) {
System.out.println(jsessionId);
}
檔案上傳
表單項type=“file”
表單的提交方式是post
表單的enctype屬性是多部分表單形式,及enctype=“multipart/form-data”
單檔案上傳步驟
① 匯入fileupload和io座標
② 配置檔案上傳解析器
③ 編寫檔案上傳程式碼
匯入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.3</version>
</dependency>
配置檔案上傳解析器
單檔案上傳實現
<form action="${pageContext.request.contextPath}/user/quick22" method="post" enctype="multipart/form-data">
名稱<input type="text" name="name"><br/>
檔案<input type="file" name="uploadFile"><br/>
<input type="submit" value="提交">
</form>
@RequestMapping(value = "/quick22" )
@ResponseBody // uploadFile名稱要和 form表單 檔案上傳的 name值一樣
public void save22(String name, MultipartFile uploadFile) throws IOException {
System.out.println(name);
//獲得檔案上傳名稱
String originalFilename = uploadFile.getOriginalFilename();
//儲存檔案
uploadFile.transferTo(new File("F:\\upload\\"+originalFilename));
}
多檔案上傳實現
多檔案上傳,只需要將頁面修改為多個檔案上傳項,將方法引數MultipartFile型別修改為MultipartFile[]即可