ssm練手(CRUD) 5、用JSON重新規劃數據傳遞

至此,頁面跳轉也已經完成,但是,這僅僅是瀏覽器和服務器的交互。如果是安卓或者ios發送請求呢?(即手機端和服務器的交互)。這樣一來,服務器發回來個頁面,導致手機端很難解析。因此,如今常用的方式是利用JSON,服務器把數據傳入JSON,然後瀏覽器和手機客戶端分別解析JSON的數據,這樣一來就好了很多。接下里就用JSON和ajax。這樣就做到了平臺無關性

思路:
1、 index.jsp頁面之間發送ajax請求進行員工分頁數據的查詢
2、 服務器將查出的數據,以JSON字符串的形式返回給瀏覽器
3、 瀏覽器收到js字符串。可以使用js對JSON進行解析,使用js通過dom增刪改來改變頁面
4、 返回JSON。實現客戶端的無關性

接下來開始實現JSON進行數據傳遞

1)進入EmployeeController修改,代碼如下:
我們將原來的代碼註釋掉,新添加代碼。部分代碼解釋請看我的註釋

package com.atguigu.crud.controller;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;

import com.atguigu.crud.bean.Employee;
import com.atguigu.crud.service.EmployeeService;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
/*
 * 處理員工CRUD請求
 */
@Controller
public class EmployeeController {

    @Autowired
    EmployeeService employeeService;

    /*
     *  1、@ResponseBody令數據不會被解析,而是直接寫入HTTP response body中
     *    (比如異步獲取JSON數據就要用到這個)
     *  2、想要@ResponseBody正常工作,需要導入jackson包。這個
     *     包負責將對象轉化爲JSON字符串
     */
    @RequestMapping("/emps")
    @ResponseBody
    public PageInfo getEmpsWithJson(@RequestParam(value="pn",defaultValue="1")Integer pn){
        //這一段不變,查詢數據
        PageHelper.startPage(pn, 5);
        List<Employee> emps=employeeService.getAll();
        PageInfo page=new PageInfo(emps,5);
        /*
         * 此處我們不用添加model,直接返回page對象(裏面的數據)
         * 結合@ResponseBody,直接將JSON數據添加到response請求中
         */
        return page;
    }


    /*
    //查詢員工數據(分頁查詢)
    @RequestMapping("/emps")
    public String getEmps(@RequestParam(value="pn",defaultValue="1")Integer pn,Model model){
        //查出了所有員工。但不是分頁
        //引入PageHelper分頁插件
        //在查詢之前只需要調用如下方法,從第n頁查,每次查5條數據
        PageHelper.startPage(pn, 5);

        //startPage後面緊跟的這個查詢就是一個分頁查詢
        List<Employee> emps=employeeService.getAll();

        //將查詢到的所有數據利用pageInfo進行包裝,
        //可以顯示一些信息(比如在第幾頁啥的);此處的5表示連續顯示的頁數
        PageInfo page=new PageInfo(emps,5);
        model.addAttribute("pageInfo",page);

        return "/list";
    }
     */
}

2)添加jackson包(使用@ResponseBody必須要加上的包)

<!-- jackson -->
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>2.8.8.1</version>
        </dependency>

3)測試運行,在瀏覽器內輸入如下字段http://localhost:8080/ssm_crud/emps
在我的火狐瀏覽器上效果如下(有那個原始數據就夠了)
這裏寫圖片描述
這裏寫圖片描述

然後要修改也很容易,在瀏覽器裏添加個pn參數即可,如圖:
這裏寫圖片描述

但是如果我們想要自己添加一些提示信息呢?比如說後臺返回個100就代表成功,返回200就代表失敗(這個自行定義)。因此我們做如下修改:
這裏寫圖片描述

package com.atguigu.crud.bean;

import java.util.HashMap;
import java.util.Map;

/*
 * 通用的返回的類
 */
public class Msg {

    //狀態碼 假如返回100即代表成功 返回200即失敗,這個自行定義的
    private int code;

    //提示信息
    private String msg;

    //用戶要返回給瀏覽器的數據
    private Map<String,Object> extend=new HashMap<String,Object>();

    public int getCode() {
        return code;
    }

    public void setCode(int code) {
        this.code = code;
    }

    public String getMsg() {
        return msg;
    }

    public void setMsg(String msg) {
        this.msg = msg;
    }

    public Map<String, Object> getExtend() {
        return extend;
    }

    public void setExtend(Map<String, Object> extend) {
        this.extend = extend;
    }


    //寫個快捷的提示成功和失敗的方法
    public static Msg success(){
        Msg result=new Msg();
        result.setCode(100);
        result.setMsg("處理成功");
        return result;
    }
    public static Msg fail(){
        Msg result=new Msg();
        result.setCode(200);
        result.setMsg("處理失敗");
        return result;
    }

    public Msg add(String key,Object value){
        this.getExtend().put(key, value);
        return this;
    }
}

然後回到EmployeeController.java,代碼修改如下:

package com.atguigu.crud.controller;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;

import com.atguigu.crud.bean.Employee;
import com.atguigu.crud.bean.Msg;
import com.atguigu.crud.service.EmployeeService;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
/*
 * 處理員工CRUD請求
 */
@Controller
public class EmployeeController {

    @Autowired
    EmployeeService employeeService;

    /*
     *  1、@ResponseBody令數據不會被解析,而是直接寫入HTTP response body中
     *    (比如異步獲取JSON數據就要用到這個)
     *  2、想要@ResponseBody正常工作,需要導入jackson包。這個
     *     包負責將對象轉化爲JSON字符串
     */
    @RequestMapping("/emps")
    @ResponseBody
    public Msg getEmpsWithJson(@RequestParam(value="pn",defaultValue="1")Integer pn){
        //這一段不變,查詢數據
        PageHelper.startPage(pn, 5);
        List<Employee> emps=employeeService.getAll();
        PageInfo page=new PageInfo(emps,5);
        /*
         * 此處我們不用添加model,直接返回page對象(裏面的數據)
         * 結合@ResponseBody,直接將JSON數據添加到response請求中
         */
        return Msg.success().add("pageInfo",page);
    }
}

然後再來看效果:
這裏寫圖片描述
如圖,這樣就加上了我們自己設置的提示符

發佈了49 篇原創文章 · 獲贊 57 · 訪問量 11萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章