Spring MVC前后端数据交互

目录

一、URL地址映射配置

(1)单个URL 

(2)多个URL

(3)URL映射的请求方式

(4)参数名称映射URL

二、参数传递(前端到后端)

1.简单类型

2.JavaBean 类型

3.List集合

三、JSON数据

@Requestbody

@ResponseBody

四、参数传递(后端到前端)

1.request对象

2.ModelAndView

3.ModelMap

4.Model

5.Map


一、URL地址映射配置

@RequestMapping:通过注解 @RequestMapping 将请求地址与⽅法进⾏绑定,可以在类级别和⽅法级别声明。

类级别的注解负责将⼀个特定的请求路径映射到⼀个控制器上,将 url 和类绑定;⽅法级别的注解可以细化映射,能够将⼀个特定的请求路径映射到某个具体的⽅法上,将 url 和类的⽅法绑定。

(1)单个URL 

 @RequestMapping("请求路径") 或 @RequestMapping(value="请求路径")

@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视图:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<!--获取数据模型-->
    ${hello}
</body>
</html>

(2)多个URL

@RequestMapping({" "," "}) 或 @RequestMapping(value={" "," "})

@RequestMapping({"/test03_01","/test03_02"})

(3)URL映射的请求方式

默认没有设置请求⽅式,在HTTP 请求中最常⽤的请求⽅法是 GET、POST,还有其他的⼀些⽅法, 如:DELET、PUT、HEAD 等。通过 method 属性设置⽀持的请求⽅式,如method=RequestMethod.POST;如设置多种请求⽅式,以⼤括号包围,逗号隔开即可。

@RequestMapping(value = "/test05",method = RequestMethod.POST)

(4)参数名称映射URL

@RequestMapping(params = "test06")

访问地址:

http://ip:port/类路径?test06

二、参数传递(前端到后端)

@RequestParam

在方法入参处使用@RequestParam注解指定其对应的请求参数。

@RequestParam参数描述
name设置参数别名
required是否必需;默认true,表示请求中必须包含对应的参数名。若不存在将抛出异常
defaultValue默认参数名。不推荐使用

1.简单类型

如基本数据类型,包装类以及字符串类:

@RequestParam(defaultValue = "18", name = "userAge") int age,
@RequestParam(defaultValue = "10.0", name = "userMoney") double money

包装类和字符串类当客户端请求参数名与⽅法形参名要保持⼀致,默认参数值为null

2.JavaBean 类型

创建一个对象,让这些参数都成为这个对象的属性,SpringMVC就会将前端传来的这些参数的名称与我们指定的对象(Java Bean)的属性进行名称的对比,如果一致,那么就进行赋值。

@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层中代码:

@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属性:

@Data
public class User {
 private int id;
 private String userName;
 private String userPwd;
 private List<Phone> phones = new ArrayList<Phone>();
}

Phone实体:

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页面定义:

<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层方法:

@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可以放在方法体上,也可以放在方法返回对象前。

@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域中的内容。

 @RequestMapping("model04")
    public String model04(HttpServletRequest request){
        //设置请求域
        request.setAttribute("hello","Hello Request");
        return "model";
    }

model.jsp

<%@ 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对象返回 。

    @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域的赋值。

  @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值的指定,其实并不是必须的。

    @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。

@RequestMapping("model07")
    public String model07(Map map){
    map.put("hello","Hello Map");
    return "model";
  }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值