第四章:數(shù)據(jù)交互

json數(shù)據(jù)交互
客戶端發(fā)送請求一共2種方式j(luò)son回來
1.key value 原生js請求
2.json方式
html---------->Controller
以下有2種方式
1.請求json過渡到過濾器
2.過濾器如何快速返json

這個是通過url地址來傳值

http://localhost:8080/TestSpringMvc/ajax/test1?empno=1&empname=2&sal=3

@Controller
@RequestMapping("/ajax")
public class AjaxController {
    
    /*
     * content-type:application/x-www-form-urlencoded=> 1.test(Integer empno, String empname, Double sal)
     * content-type:application/json => @RequestBody Employee e
     *     @RequestBody:解析json字符串苟鸯,把請求數(shù)據(jù)拿出來,放在對象里
     *  
     */
    
    //http://localhost:8080/TestSpringMvc/ajax/test1?empno=1&empname=2&sal=3
    //test1 通過一個一個傳遞屬性來獲得
    @RequestMapping("/test1")
    public void test1(Integer empno,String empname,Double sal ,HttpServletResponse resp) {
        System.out.println(empno);
        System.out.println(empname);
        System.out.println(sal);
        try {
            resp.getWriter().append("{\"result\":true}");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

顯示地址不一樣


2.png

第二種方式這個是通過阿賈克斯來傳,請求數(shù)據(jù)組裝成(節(jié)深)字符串形式向Springmvc發(fā)送放到@RequestBody Employee e 字符串形式和解析出來放到這里

<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind -->
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-databind</artifactId>
        <version>2.10.0</version>
    </dependency>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<script src="https://unpkg.com/axios/dist/axios.min.js"></script>
<script type="text/javascript">
   function test()
   {
       axios.post('/TestSpringMvc/ajax/test2',
               {
                  empno:1,
                  empname:"feiyy",
                  sal:10000
               }).then(function(resp){
                   
                   console.log(resp);
                   
               })      
   }

</script>
</head>
<body>

     <button type="button" onclick="test()">測試</button>

</body>
</html>
@Controller
@RequestMapping("/ajax")
public class AjaxController {
    
    /*
     * content-type:application/x-www-form-urlencoded=> 1.test(Integer empno, String empname, Double sal)
     * content-type:application/json => @RequestBody Employee e
     *     @RequestBody:解析json字符串蚕钦,把請求數(shù)據(jù)拿出來懊烤,放在對象里
     *  
     */
    
    //http://localhost:8080/TestSpringMvc/ajax/test1?empno=1&empname=2&sal=3
    //test1 通過一個一個傳遞屬性來獲得
    @RequestMapping("/test1")
    public void test1(Integer empno,String empname,Double sal ,HttpServletResponse resp) {
        System.out.println(empno);
        System.out.println(empname);
        System.out.println(sal);
        try {
            resp.getWriter().append("{\"result\":true}");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    
    //test2 通過前端js框架組裝字符串 到這里進(jìn)行字符串解析 成為類獲得值
    @RequestMapping("/test2")
    public void test(@RequestBody Employee e, HttpServletResponse resp)
    {
        
        System.out.println(e.getEmpno());
        System.out.println(e.getEmpname());
        System.out.println(e.getSal());
        
        try {
            resp.getWriter().append("{\"result\":true}");
        } catch (IOException ex) {
            // TODO Auto-generated catch block
            ex.printStackTrace();
        }
    }

}
2345截圖20191111141812.png

數(shù)據(jù)已經(jīng)傳給Controller 數(shù)據(jù)如何通過controller傳送給頁面扮念!

在SpringMvc有個處理,返回是一個對象或者一個集合在方法返回值上面加個
@RequestBody

    @RequestMapping("/test3")
    @ResponseBody
    public List<Employee> test(@RequestBody Employee e)
    {
        System.out.println(e.getEmpno());
        System.out.println(e.getEmpname());
        System.out.println(e.getSal());
        
        List<Employee> list = new ArrayList<>();
        
        Employee e1 = new Employee();
        e1.setEmpno(1);
        e1.setEmpname("jack");
        
        Employee e2 = new Employee();
        e2.setEmpno(2);
        e2.setEmpname("james");
        
        list.add(e1);
        list.add(e2);

        return list;
    }

**還是通過 輸入ajax地址返回來還是一個對象

3331194830.png

html---->controller springMVC
html向controller走的時候颠区,是組裝成json字符串過去的
html----controller 艾克壽司做的
StringMVC解析json字符串組裝成對象放到控制器里荠割,然后查詢數(shù)據(jù)庫棵帽,列表打印成json字符串梨树,把列表打成json字符串發(fā)送到客戶端來了調(diào)用了一個組件
@RequestBody SpringMvc
@ResponseBody json

如果一個controller下,都是響應(yīng)ajax請求岖寞,@RestController = @Controller + @ResponseBody

2345截圖20191111202911.png

如何通過字符串返回客戶端

package com.fcx.bean;

import java.util.Date;

import com.fasterxml.jackson.annotation.JsonFormat;

public class Employee {
    
    private int empno;
    private String empname;
    @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss",timezone="GMT+8")
    private Date hiredate;
    public int getEmpno() {
        return empno;
    }
    public void setEmpno(int empno) {
        this.empno = empno;
    }
    public String getEmpname() {
        return empname;
    }
    public void setEmpname(String empname) {
        this.empname = empname;
    }
    public Date getHiredate() {
        return hiredate;
    }
    public void setHiredate(Date hiredate) {
        this.hiredate = hiredate;
    }
}

@RestController
@RequestMapping("/ajax2")
public class AjaxController2 {
    
    /*
     * content-type:application/x-www-form-urlencoded=> 1.test(Integer empno, String empname, Double sal)
     * content-type:application/json => @RequestBody Employee e
     *     @RequestBody: 解析json字符串,把請求數(shù)據(jù)拿出來柜蜈,放在對象里仗谆。
     *  
     */
    
    @RequestMapping("/test1")
    public List<Employee> test(@RequestBody Employee e)
    {
        
        System.out.println(e.getEmpno());
        System.out.println(e.getEmpname());
        
        List<Employee> list = new ArrayList<>();
        
        Employee e1 = new Employee();
        e1.setEmpno(1);
        e1.setEmpname("jack");
        e1.setHiredate(new Date());
        
        Employee e2 = new Employee();
        e2.setEmpno(2);
        e2.setEmpname("james");
        e2.setHiredate(java.sql.Date.valueOf("1987-01-01"));
        
        list.add(e1);
        list.add(e2);
        
        return list;
    }

}

22.png

用阿賈克斯文件上傳

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<script src="https://unpkg.com/axios/dist/axios.min.js"></script>
<script type="text/javascript">
   function upload()
   {
       var filesize = document.getElementById("avatar").files[0].size;
       
       if(filesize>5242880)
           {
             alert("文件超過最大限制5M");
             return;
           }
       
       //使用FormData,表單上必須是multipart/form-data,二進(jìn)制提交給后臺的。
           
       //1. 創(chuàng)建FormData對象淑履,
       var formData = new FormData(document.getElementById("myform"));
       
       //2. 發(fā)送ajax請求
       axios.post('/TestSpringMvc/upload2/upload',formData)
            .then(function(resp){
                
                console.log(resp);
            })
   }

</script>
</head>
<body>

  <!-- ajax做文件上傳的時候隶垮,需要表單,表單需要設(shè)置enctype="multipart/form-data",method="post" -->
  <form id="myform" enctype="multipart/form-data" method="post">
      <div>
          <input type="text" name="username" /> 
      </div>
      <div>
          <input type="date" name="birthday" /> 
      </div>
      <div>
          <input id="avatar" type="file" name="avatar"/>
      </div>
      <button type="button" onclick="upload()">提交</button>
   </form>
</body>
</html>
@Controller
@RequestMapping("/upload2")
public class UploadController2 {
    
    @RequestMapping("/upload")
    public void upload(String username, Date birthday, MultipartFile avatar, HttpServletResponse resp)
    {
        System.out.println("JAJAJAJAJA");
        System.out.println(username);
        System.out.println(birthday);
        System.out.println(avatar.getOriginalFilename());
        
        String newfilename = UUID.randomUUID().toString()+avatar.getOriginalFilename().substring(avatar.getOriginalFilename().lastIndexOf("."));
        
        File dest = new File("d:/images",newfilename);
            
        
        try {
            avatar.transferTo(dest);
        } catch (IllegalStateException | IOException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }
        
        try {
            resp.getWriter().append("{\"result\":true}");
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

RESTFUl面向資源一種請求

restui面向資源的秘噪,你原來對比一下狸吞,現(xiàn)在請求url
get emp查詢,set emp ,delete emp
蹋偏,url加動詞體現(xiàn)干啥便斥,你不應(yīng)該這樣寫面向資源方式寫,你操作員工威始,你想查詢所有員工 emps 配合請求方式get然后你想往這里面新增一個路徑emps
只是提交方式post枢纠,我想用id查詢員工信息 emp/員工編號101或者員工102更像他還是這一個資源
更新 put 刪除101 delte 在這種架構(gòu)下,面向資源黎棠,在url路徑下不應(yīng)該有資源配合請求方式

5.png
@RestController
public class RestFullController {
    
    @GetMapping("/emps")
    public List<Employee> getEmps()
    {
        List<Employee> list = new ArrayList<>();
        
        Employee e = new Employee();
        e.setEmpno(1);
        e.setEmpname("jack");
        e.setHiredate(new Date());
        
        Employee e2 = new Employee();
        e2.setEmpno(2);
        e2.setEmpname("james");
        e2.setHiredate(java.sql.Date.valueOf("1990-1-1"));
        
        list.add(e);
        list.add(e2);
        
        return list;
    }
    
    @PostMapping("/emps")
    public String addEmp(Employee e)
    {
        System.out.println(e.getEmpno());
        System.out.println(e.getEmpname());
        System.out.println(e.getHiredate());
        //add to database
        return "{\"result\":true}";
    }
    
    @GetMapping("/emp/{id}")
    public Employee getEmployee(@PathVariable int id)
    {
        System.out.println(id);
        return new Employee();
    }
    
    @DeleteMapping("/emp/{id}")
    public String deleteEmployee(@PathVariable int id)
    {
        System.out.println(id);
        return "{\"result\":true}";
    }
    
    @PutMapping("/emp/{id}")
    public String updateEmployee(@PathVariable int id, Employee e)
    {
        System.out.println(id);
        
        System.out.println(e.getEmpno());
        System.out.println(e.getEmpname());
        System.out.println(e.getHiredate());
        //add to database
        return "{\"result\":true}";
        
    }
    

}

加個過濾器

  <!--RESTFUl-->
   <filter>
      <filter-name>HttpMethodFilter</filter-name>
      <filter-class>org.springframework.web.filter.HttpPutFormContentFilter</filter-class>
    </filter>
    <filter-mapping>
         <filter-name>HttpMethodFilter</filter-name>
         <url-pattern>/*</url-pattern>
    </filter-mapping>
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末晋渺,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子脓斩,更是在濱河造成了極大的恐慌木西,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,948評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件随静,死亡現(xiàn)場離奇詭異八千,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)挪挤,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,371評論 3 385
  • 文/潘曉璐 我一進(jìn)店門叼丑,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人扛门,你說我怎么就攤上這事鸠信。” “怎么了论寨?”我有些...
    開封第一講書人閱讀 157,490評論 0 348
  • 文/不壞的土叔 我叫張陵星立,是天一觀的道長。 經(jīng)常有香客問我葬凳,道長绰垂,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,521評論 1 284
  • 正文 為了忘掉前任火焰,我火速辦了婚禮劲装,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘昌简。我一直安慰自己占业,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,627評論 6 386
  • 文/花漫 我一把揭開白布纯赎。 她就那樣靜靜地躺著谦疾,像睡著了一般。 火紅的嫁衣襯著肌膚如雪犬金。 梳的紋絲不亂的頭發(fā)上念恍,一...
    開封第一講書人閱讀 49,842評論 1 290
  • 那天六剥,我揣著相機(jī)與錄音,去河邊找鬼峰伙。 笑死疗疟,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的词爬。 我是一名探鬼主播秃嗜,決...
    沈念sama閱讀 38,997評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼顿膨!你這毒婦竟也來了锅锨?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,741評論 0 268
  • 序言:老撾萬榮一對情侶失蹤恋沃,失蹤者是張志新(化名)和其女友劉穎必搞,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體囊咏,經(jīng)...
    沈念sama閱讀 44,203評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡恕洲,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,534評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了梅割。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片霜第。...
    茶點(diǎn)故事閱讀 38,673評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖户辞,靈堂內(nèi)的尸體忽然破棺而出泌类,到底是詐尸還是另有隱情,我是刑警寧澤底燎,帶...
    沈念sama閱讀 34,339評論 4 330
  • 正文 年R本政府宣布刃榨,位于F島的核電站,受9級特大地震影響双仍,放射性物質(zhì)發(fā)生泄漏枢希。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,955評論 3 313
  • 文/蒙蒙 一朱沃、第九天 我趴在偏房一處隱蔽的房頂上張望苞轿。 院中可真熱鬧,春花似錦逗物、人聲如沸搬卒。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,770評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至尔当,卻和暖如春莲祸,著一層夾襖步出監(jiān)牢的瞬間蹂安,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,000評論 1 266
  • 我被黑心中介騙來泰國打工锐帜, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留田盈,地道東北人。 一個月前我還...
    沈念sama閱讀 46,394評論 2 360
  • 正文 我出身青樓缴阎,卻偏偏與公主長得像允瞧,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子蛮拔,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,562評論 2 349

推薦閱讀更多精彩內(nèi)容