Spring MVC-转发和重定向&数据绑定

tech2025-01-21  1

Spring MVC

JSP 页面的转发和重定向

Spring MVC 默认以转发的形式响应 JSP,可以手动设置为重定向。

@RequestMapping("test") public String test(){ return "redirect:/test.jsp"; }

转发

@RequestMapping("test") public String test(){ return "forward:/test.jsp"; } @RequestMapping("test") public String test(){ return "test"; }

Spring MVC 数据绑定

基本数据类型 @RequestMapping("/int") @ResponseBody public String intTest(@RequestParam("id") int num){ return "num:"+num; } 包装类 @RequestMapping("/package") @ResponseBody public String packageTest(Integer num){ return "num:"+num; } 数组 @RequestMapping("/array") @ResponseBody public String arrayTest(String[] name){ for (String str:name){ System.out.println(str); } return name.toString(); } POJO @RequestMapping("/pojo") @ResponseBody public String pojoTest(User user){ return user.toString(); } List

自定义包装类

package com.southwind.entity; import java.util.List; public class UserList { private List<User> users; public List<User> getUsers() { return users; } public void setUsers(List<User> users) { this.users = users; } } @RequestMapping("/list") @ResponseBody public String listTest(UserList userList){ for(User user:userList.getUsers()){ System.out.println(user); } return "ok"; } <%-- Created by IntelliJ IDEA. User: southwind Date: 2019-08-15 Time: 21:00 To change this template use File | Settings | File Templates. --%> <%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>Title</title> </head> <body> <form action="/data/list" method="post"> <input type="text" name="users[0].id"/><br/> <input type="text" name="users[0].name"/><br/> <input type="text" name="users[1].id"/><br/> <input type="text" name="users[1].name"/><br/> <input type="text" name="users[2].id"/><br/> <input type="text" name="users[2].name"/><br/> <input type="submit"/> </form> </body> </html>

JSON

pom.xml

<dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.18</version> </dependency>

springmvc.xml

<mvc:annotation-driven> <!-- 消息转换器 --> <mvc:message-converters register-defaults="true"> <!-- fastjson --> <bean class="com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter4"></bean> </mvc:message-converters> </mvc:annotation-driven>

JSP

<%-- Created by IntelliJ IDEA. User: southwind Date: 2019-08-15 Time: 21:11 To change this template use File | Settings | File Templates. --%> <%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>Title</title> <script type="text/javascript" src="js/jquery-1.8.3.min.js"></script> <script type="text/javascript"> $(function(){ var user = { "id":1, "name":"张三" }; $.ajax({ url:"/data/json", data:JSON.stringify(user), type:"POST", contentType:"application/json;charset=UTF-8", dataType:"text", success:function(data){ alert(data); } }) }); </script> </head> <body> </body> </html>

Handler

@RequestMapping("/json") @ResponseBody public String json(@RequestBody User user){ System.out.println(user); return user.toString(); }

Spring MVC 视图解析

业务数据的绑定是指将业务数据绑定给 JSP 域对象,并且在客户端进行展示。

pageContext、request、session、application

业务数据的绑定是由 ViewResolver 完成。

Spring MVC 提供了以下几种方式绑定业务数据:

MapModelModelAndView@SessionAttribute@ModelAttribute

业务数据绑定到 request 域对象

Map

Spring MVC 在内部使用 Model 接口存储业务数据,在调用业务方法之前会创建一个隐含对象作为业务数据的存储容器。设置业务方法的入参为 Map 类型,Spring MVC 会将隐含对象的引用传递给入参。

开发者可以对模型中的所有数据进行管理,包括访问和添加、修改、删除。开发者只需要在业务方法处添加 Map 类型的入参,方法体中便可以通过对入参的操作来完成业务数据的添加。

@RequestMapping("/map") public String mapTest(Map<String,User> map){ User user = new User(); user.setId(1); user.setName("张三"); map.put("user",user); return "show"; }

Model

与 Map 类似,业务方法通过入参来完成业务数据的绑定。

@RequestMapping("/model") public String modelTest(Model model){ User user = new User(); user.setId(1); user.setName("张三"); model.addAttribute("user",user); return "show"; }

HttpServletRequest

@RequestMapping("/request") public String request(HttpServletRequest request){ User user = new User(); user.setName("李四"); user.setId(2); request.setAttribute("user",user); return "show"; }

ModelAndView

与 Map、Model 不同的是,ModelAndView 不但包含了业务数据,同时也包含了视图信息,将视图和业务数据进行了整合,封装成一个对象,如果使用 ModelAndView 来处理业务数据,业务方法的返回值必须是 ModelAndView 对象。

业务方法中对 ModelAndView 进行两个操作:

填充业务数据绑定视图信息 @RequestMapping("/modelAndView") public ModelAndView modelAndView(){ User user = new User(); user.setId(3); user.setName("王五"); ModelAndView modelAndView = new ModelAndView(); modelAndView.addObject("user",user); modelAndView.setViewName("show"); return modelAndView; } @RequestMapping("/modelAndView2") public ModelAndView modelAndView2(){ User user = new User(); user.setId(11); user.setName("小明"); ModelAndView modelAndView = new ModelAndView(); modelAndView.addObject("user",user); View view = new InternalResourceView("/show.jsp"); modelAndView.setView(view); return modelAndView; }
最新回复(0)