07SpringMVC請求&響應
響應資料
響應方式:頁面跳轉、回寫資料
-
頁面跳轉
-
直接返回字串: 返回字串和檢視解析器的前後綴拼接後跳轉
@RequestMapping("/test1") public String save(){ return "index.jsp"; }
-
通過ModelAndView物件返回(兩種實現方式)
@RequestMapping("/test1") public ModelAndView save1(){ /* Model模型:封裝資料 View檢視:展示資料 */ ModelAndView modelAndView = new ModelAndView(); // 設定模型資料 modelAndView.addObject("username", "Tom"); // 設定檢視頁面 modelAndView.setViewName("index.jsp") return modelAndView; } // 推薦方式,寫到引數中,spring框架會識別 @RequestMapping("/test2") public ModelAndView save2(ModelAndView modelAndView){ // 設定模型資料 modelAndView.addObject("username", "Tom"); // 設定檢視頁面 modelAndView.setViewName("index.jsp") return modelAndView; }
-
-
回寫資料
-
直接返回字串(web基礎階段,使用的是
resp.getWriter().print("hello world")
)- 加註解
@ResponseBody
@RequestMapping("/test3") public void save3(HttpServletResponse resp){ resp.getWriter().print("hello world"); } // 推薦方式, 加註解 @RequestMapping("/test4") @ResponseBody public String save4(){ return "hello world"; }
- 加註解
-
返回物件和集合(json資料)
@RequestMapping("/test5") @ResponseBody public String save5(){ User user = new User(); user.setUsername("Tom"); // json轉換工具 (匯入座標) OjbectMapper objectMapper = new ObjectMapper(); String json = objectMapper.writeValueAsString(user); return json; } // 推薦方式:springMVC自動轉換成json格式(需要配置spring-mvc.xml) @RequestMapping("/test6") @ResponseBody public User save6(){ User user = new User(); user.setUsername("Tom"); return user; } // 配置檔案:註解驅動,底層配置物件和json資料轉換 // 注意,需要新增mvc名稱空間 <mvc:annotation-driven/>
-
請求資料
客戶端請求引數的格式是:name=value&name=value...
伺服器會自動封裝資料,SpringMVC可以接收如下型別的引數:
- 基本型別
- POJO型別(簡單JavaBean)
- 陣列
- 集合
基本型別
訪問位址列引數和定義業務處理函式的引數一致即可
@RequestMapping("/test")
@ResponseBody
public void save(String username) {
System.out.println(username);
}
POJO
SpringMVC會自動把請求資料封裝到類,直接使用即可
@RequestMapping("/test")
@ResponseBody
public void save(User user) {
System.out.println(user.getName());
}
陣列
客戶端請求資料如果為陣列,格式為:xx=1&xx=2&xx=3...
@RequestMapping("/test")
@ResponseBody
public void save(String[] arr) {
System.out.println(Arrays.asList(arr));
}
集合
獲取集合時,要將集合封裝到一個POJO中(JavaBean中)。
class VO{
private List<User> userList;
public void setUserList(){}
public List<User> getUserList(){}
public void toString(){}
}
@RequestMapping("/test")
@ResponseBody
public void save(VO vo) {
System.out.println(vo);
}
如果使用ajax提交資料,指定json提交資料格式。那麼就就可以直接接受集合資料。(使用js時,需要指定靜態資源,下面再講)
@RequestMapping("/test")
@ResponseBody
public void save(@RequestBody List<User> userList) {
System.out.println(userList);
}
靜態資源訪問
靜態資源訪問和@RequestMapping("/xxx")
衝突,需要在web.xml開啟靜態資源訪問。
<!--js檔案-->
<mvc:resources mapping="/js/**" location="/js/"/>
<!--img檔案-->
<mvc:resources mapping="/img/**" location="/img/"/>
或者使用如下配置,表示如果SpringMVC找不到對應資源,就交給原始容器Tomcat,Tomcat可以找到靜態資源。
<mvc:default-servlet-handler>
請求資料亂碼
當post請求資料時,資料可能會出現亂碼,我們可以在web.xml中設定一個過濾器來進行編碼的過濾。
<!-- 過濾器:全域性資料的編碼設定-->
<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
,它的引數有:
- value:與請求引數名稱相同
- required:是否 必須包含指定引數,預設是
- defaultValue:當沒有指定引數時,使用這個預設值
@RequestMapping("/test")
@ResponseBody
public void save(@RequestParam("name") String username) {
System.out.println(username);
}
獲取Restful風格的引數
Restful風格是一種架構風格、設計風格,不是標準,是一種設計原則和約束條件。主要用於客戶端伺服器互動軟體,這個風格設計的軟體可以更簡潔,更有層次,更易於實現快取機制等。
Restful風格的請求是使用"url+請求方式"表示一次請求目的,HTTP協議裡面四個表示操作方式的動詞如下:
- GET :獲取資源
- POST:新建資源
- PUT:更新資源
- DELETE:刪除資源
例如 :
- /user/1 GET:獲取id=1的user
- /user/1 DELETE:刪除id=1的user
在SpringMVC中,獲取Restful風格引數就是使用佔位符和註解@PathVariable
。
如,獲取變數name的值。http://localhost:80/user/zhangsan
@RequestMapping("/user/{name}")
@ResponseBody
public void save(@PathVariable("name") String username) {
System.out.println(username);
}
自定義型別轉換器
因為請求的都是字串,所以SpringMVC提供了一些常用的型別轉換器,如字串轉成int。但是還有一些如日期,它的資料格式多樣,此時就需要自定義型別轉換器。
步驟:
-
定義轉換器類實現Converter介面
public class DateConverter implements Converter<String, Date> { @Override public Date convert(String source) { SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd"); Date date = format.parse(source); return date; } }
-
在sprin-mvc.xml配置檔案中宣告轉換器
<!-- 宣告轉換器--> <bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean"> <property name="converters"> <list> <bean class="baidu.controller.DateConverter"/> </list> </property> </bean>
-
在sping-mvc.xml配置檔案中:使用
<annotation-driven>
引用轉換器<!-- mvc的註解驅動--> <mvc:annotation-driven conversion-service="conversionService"/>
獲取請求頭
@RequestHeader
獲取請求頭,如:獲取請求頭並列印。
@RequestMapping("/test")
@ResponseBody
public void save(@RequestHeader(value = "User-Agent", required = false) String user) {
System.out.println(user);
}
直接獲取請求頭中的Cookie,可以使用@CookieValue
獲取指定Cookie的值
@RequestMapping("/test")
@ResponseBody
public void save(@CookieValue(value = "MyCookieId", required = false) String cookie) {
System.out.println(cookie);
}