SpringMVC控制器传参
从前端获取参数
参数名一致
如果前端传入的参数名与后端的一致,则不需要特殊处理,直接获取即可
前端:
<a href="<%=path%>/goods/goodsByType?typeId=4">根据类型查找商品</a><br/>
后端:
@RequestMapping("/goodsByType")
public String selectByType(Integer typeId) {
List<Goods> goodsList = goodsService.selectByTypeId(typeId);
for (Goods goods : goodsList) {
System.out.println(goods.getName());
}
return "index";
}
参数名不一致
参数名不一致的情况,需要用@RequestParam(“前端的参数名”)来获取前端的参数
前端传入的参数为tId
<a href="<%=path%>/goods/getParaRequiredF?tId=4">传参名字不一致</a><br/>
后端方法的参数名为typeId,与前端不一致,因此需要加上@RequestParam注解来说明从前端获取名字为tId的参数,放到typeId
里
@RequestMapping("/getParaRequiredF")
public String getParaRequiredF(@RequestParam(value="tId")Integer typeId) {
System.out.println(typeId);
return "index";
}
参数封装的方式
如果前端传入的参数名与现有的POJO的参数名一致,那么可以使用该POJO的类来获取前端参数
比如登录界面需要传入的参数为:
<form action="<%=path %>/login" method="post">
<input name="username">
<input name="passwd">
<input type="submit" value="提交"></form>
我先有一个叫Member的类,它包含的属性如下:
public class Member {
private Integer id;
private String username;
private String passwd;
private Date logindate;
//...忽略get、set方法
}
那么只要登录界面传入的参数名与Member的一致,就可以在控制器直接用Member接收
@RequestMapping("/testController1")
public String list(String userName,Integer age) {
System.out.println("这是SpringMVC第一个请求");
System.out.println(userName);
System.out.println(age);
//默认以转发方式渲染到视图,没有重定向页面,只有重定向请求
return "list";
}
获取日期
SpringMVC默认的日期格式为YYYY/MM/dd,如果传递别的格式,则需要规定日期格式再接收参数
前端如下:
<a href="<%=path%>/testController/DateDIY?date=2019-08-02">自定义日期请求</a>
控制器获取参数如下:
@RequestMapping("/testController/DateDIY")
public String date2(@DateTimeFormat(pattern="YYYY-MM-dd")Date date) {
System.out.println("这是SpringMVC第一个请求");
System.out.println(date);
//默认以转发方式渲染到视图,没有重定向页面,只有重定向请求
return "list";
}
非必需参数和默认值
有时候前端可能不一定会传递给后端所需的参数,比如说:
后端的某个方法需要a、b这两个参数,但是前端值传递了a这个参数,而且依然要求这个方法处理请求,如果直接这么编码的话,运行时就会报错,那么要怎么处理呢?
使用@RequestParam
中的required
属性,表明某个参数不是必须的,这样就运行的时候就不会报错,但是缺少的参数会被赋值为null
前端如下:
<a href="<%=path%>/goods/getParaRequiredF">非必需传参,空值,且传参名字不一致</a><br/>
后端如下:
@RequestMapping("/getParaRequiredF")
public String getParaRequiredF(@RequestParam(value="tId",required=false)Integer tId) {
if(tId==null) {
System.out.println("没有参数");
}else {
System.out.println(tId);
}
return "index";
}
如果我不想这个值为空,想为它赋一个默认值要怎么办呢?使用@RequestParam
的defaultValue
属性即可
前端如下:
<a href="<%=path%>/goods/getParaDefalt">非必需传参,默认参数</a> <br/>
后端如下:
这样tId
的值就是1而不是null了
@RequestMapping("/getParaDefalt")
public String getParaDefalt(@RequestParam(value="typeId",required=false,defaultValue="1")Integer tId) {
if(tId==1) {
System.out.println("tId= "+tId);
}
return "index";
}
路径方式获得参数
有时候我们可能不在request
中获取参数,而是从路径中获取参数
如:
<a href="<%=path%>/goods/getPathPara/myName">路径传参</a><br/>
我们可以在后端获取myName
这个参数,只需要使用@PathVariable
这个注解,配合@RequestMapping
注解声明路径模板,就可以在方法中获取相应的参数。
需要注意的是{name}
和@PathVariable("name")
两个参数名要一致
后端如下:
@RequestMapping("/getPathPara/{name}")
public String getParam2(@PathVariable("name")String name) {
System.out.println("路径获取参数name= "+name);
return "index";
}
输出结果为:
路径获取参数name= myName
传参给前端
把参数放到response里
控制器代码如下:
@RequestMapping("/login")
public String login(Member member,Model model) {
System.out.println(member.getUsername()+"\t"+member.getPasswd());
model.addAttribute("msg", "hello!");
return "list";
}
前端直接获取即可
<h2>${msg}</h2>
前端显示
hello!