※Maven、Gradle
def jacksonVer = '2.9.3' compile group: 'com.fasterxml.jackson.core', name: 'jackson-databind', version: "${jacksonVer}" compile group: 'com.fasterxml.jackson.core', name: 'jackson-annotations', version: "${jacksonVer}" // compile group: 'com.fasterxml.jackson.core', name: 'jackson-core', version: "${jacksonVer}" ------------------------------------------------------- <properties> <jacksonVer>2.9.3</jacksonVer> </properties> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>${jacksonVer}</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-annotations</artifactId> <version>${jacksonVer}</version> </dependency> <!-- <dependency> --> <!-- <groupId>com.fasterxml.jackson.core</groupId> --> <!-- <artifactId>jackson-core</artifactId> --> <!-- <version>${jacksonVer}</version> --> <!-- </dependency> -->
※使用 @ResponseBody、@RequestBody 註解,不用下載這些 jar 包,還是 import 的到,但是只要其中一包沒下到,執行時都會出 406
※下載 jackson-databind 就會將 3 包都一起下載了,但 jackson-annotations 居然只有 2.9.0,所以我才將 jackson-annotations 加進去
※spring 設定檔
<mvc:default-servlet-handler /> <mvc:annotation-driven />
※一定要加 annotation-driven,不然執行時也會出 406
※default-servlet-handler 視情況加,第四篇有說明
※@ResponseBody
1.將資料轉成 JSON 後,回傳給客戶端2.只能寫在方法上
※java bean
public class Book { private Integer id; private String name; private Integer price; private Date date; // setter/getter... public Book() {} public Book(Integer id, String name, Integer price) { this.id = id; this.name = name; this.price = price; } }
※注意建構子我沒加 date
※controller
@RequestMapping("resBody") @ResponseBody public List<Book> json() { List<Book> list = new ArrayList<>(); list.add(new Book(1, "七龍珠", 50)); list.add(new Book(2, "寶島少年", 80)); list.add(new Book(3, "尼羅河的女兒", 70)); return list; }
※不加 @ResponseBody,呼叫時會出 404
※測試
$(_ => { $("#btn").click(_ => { $.ajax({ url:"ooo/xxx/resBody.mvc", dataType:"json", contentType:"application/json", success:function(data){ for(d of data){ console.info(d.id, d.name, d.price); console.info("--------------------"); } } }); }); }); -------------------- <input id="btn" type="button" value="click me" />
※結果會發現不加的 date 也會出現,是null
※@RequestBody
1.前端傳集合過來,可使用這個標籤來接2.使用時一定要用 POST,否則會出 400
3.只能寫在參數裡
※controller
@ResponseBody @RequestMapping(value = "reqBody", method = RequestMethod.POST) public List<Book> json(@RequestBody List<Book> listBook) { for (Book b : listBook) { System.out.println(b.getId()); System.out.println(b.getName()); System.out.println(b.getPrice()); System.out.println("----------"); } return listBook; }
※此功能是前端傳集合過來,然後又傳回給客戶端
※@ResponseBody 一定要有,否則無法傳回,會 404
※測試
let array=[]; array.push({"id":"1","name":"七龍珠", "price":"50"}); array.push({"id":"2","name":"寶島少年", "price":"80"}); array.push({"id":"3","name":"尼羅河的女兒", "price":"70"}); $("#btn2").click(_ => { $.ajax({ url:"ooo/xxx/reqBody.mvc", type:"POST", dataType:"json", contentType:"application/json", data:JSON.stringify(array), success:function(data){ for(d of data){ console.info(d.id, d.name, d.price); console.info("--------------------"); } } }); }); -------------------- <input id="btn2" type="button" value="按我" />
※
※HttpEntity
可以塞值到 HTTP Header 裡不用寫 <mvc:annotation-driven />,也不用下載 jackson
※
@RequestMapping("resEntity") public HttpEntity<String> resEntity(HttpServletRequest req) throws IOException { HttpHeaders head = new HttpHeaders(); head.set("xxx", "ooo"); // HttpEntity<byte[]> he = new HttpEntity<>(head); HttpEntity<String> he = new HttpEntity<>("bruce", head); return he; } ---------------------------------------------- <a href="ooo/xxx/resEntity.mvc?">resEntity</a>
※注解那一行只有塞到 HTTP Header 裡,沒註解那一行還多一個顯示 bruce 在畫面上
※ResponseEntity
為 HttpEntity 的子類,多個狀態碼可實現下載功能
※
@RequestMapping("resEntity") public ResponseEntity<byte[]> resEntity(HttpServletRequest req) throws IOException { InputStream is = req.getServletContext().getResourceAsStream("/WEB-INF/xxx.txt"); byte[] bArray = new byte[is.available()]; is.read(bArray); HttpHeaders head = new HttpHeaders(); head.add("Content-Disposition", "attachment;filename=downloadName.txt"); return new ResponseEntity<byte[]>(bArray, head, HttpStatus.OK); } ---------------------------------------------- <a href="ooo/xxx/resEntity.mvc?">resEntity</a>
※
沒有留言:
張貼留言