1. 程式人生 > >SpringMVC(三)獲取控制器引數

SpringMVC(三)獲取控制器引數

SpringMVC獲取控制器引數

在無註解下獲取引數

在沒有註解的情況下,SpringMVC也可以獲取引數,且引數允許為空,唯一的要求是引數名稱和HTTP請求的引數名稱保持一致。

package com.lay.mvc.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody; import java.util.HashMap; import java.util.Map; @RequestMapping("my") @Controller public class ParamController { /** * 在無註解下獲取引數,要求引數名稱和HTTP請求引數名稱一致 * @param intVal * @param longVal * @param str * @return 響應JSON引數 */
@GetMapping("/no/annotation") @ResponseBody public Map<String,Object> noAnnotation (Integer intVal,Long longVal,String str) { Map<String,Object> paramMap=new HashMap<>(); paramMap.put("intVal",intVal); paramMap.put("longVal",longVal); paramMap.
put("str",str); return paramMap; } }

測試

http://localhost:8080/my/no/annotation?intVal=10&longVal=200&str=12321

結果

{"str":"12321","intVal":10,"longVal":200}

使用@RequestParam獲取引數

在無需註解的情況下,要求HTTP引數和控制器的方法引數保持一致。然後在前後端分離的趨勢下,前端的命名規則可能與後端不同,這是需要把前端媽的引數與後端對應起來。SpringMVC提供了註解@RequestParam來確定前後端引數名稱的對映關係。

    /**
     *
     * @Description:通過註解獲取引數
     * @param: intVal, longVal, strVal
     * @return: java.util.Map<java.lang.String,java.lang.Object>
     * @auther: lay
     * @date: 14:14 2018/11/13
     */
    @GetMapping("annotation")
    @ResponseBody
    public Map<String,Object> annotation(
            @RequestParam("int_val") Integer intVal,
            @RequestParam("long_val") Long longVal,
            @RequestParam(value = "str_val",required = false) String strVal){
        Map<String,Object> paramMap=new HashMap<>();
        paramMap.put("intVal",intVal);
        paramMap.put("longVal",longVal);
        paramMap.put("str",strVal);
        return paramMap;
    }

在預設情況下@RequestParam標註的引數是不能為空的,如果允許為空可以修改為@RequestParam(value = "str_val",required = false)

測試http://localhost:8080/my/no/annotation?intVal=10&longVal=200

傳遞陣列

SpringMVC內部已經支援用都逗號分隔的陣列引數

 /**
     *
     * @Description: 傳遞陣列
     * @param: [intArr, longArr, strArr]
     * @return: java.util.Map<java.lang.String,java.lang.Object>
     * @auther: lay
     * @date: 14:21 2018/11/13
     */
    @GetMapping("/requestArray")
    @ResponseBody
    public Map<String,Object> requestArray(
            int[] intArr,Long[] longArr,String[] strArr){
        Map<String,Object> paramMap=new HashMap<>();
        paramMap.put("intVal",intArr);
        paramMap.put("longVal",longArr);
        paramMap.put("str",strArr);
        return paramMap;
    }

測試http://localhost:8080/my/requestArray?intArr=1,2,3&longArr=2222,3334,1&strArr=hello,world

返回

{"str":["hello","world"],"intVal":[1,2,3],"longVal":[2222,3334,1]}

傳遞JSON

前端有時候需要提交較為複雜的資料到後端,為了更好組織和提高程式碼的可讀性,可以將資料轉換為JSON資料集,通過HTTP請求體提交給後端。

示例:新增人員

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">

<head>
    <meta charset="UTF-8">
    <meta charset="UTF-8">
    <title>使用者新增</title>
    <link rel="stylesheet" type="text/css" href="https://www.jeasyui.com/easyui/themes/default/easyui.css">
    <link rel="stylesheet" type="text/css" href="https://www.jeasyui.com/easyui/themes/icon.css">
    <link rel="stylesheet" type="text/css" href="https://www.jeasyui.com/easyui/themes/color.css">
    <link rel="stylesheet" type="text/css" href="https://www.jeasyui.com/easyui/demo/demo.css">
    <script type="text/javascript" src="https://code.jquery.com/jquery-1.9.1.min.js"></script>
    <script type="text/javascript" src="https://www.jeasyui.com/easyui/jquery.easyui.min.js"></script>
    <script type="text/javascript">
        $(document).ready(function () {
            $("#submit").click(function () {
                var personName = $("#personName").val();
                var note = $("#note").val();
                if ($.trim(personName) == "") {
                    alert("使用者名稱不能為空!");
                    return;
                }
                var params = {
                    personName: personName,
                    sex:"0",
                    note: note
                };


                $.ajax({
                    url: "../person/insert",
                    //告知傳遞引數型別為json,不可缺少
                    type:"post",
                    contentType:"application/json",
                    //將json轉化為字串傳遞
                    data: JSON.stringify(params),
                    //dataType:"text",
                    //成功後得方法
                    success: function (result) {
                        if (result == null || result.id == null) {
                            alert("插入失敗");
                            return;
                        }
                        alert("插入成功");
                    }
                });
            });
        });
    </script>
</head>
<body>
<div style="margin: 20px 0;"></div>
<form id="insertForm">
    <table>
        <tr>
            <td>使用者名稱稱</td>
            <td><input id="personName" name="personName"></td>
        </tr>
        <tr>
            <td>備註</td>
            <td><input id="note" name="note"></td>
        </tr>
        <tr>
            <td></td>
            <td align="right"><input id="submit" type="button" value="提交"></td>
        </tr>
    </table>
</form>
</body>
</html>

後臺

    @RequestMapping("/insert")
    @ResponseBody
    public Person insert(@RequestBody Person person) {
        personService.insertPerson(person);
        return person;
    }

通過URL傳遞引數

在一些REST風格的網站中,引數往往通過URL進行傳遞。

例如獲得編號為1的使用者,URL就要寫為/person/1,這裡的1代表的是人員編號(id)。SpringMVC可以通過處理器對映和註解@PathVariable的組合獲取URL引數。

    /**
     *
     * @Description: 通過URL獲得引數
     * @param: [id]
     * @return: com.lay.mvc.entity.Person
     * @auther: lay
     * @date: 14:34 2018/11/13
     */
    //{...}代表佔位符,還可以配置引數名稱
    @GetMapping("/{id}")
    @ResponseBody
    public Person get(@PathVariable("id") Long id){
        return personService.getPerson(id);
    }

測試http://localhost:8080/my/1

獲取格式化引數

格式日期和貨幣

頁面

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">

<head>
    <meta charset="UTF-8">
    <meta charset="UTF-8">
    <title>格式化</title>
</head>
<body>
<form action="./commit" method="post">
    <table>
        <tr>
            <td>日期</td>
            <td>
                <input type="text" name="date" value="2018-11-13">
            </td>
        </tr>
        <tr>
            <td>金額</td>
            <td>
                <input type="text" name="number" value="1,234,567.89">
            </td>
        </tr>
        <tr>
            <td colspan="2"align="right">
                <input type="submit" value="提交">
            </td>
        </tr>
    </table>
</form>
</body>
</html>

後臺

//對映頁面
@GetMapping("/format/form")
public String showFormat(){
    return "/format/formatter";
}
//獲取提交引數
@PostMapping("/format/commit")
@ResponseBody
public Map<String,Object> format(
        @DateTimeFormat(iso= DateTimeFormat.ISO.DATE)Date date,
        @NumberFormat(pattern = "#,###.##") Double number){
    Map<String,Object> dataMap=new HashMap<>();
    dataMap.put("date",date);
    dataMap.put("number",number);
    return dataMap;
}