91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何使用Springboot接收前端Ajax發送的json

發布時間:2022-11-10 17:13:38 來源:億速云 閱讀:155 作者:iii 欄目:編程語言

本文小編為大家詳細介紹“如何使用Springboot接收前端Ajax發送的json”,內容詳細,步驟清晰,細節處理妥當,希望這篇“如何使用Springboot接收前端Ajax發送的json”文章能幫助大家解決疑惑,下面跟著小編的思路慢慢深入,一起來學習新知識吧。

1. 后端Springboot

通過 https://start.spring.io/ 獲得項目框架。在eclipse中導入下載的Maven項目。

  • Maven添加fastjson依賴包

<!-- https://mvnrepository.com/artifact/com.alibaba/fastjson -->
<dependency>
  <groupId>com.alibaba</groupId>
  <artifactId>fastjson</artifactId>
  <version>1.2.62</version>
</dependency>
  • 定義Controller

@RestController
public class GetJsonReq {

  @CrossOrigin
  @RequestMapping(value = "/simple")
  // json的結構和內部字段名稱可以與POJO/DTO/javabean完全對應
  public Map<String, String> getJsonBean(@RequestBody Beauty beauty) {
    Map<String, String> result = null;

    if (beauty != null) {
      System.out.println("美女的名字:" + beauty.getName());
      System.out.println("美女的年齡:" + beauty.getAge());

      SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
      System.out.println("美女出道日期:" + sdf.format(beauty.getDate()));

      System.out.println("美女的收入:" + beauty.getSalary());

      result = new HashMap<>();
      result.put("code", "1");
      result.put("msg", "ok");
    }

    return result;
  }

  @CrossOrigin
  @RequestMapping(value = "/complex")
  //json的結構較為復雜,不直接與POJO/DTO/javabean對應。
  public Map<String, String> getJsonComplex(@RequestBody JSONObject param) {
    Map<String, String> result = null;

    if (param != null) {
      JSONObject master = param.getJSONObject("master");
      Beauty beauty = (Beauty) JSONObject.toJavaObject(master, Beauty.class);
      System.out.println(beauty);

      JSONArray mm = param.getJSONArray("MM");
      for (int i = 0; i < mm.size(); i++) {
        // 這里不能使用get(i),因為get(i)只會得到鍵值對。
        JSONObject json = mm.getJSONObject(i);
        Beauty bt = (Beauty) JSONObject.toJavaObject(json, Beauty.class);
        System.out.println(bt);
      }

      result = new HashMap<>();
      result.put("code", "1");
      result.put("msg", "ok");
    }

    return result;
  }
}
  • POJO/DTO/JavaBean
    注意Date字段要如何處理。

public class Beauty {
  private String name;
  private int age;
  @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
  private Date date;
  private double salary;

  public Beauty() {

  }

  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;
  }

  public Date getDate() {
    return date;
  }

  public void setDate(Date date) {
    this.date = date;
  }

  public double getSalary() {
    return salary;
  }

  public void setSalary(double salary) {
    this.salary = salary;
  }

  @Override
  public String toString() {
    return "Beauty [name=" + name + ", age=" + age + ", date=" + date + ", salary=" + salary + "]";
  }

}
  • 將JSON轉為Java對象使用@RequestBody 注解;將Java對象轉換為JSON使用@ResponseBody注解。

一旦使用@ResponseBody注解返回流程將不在經過視圖解析器,而是直接將數據寫入到輸出流中,通過response的body返回數據。如果處理請求方法返回的是 String 時@ResponseBody 注解不會進行 JSON 轉換。響應的 Content-Type 為 text/plain;charset=ISO-8859-1。如果處理請求方法返回的是除了 String 類型以外的其他Object 類型時,@ResponseBody注解會進行 JSON 轉換。響應的 Content-Type 為 application/json。

響應體的字符編碼需要在@RequestBody 注解中設定:

//@RequestMapping(value = "/addUsers",produces = "text/plain;charset=utf-8") 返回String
//@RequestMapping(value = "/addUsers",produces = "application/json;charset=utf-8") 返回json對象
@RequestMapping(value = "/addUsers",produces = MediaType.APPLICATION_JSON_VALUE+";charset=utf-8")
@ResponseBody
@CrossOrigin(origins ="http://localhost:8888")
public Object addUsers(@RequestBody Users users)throws Exception{
  System.out.println(users);
  return users;
}
2. 前端通過Ajax發送json
  • 借助jQuery來發送Ajax請求。

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title>發送json</title>
    <script src="https://apps.bdimg.com/libs/jquery/2.1.4/jquery.min.js" type="text/javascript" charset="utf-8"></script>
  </head>
  <body>
    <script type="text/javascript">function send1() {
        var beauty = JSON.stringify({ //將JSON對象轉換為字符串
          "name": "小甜甜",
          "age": 26,
          "salary": 200000,
          "date": "2019-08-05 08:04:13"
        });

        $.ajax({
          type: 'POST',
          url: "http://localhost:8080/simple",
          data: beauty,  //beauty是字符串
          contentType: "application/json",
          dataType: "json",
          success: function(message) {
            alert(JSON.stringify(message)) //將JSON對象轉換為字符串
          }
        });
      };

      function send2() {
        var beauty = JSON.stringify({
          "MM": [{
            "name": "春花",
            "age": 27,
            "salary": 20000,
            "date": "2017-05-19 09:33:14"
          }, {
            "name": "秋香",
            "age": 30,
            "salary": 30000,
            "date": "2019-10-21 17:04:33"
          }],
          "master": {
            "name": "小甜甜",
            "age": 26,
            "salary": 200000,
            "date": "2019-08-05 08:04:13"
          }
        });

        $.ajax({
          type: "POST",
          url: "http://localhost:8080/complex",
          contentType: "application/json; charset=utf-8",
          data: beauty,
          dataType: "json",
          success: function(message) {
            alert("提交成功" + JSON.stringify(message));
          },
          error: function(message) {
            alert("提交失敗" + JSON.stringify(message));
          }
        });
      }</script>

    <input type="button" name="btn1" id="s1" onclick="send1()" value="發送簡單json" />
    <br />
    <hr />
    <input type="button" name="btn2" id="s2" onclick="send2()" value="發送復雜json" />
  </body>
