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