Day10註解(Annotation)和反射(Reflection)
SpringMVC的資料響應
springmvc的資料響應分為兩種方式:
- 頁面跳轉
- 回寫資料
頁面跳轉
1. 返回字串形式
直接返回字串:此方式會將返回的字串和檢視解析器的前後綴拼接然後跳轉。
@RequestMapping("/success")
public String success(){
return "success";
}
<property name="prefix" value="/jsp/" />
<property name="suffix" value=".jsp" />
若有上面的檢視解析器配置,則轉發的資源地址就是 /jsp/success.jsp
2. 返回ModelAndView物件
// 返回ModelAndView @RequestMapping("/success2") public ModelAndView print_test2(){ /** * model 模型用來封裝資料 * view 檢視用來展示檢視 */ ModelAndView model_view = new ModelAndView(); // 設定模型資料(鍵值對) model_view.addObject("name","sjj"); // 設定檢視名稱 model_view.setViewName("success"); return model_view; }
此時我們可以將封裝的資料顯示在success.jsp中
<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
<html>
<head>
<title>測試</title>
</head>
<body>
<h1>成功 --- ${name}</h1>
</body>
</html>
這樣訪問 /success2
就能看見封裝的資料了
當然你也可以將ModelAndView物件作為引數,SpringMVC會自動為你建立物件
// 返回ModelAndView2
@RequestMapping("/success3")
public ModelAndView print_test3(ModelAndView model_view){
// 設定模型資料(鍵值對)
model_view.addObject("name","sjj2");
// 設定檢視名稱
model_view.setViewName("success");
return model_view;
}
回寫資料
1. 回寫字串
// 字串回寫
@ResponseBody // 告訴SpringMVC是回寫資料而不是跳轉頁面
@RequestMapping("/success4")
public String writeFun(HttpServletResponse response) {
return "hello world";
}
當然,在實際的開發過程中我們回返回更有用的字串如json格式的字串
這時候我們可以匯入jackson相應的包來輔助開發
2. 返回物件
準備一個實體User類
package com.sjj.domain;
import org.springframework.stereotype.Component;
@Component("user")
public class User {
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
編寫返回User物件的方法
@ResponseBody
@RequestMapping("/success5")
public User writeFun2(User user) {
user.setName("sjj");
user.setAge(19);
return user;
}
我們希望SpringMVC能自動幫我們把類轉為json型別的字串,因此需要在spring-mvc.xml中配置處理器對映器
先在pom.xml中匯入依賴
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.9.10</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.10</version>
</dependency>
然後編寫處理器對映器
<!--處理器對映器-->
<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>
有更簡潔的配置方式
<!--註解驅動-->
<mvc:annotation-driven />
SpringMVC的請求資料
眾所周知客戶端請求引數的格式是 name1=value1&name2=value2...
伺服器要獲得請求的引數,有時需要進行資料的封裝,SpringMVC可以接收如下引數:
- 基本型別引數
- POJO型別引數
- 陣列型別引數
獲得基本型別引數
Controller中業務方法的引數名稱要與請求引數的name一致,引數值回自動對映匹配
@ResponseBody
@RequestMapping("/success6")
public void printRequest(String name,int age) {
System.out.println(name);
System.out.println(age);
}
我們訪問 http://localhost:8080/success6?name=sjj&age=19
會發現控制檯返回了字串sjj和整型19的基本型別資料
獲得POJO型別引數
我們仍然是以上面的User類和訪問的http://localhost:8080/success7?name=sjj&age=19
為例,只不過我們只需要把接收的引數改為User
@ResponseBody
@RequestMapping("/success7")
public void printRequest2(User user) {
System.out.println(user);
}
記得寫toString方法更直觀哦
獲得陣列型別引數
只要是name一致,陣列也是可以接收的,比如這次我們訪問 http://localhost:8080/success8?lis=1&lis=2&lis=3
@ResponseBody
@RequestMapping("/success8")
public void printRequest3(String[] lis ) {
System.out.println(Arrays.toString(lis));
}
獲得集合型別引數
當使用ajax提交時,可以提交contentType為json格式,那麼在方法引數位置使用RequestMapping可以直接接收請求資料而無需進行POJO封裝
先在spring-mvc.xml中開啟靜態資源訪問
<!--開放靜態資源訪問-->
<mvc:resources mapping="/js/**" location="/js/" />
<!--或者是交給原始容器來找靜態資源-->
<mvc:default-servlet-handler />
例如我們有這樣一個頁面,訪問時為 http://localhost:8080/jsp/ajax.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
<html>
<head>
<title>ajax</title>
<script type="text/javascript" src="${pageContext.request.contextPath}/js/jquery-3.2.1.min.js"></script>
<script>
const userList = [];
userList.push({name:"小A",age:18});
userList.push({name:"小B",age:19});
$.ajax({
type:"POST",
url:"${pageContext.request.contextPath}/success10",
data:JSON.stringify(userList),
contentType:"application/json;charset=utf-8"
})
</script>
</head>
<body>
</body>
</html>
對應的返回方法是
@ResponseBody
@RequestMapping("/success10")
public void printRequest5(@RequestBody List<User> userList) {
System.out.println(userList.toString());
}