</html>

這里要注意:

  1. script標簽引入js的形式必須是雙標簽,形如:
    <script src="…js" …></script>
    如果是形如<script src="…js" … />的單標簽,將無法引入js。

  2. 頁面提交的數據默認content-type是application/x-www-form-urlcoded的編碼(鍵值對)。而@RequestBody注解只有在編碼為application/json時才能將JSON 格式的數據轉為 Java 對象。

  3. 對于jQuery一般是使用$.ajax來發送json請求,因為只有它可以設置編碼格式(application/json)。

  • HTML5中如何實現JSON對象與字符串之間的相互轉換?

//string -> json
JSON.parse("...")

//json -> string
JSON.stringify(obj)
3. 跨域訪問
  • 同源策略
    ajax請求須受到同源策略的影響。

  • 跨域請求
    在 JavaScript 的請求中當一個請求 URL 的協議、域名、端口三者之間任意一個與當前頁面 URL 不同時即為跨域。

  • ajax請求如何受同源策略限制
    一個頁面的URL(origin)與同一頁面中ajax訪問的URL出現跨域時,ajax請求被服務器端block。

  • 處理方式

前端:jsonp(json with padding)
jsonp的原理就是script標簽不受同源策略的影響,所以通過script的src屬性來實現跨域。

//原生js
var script = document.createElement("script");
script.src = "https://api.douban.com/v2/book/search?q=javascript&count=1&callback=handleResponse";
document.body.insertBefore(script, document.body.firstChild);

//在頁面中,返回的JSON作為參數傳入回調函數中
functionhandleResponse(response){
// 對response數據進行操作代碼
}

//jQuery GET
$.ajax({
                async : true,
                url : "https://api.douban.com/v2/book/search",
                type : "GET",
                dataType : "jsonp", // 返回的數據類型,設置為JSONP方式
                jsonp : 'callback', //指定一個查詢參數名稱來覆蓋默認的 jsonp 回調參數名 callback
                jsonpCallback: 'handleResponse', //設置回調函數名
                data : {
                    q : "javascript", 
                    count : 1
                }, 
                success: function(response, status, xhr){
                    console.log('狀態為:' + status + ',狀態是:' + xhr.statusText);
                    console.log(response);
                }
            });

//jQuery POST
$.ajax({
    url:'http://localhost:8888/other/other.jsp',
    type:'post',
    data:{'params':'fromjsonp'},
    dataType: "jsonp",
    jsonp: "callback",//傳遞給請求處理程序或頁面的,用以獲得jsonp回調函數名的參數名(一般默認為:callback)
    success: function(data){
        alert("through jsonp,receive data from other domain : "+data.result);
    },
    error: function(){
        alert('fail');
    }
});

后端:@CrossOrigin

@Controller
@RequestMapping("/user")
public class UsersController {

    @RequestMapping(value = "/addUsers",produces = MediaType.APPLICATION_JSON_VALUE+";charset=utf-8")
    @ResponseBody
    //限定發送 ajax的頁面的初始url,即origins(可多個origin url)。其他的不受理。
    //不給出origins則處理所有origin url的跨域 ajax請求。
    @CrossOrigin(origins ="http://localhost:8888")
    public Object addUsers(@RequestBody Users users)throws Exception{
        System.out.println(users);
       return users;
    }
}

讀到這里,這篇“如何使用Springboot接收前端Ajax發送的json”文章已經介紹完畢,想要掌握這篇文章的知識點還需要大家自己動手實踐使用過才能領會,如果想了解更多相關內容的文章,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

彭州市| 洪湖市| 镇赉县| 娄底市| 兴隆县| 雷波县| 桐柏县| 南昌县| 禄劝| 晋宁县| 上饶市| 壶关县| 玉溪市| 长子县| 西昌市| 通榆县| 绥阳县| 大同市| 荥阳市| 阜平县| 舞钢市| 巨野县| 西和县| 台州市| 渭源县| 孟村| 清镇市| 万州区| 淄博市| 化州市| 闵行区| 芦溪县| 龙江县| 尖扎县| 钟祥市| 绥芬河市| 繁昌县| 安康市| 崇左市| 宁武县| 井冈山市|