目录
[2.JavaBean 类型](#2.JavaBean 类型)
一、URL地址映射配置
@RequestMapping:通过注解 @RequestMapping 将请求地址与⽅法进⾏绑定,可以在类级别和⽅法级别声明。
类级别的注解负责将⼀个特定的请求路径映射到⼀个控制器上,将 url 和类绑定;⽅法级别的注解可以细化映射,能够将⼀个特定的请求路径映射到某个具体的⽅法上,将 url 和类的⽅法绑定。
(1)单个URL
@RequestMapping("请求路径") 或 @RequestMapping(value="请求路径")
java
@Controller
public class HelloController {
@RequestMapping("/hello")
public ModelAndView hello(){
//得到模型和视图对象
ModelAndView modelAndView = new ModelAndView();
//设置数据模型
modelAndView.addObject("hello","Hello SpringMVC");
//设置视图(名称)
modelAndView.setViewName("hello");
//返回模型和视图
return modelAndView;
}
}
注意:
- 访问地址:http://ip:port/类路径/hello;
- 路径开头是否加斜杠"/"均可;
- @RequestMapping 声明在类上⾯,类中的的⽅法都是以该地址作为⽗路径
hello.jsp视图:
java
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<!--获取数据模型-->
${hello}
</body>
</html>
(2)多个URL
@RequestMapping({" "," "}) 或 @RequestMapping(value={" "," "})
java
@RequestMapping({"/test03_01","/test03_02"})
(3)URL映射的请求方式
默认没有设置请求⽅式,在HTTP 请求中最常⽤的请求⽅法是 GET、POST,还有其他的⼀些⽅法, 如:DELET、PUT、HEAD 等。通过 method 属性设置⽀持的请求⽅式,如method=RequestMethod.POST;如设置多种请求⽅式,以⼤括号包围,逗号隔开即可。
java
@RequestMapping(value = "/test05",method = RequestMethod.POST)
(4)参数名称映射URL
java
@RequestMapping(params = "test06")
访问地址:
http://ip:port/类路径?test06
二、参数传递(前端到后端)
@RequestParam
在方法入参处使用@RequestParam注解指定其对应的请求参数。
|-----------------|---------------------------------------|
| @RequestParam参数 | 描述 |
| name | 设置参数别名 |
| required | 是否必需;默认true,表示请求中必须包含对应的参数名。若不存在将抛出异常 |
| defaultValue | 默认参数名。不推荐使用 |
1.简单类型
如基本数据类型,包装类以及字符串类:
java
@RequestParam(defaultValue = "18", name = "userAge") int age,
@RequestParam(defaultValue = "10.0", name = "userMoney") double money
包装类和字符串类当客户端请求参数名与⽅法形参名要保持⼀致,默认参数值为null
2.JavaBean 类型
创建一个对象,让这些参数都成为这个对象的属性,SpringMVC就会将前端传来的这些参数的名称与我们指定的对象(Java Bean)的属性进行名称的对比,如果一致,那么就进行赋值。
java
@Data
public class User{
private int id;
private int age;
private String name;
private String birthday;
private String school;
private String city;
private String area;
private double salary
}
Controller层中代码:
java
@RequestMapping("/bean")
public String testBean(User user){
System.out.println(user);
}
SpringMVC底层将请求中的参数剥离出来,然后调用指定的这个对象(Java Bean)的setter方法来为同名的属性进行赋值,当我们用的时候,直接使用getter方法来用。
访问地址:
http://ip:port/类路径?id=1&age=18&name=zhangsan
3.List集合
以List集合参数类型接收前端传来的参数,其实就是将前端传来的参数在后端Controller中自动进行类型的转换,转换成Java中的List集合类型来存储前端传来的参数。想要springmvc自动将接收的参数转换成List集合类型,需要将List集合定义在Java Bean中,对于集合的参数绑定,⼀般需要使⽤ JavaBean 对象进⾏包装。Set集合与List集合类似。
User实体类中定义List属性:
java
@Data
public class User {
private int id;
private String userName;
private String userPwd;
private List<Phone> phones = new ArrayList<Phone>();
}
Phone实体:
java
public class Phone {
private String num;
public String getNum() {
return num;
}
public void setNum(String num) {
this.num = num;
}
@Override
public String toString() {
return "Phone [num=" + num + "]";
}
}
JSP页面定义:
java
<form action="data08" method="post">
<input name="phones[0].num" value="123456" />
<input name="phones[1].num" value="4576" />
<button type="submit"> 提交</button>
</form>
Controller层方法:
java
@RequestMapping("/list")
public void data08(User user){
System.out.println(user);
}
三、JSON数据
@Requestbody
该注解⽤于读取 Request 请求的 body 部分数据,使⽤系统默认配置的 HttpMessageConverter 进⾏解析,然后把相应的数据绑定到要返回的对象上 ,再把 HttpMessageConverter 返回的对象数据绑定到 controller 中⽅法的参数上。@RequestBody接受的是⼀个 json 格式的字符串,⼀定是⼀个字符串。
@ResponseBody
该注解⽤于将 Controller 的⽅法返回的对象,通过适当的 HttpMessageConverter 转换为指定格式后, 写⼊到 Response 对象的 body 数据区。@ResponseBody可以放在方法体上,也可以放在方法返回对象前。
java
@ResponseBody
public User getUser(@RequestBody User user){
System.out.println(user);
return user;
}
四、参数传递(后端到前端)
进行模型数据的处理,控制层(Controller)是为了生产模型数据(Model),而视图(View)最终也是为了渲染模型数据并进行输出。那么如何将模型数据传递给视图,则是Spring MVC框架的一项重要工作。
输出数据模型方式:
1.request对象
这种方式是最传统的方式,直接向request域中进行参数的传递,通过setAttribute()方法,来指定key和value,即可在前端页面model.jsp中直接获取到request域中的内容。
java
@RequestMapping("model04")
public String model04(HttpServletRequest request){
//设置请求域
request.setAttribute("hello","Hello Request");
return "model";
}
model.jsp
java
<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
<html>
<head>
<title>Hello</title>
</head>
<body>
<h2>${hello}</h2>
</body>
</html>
2.ModelAndView
控制器处理方法的返回值若为ModelAndView,则既包含视图 信息,又包含模型数据信息。
Spring MVC独有的ModelAndView对象,通过声明一个ModelAndView类型的对象,就可以使用这个对象来传值或者是指定跳转的页面路径。采用addObject()方法,来规定key和value,即可在前端页面中根据key拿取到对应value的值。通过采用setViewName()方法,来传入一个页面的名称,springmvc底层的视图解析器就会将ModelAndView中的view视图进行前缀和后缀的拼接加工,并给最终的页面跳转路径。当然,这里执行方法的返回类型需要是ModelAndView类型,方法最终需要将modelAndView对象返回 。
java
@RequestMapping("model03")
public ModelAndView model03(){
ModelAndView modelAndView = new ModelAndView("model");
//添加数据模型
//第一个参数为key值,第二个参数为key对应的value。key值可以随意指定
modelAndView.addObject("hello","Hello SpringMVC");
//设置视图名称
modelAndView.setViewName("/user/index")
return modelAndView;
}
3.ModelMap
ModelMap对象与request对象相似,可以采用addAttribute()方法来传递参数,向ModelMap对象中添加key和value,其实就是在向request域中添加key和value,只不过ModelMap是又将request进行了一层封装,原因是彻底与Servlet的内容分离,仅用SpringMVC的对象,就可以完成对request域的赋值。
java
@RequestMapping("model06")
public String model06(ModelMap modelMap){
//设置请求域
modelMap.addAttribute("hello","Hello ModelMap");
return "model";
}
4.Model
Controller处理方法使用Model对象入参,把需要传递的模型数据放入Model中即可,返回字符串类型的逻辑视图名;在页面就可以直接使用EL表达式**${}**,即可获得数值。
Model的addAttribute方法与ModelAndView对象添加模型数据的方法用法都是一样的,即Model对象也是一个Map类型的数据结构,并且对于key值的指定,其实并不是必须的。
java
@RequestMapping("model05")
public String model05(Model model){
//Spring MVC会自动实例化一个Model对象用于向视图中传值
model.addAttribute("hello","Hello Model");
return "model";
}
5.Map
声明一个Map集合,并使用put()传递key和value,就可以被springmvc解析成向request域中传递值。底层就是使用request.setAttribute()在赋值。而无需引入request对象,仅仅使用一个简单的map集合,就可以完成对request对象的操作。彻底与Servlet解耦。在jsp页面中可直通过${hello}获得到值Hello Map。
java
@RequestMapping("model07")
public String model07(Map map){
map.put("hello","Hello Map");
return "model";
}