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