Spring MVC(七)--傳遞JSON參數


有時候參數的傳遞還需要更多的參數,比如一個獲取用戶信息的請求中既有用戶ID等基本參數,還要求對查詢結果進行分頁,針對這種場景,一般都會將分頁參數封裝成一個對象,然后將它和基本參數一起傳給控制器,為了控制器方便接受,我們可以將這些所有的請求參數封裝成一個json對象進行傳遞。現在我進行一個以下場景的實例:通過頁面輸入參數id和名稱,然后從param表中獲取id大於參數id,名稱中包含參數名稱字樣的結果,並將結果分頁,只獲取20條數據。我已經在數據庫中插入了相關數據,並且只有ID不一致,其他的都一樣,如下圖所示:

下面創建代碼

1、創建前端頁面

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<%
    String root = request.getContextPath();
    String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort()
            + root + "/";
%>
<script type="text/javascript"
    src="<%=basePath%>jslib/jquery-1.8.3.min.js"></script>
<script type="text/javascript" src="<%=basePath%>jslib/jquery.form.js"></script>
<script type="text/javascript" src="<%=basePath%>js/param.js"></script>
<link href="<%=basePath%>css/param.css" type="text/css" rel="stylesheet">
<title>Insert title here</title>
</head>
<body>
    <div class="param">
        <!--使用JSON傳遞參數  -->
        <div class="public json">
            <p style="text-align: center;">JSON方式傳遞參數</p>
            <form id="jsonForm">
                <table id="jsonTable">
                    <tr>
                        <td>id:</td>
                        <td><input type="text" name="id" value=""></td>
                    </tr>
                    <tr>
                        <td>名稱:</td>
                        <td><input type="text" name="name" value=""></td>
                    </tr>
                    <tr>
                        <td></td>
                        <td style="text-align: right;"><input type="button"
                            value="提交" id="setJsonParam"></td>
                    </tr>
                </table>
            </form>
        </div>

</body>
</html>

頁面效果如下:

2、給提交按鈕綁定事件

點擊提交的時候,向后台發起請求,請求的參數是一個json;

$(function() {
    /* json方式傳遞數據 */
    /* 注意⚠️:json參數必須和類PageParam的屬性一一對應 */
    $("#setJsonParam").click(function() {

        var data = {
            paramId : $("#jsonForm input[name=id]").val(),
            paramName : $("#jsonForm input[name=name]").val(),
            page : {
                start : 0,
                limit : 20
            }
        }
        $.ajax({
            url : "./jsonParam",
            type : "POST",
            /* 此處需要定義傳遞參數的類型為json */ contentType : "application/json", /* 將json轉化為字符串 */ data : JSON.stringify(data),
            success : function(data) {
                var size = data.paramList.length;
                var html = "<tr><td>總數:</td><td>" + size + "</td></tr>";
                $("#jsonTable").append(html);
            }
        });
    });
});

注意上面代碼中加粗標紅的部分:

  • 變量data是個json數據,它有三個屬性分別是paramId、paramName、page,而page又有兩個屬性start和limit,代表起始頁和該頁的數量;
  • ajax請求的時候,數據類型需要定義為json格式;
  • 傳遞參數時需要將json轉化為字符串

根據上面的介紹,下一步需要創建json類。

3、創建json參數類

需要兩步:

1⃣️創建分頁類

package com.mvc.pojo;

/*
 * 分頁類
 */
public class Page {
    public int start;
    public int limit;

    public int getStart() {
        return start;
    }

    public void setStart(int start) {
        this.start = start;
    }

    public int getLimit() {
        return limit;
    }

    public void setLimit(int limit) {
        this.limit = limit;
    }
}

2⃣️封裝所有參數類

該類中包含參數paramId、paramName和page

package com.mvc.pojo;

/*
 * 分頁參數類
 */
public class PageParam {

    private int paramId;
    private String paramName;

    private Page page;

    public Page getPage() {
        return page;
    }

    public void setPage(Page page) {
        this.page = page;
    }

    public int getParamId() {
        return paramId;
    }

    public void setParamId(int paramId) {
        this.paramId = paramId;
    }

    public String getParamName() {
        return paramName;
    }

    public void setParamName(String paramName) {
        this.paramName = paramName;
    }

}

通過上面兩步就封裝好了請求參數,下面需要創建控制器進行獲取。

4、創建控制器

@Controller
@RequestMapping("/param")
public class ParamController {

    @Autowired
    @Qualifier("paramService")
    ParamService paramService = null;
    /**
     * 通過json獲取參數
     * 
     * @param id
     * @param name
     * @return
     */
    @RequestMapping(value = "jsonParam")
    public ModelAndView getParamByJson(@RequestBody PageParam pageParam) {
        ModelAndView mv = new ModelAndView();
        List<Param> paramList = paramService.getParam(pageParam);
        mv.addObject(paramList);
        mv.setView(new MappingJackson2JsonView());
        return mv;
    }
}

上面代碼中紅色加粗部分:

  • 注解RequestBody用來接受json參數
  • paramService.getParam(pageParam);封裝了一個從數據庫中查詢的方式,相當於服務端分頁,具體的代碼不貼了,看一下關鍵SQL吧:
<select id="getParamByPaging" parameterType="com.mvc.pojo.PageParam"
        resultMap="BaseResultMap">
        SELECT * FROM param
        WHERE param_id >
        #{paramId,jdbcType=INTEGER}
        AND param_name like
        concat('%',#{paramName,jdbcType=VARCHAR},'%')
        LIMIT
        #{page.limit,jdbcType=INTEGER}
        OFFSET
        #{page.start,jdbcType=INTEGER}
</select>

上面代碼中紅色加粗的部分:

  • 參數類型,就是剛才封裝的哪個分頁參數類;
  • 基本參數就是類中的參數名;
  • 針對分頁參數,獲取其屬性值的時候,不需要get方式,直接通過*.*的方式,前一個星號表示傳遞過來的封裝類中的對象屬性,后一個參數是這個對象屬性中的屬性值,比如分頁類Page中的頁數start和頁大小limit

至此,所有代碼已經完成,下面進行測試。

5、測試

在頁面輸入如下參數

點擊提交之后的結果如下:

這里直接打印的是總的查詢結果,為了驗證是否正確在數據庫中執行SQL看一下,執行之前先看一下傳遞的參數值是多少:

從控制台可以看出各個參數,SQL語句及執行結果如下:

可以看到和頁面顯示的是一致的,所以說控制器獲取參數成功。

六、總結

使用JSON傳遞參數時需要注意以下幾點:

  • 傳遞的json數據需要和對應參數的pojo保持一致。其實這種類型跟pojo方式很像,只不過pojo方式中參數對應的pojo沒有引用類型的屬性罷了。
  • 在請求的時候要告知請求的參數類型為JSON;
  • 傳遞參數時需要將JSON數據轉化成字符串;
  • 在mapper中獲取參數值時,基本類型引用的參數名就是pojo中的參數,而引用類型中的參數只需要通過pojo中的引用變量名.屬性名的方式,而不是對應的get方法;


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM