1 SpringMVC數據響應
1.1 SpringMVC數據響應的方式
- 頁面跳轉
直接返回字符串
通過ModelAndView
對象返回 - 回寫數據
直接返回字符串
返回對象或集合
1.2 SpringMVC的數據響應-頁面跳轉-返回字符串形式
1.3 SpringMVC的數據響應-頁面跳轉-返回ModelAndView形式1
在Controller
中的方法中返回ModelAndVIew
對象,並且設置視圖名稱
@RequestMapping(value="/quick2")
public ModelAndView save2(){
/*
Model:模型 作用封裝數據
View:視圖 作用展示數據
*/
ModelAndView modelAndView = new ModelAndView();
modelAndView.addObject("username","ldy"); //設置模型數據
modelAndView.setViewName("success"); //設置視圖名稱
return modelAndView;
}
1.4 SpringMVC的數據響應-頁面跳轉-返回ModelAndView形式2
在Controller
中的方法形參上直接聲明ModelAndView
,無需在方法中創建,在方法中直接使用該對象設置視圖,同樣可以跳轉頁面。
@RequestMapping(value="/quick3")
public ModelAndView save3(ModelAndView modelAndView){
modelAndView.addObject("username","ldy");
modelAndView.setViewName("success");
return modelAndView;
}
@RequestMapping(value="/quick4")
public String save4(Model model){
model.addAttribute("username","江西財經");
return "success";
}
1.5 SpringMVC的數據響應-頁面跳轉-返回ModelAndView3
在Controller
方法的形參上可以直接使用原生的HttpServletRequest
對象,只需聲明即可
@RequestMapping(value="/quick5")
public String save5(HttpServletRequest request){
request.setAttribute("username","酷丁魚");
return "success";
}
1.6 SpringMVC的數據響應-回寫數據-直接回寫字符串
通過SpringMVC
框架注入的response
對象,使用response.getWriter().print("Hello World!")
回寫數據,此時不需要視圖跳轉,業務方法返回void
。
將需要回寫的字符串直接返回,但此時需要通過@ResponseBody
註解告知Spring框架,方法返回的字符串不是跳轉,而是直接在http響應體中返回。
@RequestMapping(value="/quick7")
@ResponseBody //告知SpringMVC框架 不進行視圖跳轉 直接進行數據響應
public String save7() throws IOException {
return "hello jxufe";
}
@RequestMapping(value="/quick6")
public void save6(HttpServletResponse response) throws IOException {
response.getWriter().print("hello rjywlwxy");
}
1.7 SpringMVC的數據響應-回寫數據-直接回寫json格式字符串
@RequestMapping(value="/quick8")
@ResponseBody
public String save8() throws IOException {
return "{\"username\":\"zhangsan\",\"age\":18}";
}
手動拼接json
格式字符串的方式很麻煩,開發中往往需要將複雜的java對象轉換成json格式的字符串,我們可以使用json格式轉換工具jackson進行轉換,通過jackson轉換json格式字符串,回寫字符串。
@RequestMapping(value="/quick9")
@ResponseBody
public String save9() throws IOException {
User user = new User();
user.setUsername("lisi");
user.setAge(30);
//使用json的轉換工具將對象轉換成json格式字符串在返回
ObjectMapper objectMapper = new ObjectMapper();
String json = objectMapper.writeValueAsString(user);
return json;
}
1.8 SpringMVC的數據響應-回寫數據-返回對象或集合
通過SpringMVC幫助我們對對象或集合進行json字符串的轉換並寫回,爲處理器適配器配置消息轉換參數,指定使用jackson進行對象或集合的轉換,因此需要在spring-mvc.xml
中進行如下配置:
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
<property name="messageConverters">
<list>
<bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"/>
</list>
</property>
</bean>
@RequestMapping(value="/quick10")
@ResponseBody
//期望SpringMVC自動將User轉換成json格式的字符串
public User save10() throws IOException {
User user = new User();
user.setUsername("lisi2");
user.setAge(32);
return user;
}
1.9 SpringMVC的數據響應-回寫數據-返回對象或集合2
在方法上添加@ResponseBody
就可以返回json格式的字符串,但是這樣配置起來比較麻煩,配置的代碼比較多,因此,我們可以使用mvc註解驅動
代替上述配置。
<mvc:annotation-driven/>
在SpringMVC各個組件中,處理器映射器、處理器適配器、視圖解析器被稱爲SpringMVC的三大組件。使用<mvc:annotation-driven/>
自動加載RequestMappingHandlerMapping
處理器映射器和RequestMappingHandlerAdapter
處理器適配器,可以在spring-mvc.xml
配置文件中使用<mvc:annotation-driven/>
替代註解處理器和適配器的配置,同時使用<mvc:annotation-driven/>
默認底層就會集成jackson進行對象或集合的json格式字符串轉換。
2 SpringMVC請求
2.1 SpringMVC的請求-獲得請求參數-請求參數類型
客戶端請求參數的格式是:name=value&name=value......
,服務器端要獲得請求的參數,有事還需要進行數據的封裝,SpringMVC可以接受如下類型的參數:
基本類型參數
POJO類型參數
數組類型參數
集合類型參數
2.2 SpringMVC的請求-獲得請求參數-獲得基本類型參數
Controller中的業務方法的參數名稱要與請求參數的name一致,參數值會自動映射配置,並且能夠自動做類型轉換。
自動類型轉換是指從Spring向其他類型轉換
http://localhost:8080/ldy_springmvc/quick9?username=zhangsan&age=12
@RequestMapping(value="/quick11")
@ResponseBody
public void save11(String username,int age) throws IOException {
System.out.println(username);
System.out.println(age);
}
2.3 SpringMVC的請求-獲得請求參數-獲得POJO類型參數
Controller中的業務方法的POJO參數的屬性名與請求參數的name一致,參數值會自動映射匹配。
public class User {
private String username;
private int age;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "User{" +
"username='" + username + '\'' +
", age=" + age +
'}';
}
}
@RequestMapping(value="/quick12")
@ResponseBody
public void save12(User user) throws IOException {
System.out.println(user);
}
2.4 SpringMVC的請求-獲得請求參數-獲得數組類型參數
Controller中的業務方法數組名稱與請求參數的name一致,參數值會自動映射。
@RequestMapping(value="/quick13")
@ResponseBody
public void save13(String[] strs) throws IOException {
System.out.println(Arrays.asList(strs));
}
2.5 SpringMVC的請求-獲得請求參數-獲得集合類型參數1
獲得集合參數時,要將集合參數包裝到一個POJO中纔可以。
<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>
import java.util.List;
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 +
'}';
}
}
@RequestMapping(value="/quick14")
@ResponseBody
public void save14(VO vo) throws IOException {
System.out.println(vo);
}
2.6 SpringMVC的請求-獲得請求參數-獲得集合類型參數2
當使用ajax提交時,可以指定contentType爲json形式,那麼在方法參數位置使用@RequestBody可以直接接收集合數據而無需使用POJO進行包裝
<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>
@RequestMapping(value="/quick15")
@ResponseBody
public void save15(@RequestBody List<User> userList) throws IOException {
System.out.println(userList);
}
2.7 SpringMVC的請求-獲得請求參數-靜態資源訪問的開啓
當有靜態資源需要加載時,比如jquery文件,通過谷歌開發者工具抓包發現,沒有加載到jquery文件,原因是SpringMVC的前端控制器DispatcherServlet的url-pattern配置的是/
,代表對所有的資源都進行過濾操作,我們可以通過以下兩種方式指定放行靜態資源:
-
在
spring-mvc.xml
配置文件中指定放行的資源<mvc:resources mapping="/js/**"location="/js/"/>
-
使用
<mvc:default-servlet-handler/>
標籤
<!--開發資源的訪問-->
<!--
<mvc:resources mapping="/js/**" location="/js/"/>
<mvc:resources mapping="/img/**" location="/img/"/>
-->
<mvc:default-servlet-handler/>
2.8 SpringMVC的請求-獲得請求參數-配置全局亂碼過濾器
當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>
2.9 SpringMVC的請求-獲得請求參數-參數綁定註解@RequestParam
當請求的參數名稱與Controller的業務方法參數名稱不一致時,就需要通過@RequestParam註解顯示的綁定
<form action="${pageContext.request.contextPath}/quick16" method="post">
<input type="text" name="name"><br>
<input type="submit" value="提交"><br>
</form>
@RequestMapping(value="/quick16")
@ResponseBody
public void save16(@RequestParam(value="name",required = false,defaultValue = "jxufe") String username) throws IOException {
System.out.println(username);
}
2.10 SpringMVC的請求-獲得請求參數-Restful風格的參數的獲取
Restful是一種軟件架構風格、設計風格,而不是標準,只是提供了一組設計原則和約束條件。主要用於客戶端和服務器交互類的軟件,基於這個風格設計的軟件可以更簡潔,更有層次,更易於實現緩存機制等。
Restful風格的請求是使用“url+請求方式”表示一次請求目的的,HTTP 協議裏面四個表示操作方式的動詞如下:
GET:用於獲取資源
POST:用於新建資源
PUT:用於更新資源
DELETE:用於刪除資源
例如:
/user/1 GET : 得到 id = 1 的 user
/user/1 DELETE: 刪除 id = 1 的 user
/user/1 PUT: 更新 id = 1 的 user
/user POST: 新增 user
上述url地址/user/1
中的1就是要獲得的請求參數,在SpringMVC中可以使用佔位符進行參數綁定。地址/user/1可以寫成/user/{id}
,佔位符{id}
對應的就是1
的值。在業務方法中我們可以使用@PathVariable
註解進行佔位符的匹配獲取工作。
http://localhost:8080/ldy_springmvc/quick17/zhangsan
@RequestMapping(value="/quick17/{name}")
@ResponseBody
public void save17(@PathVariable(value="name") String username) throws IOException {
System.out.println(username);
}
2.11 SpringMVC的請求-獲得請求參數-自定義類型轉換器
SpringMVC 默認已經提供了一些常用的類型轉換器,例如客戶端提交的字符串轉換成int型進行參數設置。
但是不是所有的數據類型都提供了轉換器,沒有提供的就需要自定義轉換器,例如:日期類型的數據就需要自定義轉換器。
public class DateConverter implements Converter<String, Date> {
public Date convert(String dateStr) {
//將日期字符串轉換成日期對象 返回
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
Date date = null;
try {
date = format.parse(dateStr);
} catch (ParseException e) {
e.printStackTrace();
}
return date;
}
}
@RequestMapping(value="/quick18")
@ResponseBody
public void save18(Date date) throws IOException {
System.out.println(date);
}