2.3 路径传参
知识点3:@PathVariable
如果我要通过id进行删除某一项可以用PathVariable注释,示例:
@RequestMapping("/hello3/{bid}") public String toHello3(@PathVariable("bid") Integer bid) { log.info("使用@PathVariable注解传递参数:{}", bid); return "index"; }
运行结果:
2.4 Json数据传参
在实际开发中运用最多的就是通过Json数据进行传输,在本篇就没有演示对象、数组、以及集合传输,其传输方式与上普通传参略微有异。
SpringMVC默认使用的是jackson来处理json的转换,所以需要在pom.xml添加jackson依赖
<jackson.version>2.9.3</jackson.version> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>${jackson.version}</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-core</artifactId> <version>${jackson.version}</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-annotations</artifactId> <version>${jackson.version}</version> </dependency>
知识点4:@RequestBody
@RequestBody 注解用于将HTTP请求的请求体内容绑定到方法的参数上。它告诉Spring MVC框架将请求体的内容转换为指定的参数类型,并将其传递给方法进行处理。
使用@RequestBody注解的参数可以是任何Java对象类型,包括自定义的POJO(Plain Old Java Object)类。Spring MVC会自动根据请求体的内容类型,使用适当的转换器将请求体的内容转换为指定的参数类型。
- json对象({key1:value1,key2:value2,…})
请求和数据的发送:
{ "bid": 1, "bname": "斗破苍穹", "price": 9.9 }
后端接收数据:
@RequestMapping("/hello5") @ResponseBody public String toHello5(@RequestBody Book book) { System.out.println(book); return "index"; }
- json对象数组([{key1:value1,…},{key2:value2,…}])
请求和数据的发送:
[{ "bid": 1, "bname": "斗破苍穹", "price": 9.9 }, { "bid": 2, "bname": "斗破苍穹", "price": 10.9 } ]
后端接收数据:
@RequestMapping("/hello6") @ResponseBody public String toHello6(@RequestBody List<Book> books) { System.out.println(books); return "index"; }
@RequestBody与@RequestParam区别
区别:
- @RequestParam用于接收url地址传参,表单传参【application/x-www-form-urlencoded】
- @RequestBody用于接收json数据【application/json】
应用:
- 后期开发中,发送json格式数据为主,@RequestBody应用较广
- 如果发送非json格式数据,选用@RequestParam接收请求参数
三、响应
3.1 响应Json数据
1. 创建控制器:ReturnController类
package com.ycxw.web; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; /** * @author 云村小威 * @site blog.csdn.net/Justw320 * @create 2023-09-06 22:18 */ @Controller @RequestMapping("/rs") public class ReturnController { }
2. 编写响应数据
@ResponseBody //响应Json数据 @RequestMapping("/return1") public Map<String, Object> return1(HttpServletResponse response){ Map<String,Object> maps = new HashMap<>(); maps.put("code",200); maps.put("msg","响应成功"); return maps; }
3. 测试:
3.2 跳转页面响应数据
1. 编写响应的jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>Title</title> </head> <body> 昵称:${name} 又爱又恨:${hobby} </body> </html>
2. 编写响应的数据
@RequestMapping("/return2") public String return2(Model model, HttpServletRequest request){ //填充模型数据 model.addAttribute("name","云村小威"); request.setAttribute("hobby","编程"); //逻辑视图名 return "index"; }
3. 测试:
3.3 ModelAndView 响应
- ModelAndView是一个在Java Spring框架中使用的类,用于将数据模型和视图信息一起传递给前端页面。它是一种将数据和视图结合在一起的方式,方便开发人员在后端控制器中处理数据并将其传递给前端页面进行展示。
- 在ModelAndView中,"Model"表示数据模型,它是一个存储数据的对象,可以在后端控制器中设置数据,并将其传递给前端页面。开发人员可以使用键值对的方式将数据存储在模型中,然后在前端页面中使用这些数据进行展示或处理。
- 而"View"表示视图,它是前端页面的表示。在ModelAndView中,开发人员可以设置要展示的视图的名称或路径,以便在请求处理完成后,将数据模型传递给相应的视图进行渲染和展示。
- 通过使用ModelAndView,开发人员可以将数据和视图信息封装在一起,方便地传递给前端页面,实现数据的动态展示和交互。这种方式使得后端控制器和前端页面之间的数据传递更加灵活和方便。
@RequestMapping("/return3") public ModelAndView return3(){ ModelAndView mv = new ModelAndView(); //填充模型数据 mv.addObject("name","云村小威"); mv.addObject("hobby","编程"); //逻辑视图名 mv.setViewName("index"); return mv; }
测试:
四、页面跳转
转发(forward:path)和重定向(redirect:path)这两种跳转方式将会绕开视图解析器的前缀和后缀;还有就是如果是在同一controller中则不用使用"/"从根目录开始,而如果是在不同的controller则一定要从根目录开始。
4.1 转发(地址栏不变)
@RequestMapping("/helloPage1") public String toHelloPage1(){ System.out.println("helloPage1..."); return "forward:return1"; }
它相当于“request.getRequestDispatcher("url").forward(request,response)”。使用转发,既可以转发到jsp, 也可以转发到其他的控制器方法。
4.2 重定向(地址栏改变)
@RequestMapping("/helloPage2") public String toHelloPage2(){ System.out.println("helloPage2..."); return "redirect:return1"; }
它相当于“response.sendRedirect(url)”, 也可以转发到其他的控制器方法。
4.3 跳其它的controller
/*转发*/ @RequestMapping("/helloPage3") public String toHelloPage3(){ System.out.println("helloPage3..."); return "forward:/param/hello1"; } /*重定向*/ @RequestMapping("/helloPage4") public String toHelloPage4(){ System.out.println("helloPage4..."); return "redirect:/param/hello1"; }
测试重定向:redirect:/param/hello1
如果是在同一controller中则不用使用 "/" 从根目录开始,而如果是在不同的controller则一定要从根目录开始。