1、页面跳转: (1)返回值void类型形式 (2)返回字符串形式 (3)返回ModelAndView对象 (4)向request域存储数据 2、回写数据: (1)直接返回字符串 导入jackson-core、jackson-databind、jackson-annotations依赖 (2)返回对象或集合
时间: 2025-06-25 21:02:49 浏览: 7
### Spring MVC 中页面跳转和数据回写的多种方式
#### 1. **返回值类型 `void` 的使用**
当方法的返回值为 `void` 时,可以通过手动操作 `HttpServletResponse` 对象来完成数据回写。这种方式适用于简单的字符串或 JSON 数据返回场景。
```java
@RequestMapping("/quick6")
public void save6(HttpServletResponse response) throws IOException {
response.setContentType("text/plain;charset=UTF-8");
response.getWriter().print("hello itcast");
}
```
此代码片段展示了如何通过 `response.getWriter().print()` 方法向客户端发送纯文本数据[^1]。
对于更复杂的 JSON 数据返回,可以借助工具类封装 JSON 序列化逻辑:
```java
@Controller
@RequestMapping("/rs")
public class ReturnController {
@RequestMapping("/hello")
public void hello(HttpServletResponse response) {
Map<String, Object> map = new HashMap<>();
map.put("code", 200);
map.put("msg", "成功添加");
try {
ResponseUtil.writeJson(response, map);
} catch (Exception e) {
e.printStackTrace();
}
}
}
```
这里利用了一个自定义工具类 `ResponseUtil` 来简化 JSON 响应过程[^2]。
---
#### 2. **返回值类型 `String` 的使用**
如果控制器方法返回的是一个字符串,则该字符串会被解释为视图名称。Spring MVC 默认会将其解析为对应的 JSP 文件路径或其他模板文件路径。
例如:
```java
@RequestMapping("/success")
public String success(Model model) {
User user = new User("张三", "123456");
model.addAttribute("user", user);
return "success";
}
```
在此示例中,`User` 对象被存入模型 (`Model`) 并传递到名为 `success.jsp` 的视图页面中渲染[^3]。
---
#### 3. **返回值类型 `ModelAndView` 的使用**
`ModelAndView` 是一种更为灵活的方式来处理视图和数据绑定。它允许开发者显式设置视图名称并同时将多个属性放入模型中。
```java
@RequestMapping("/modelAndViewExample")
public ModelAndView modelAndViewExample() {
ModelAndView mav = new ModelAndView();
User user = new User("李四", "password123");
mav.addObject("user", user);
mav.setViewName("success");
return mav;
}
```
这段代码创建了一个 `ModelAndView` 实例,设置了视图名称 `"success"` 和模型中的键值对 `(key="user", value=user)`[^3]。
---
#### 4. **请求域存储的数据传递**
除了通过 `ModelAndView` 或者 `Model` 接口外,还可以直接将数据存入请求作用域(Request Scope)。这通常用于较简单的情况。
```java
@RequestMapping("/requestScopeExample")
public String requestScopeExample(HttpServletRequest request) {
User user = new User("王五", "qwerty");
request.setAttribute("user", user);
return "success";
}
```
在这里,`HttpServletRequest` 被用来将 `User` 对象存入当前请求的作用域中。
---
#### 5. **JSON 序列化的依赖配置**
为了支持自动将 Java 对象转换成 JSON 格式的响应体,需要引入 Jackson 相关库作为默认的 JSON 处理器。以下是常用的 Maven 依赖项:
```xml
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.13.0</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.13.0</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>2.13.0</version>
</dependency>
```
这些依赖分别提供了核心功能、数据绑定能力和注解支持。一旦引入它们,在控制器方法中可以直接返回 POJO 类型的对象,框架会自动将其序列化为 JSON 字符串。
```java
@RestController
@RequestMapping("/api/user")
public class UserController {
@GetMapping("/{id}")
public ResponseEntity<User> getUserById(@PathVariable Long id) {
User user = userService.findById(id);
return ResponseEntity.ok(user);
}
}
```
在这个例子中,由于标注了 `@RestController` 注解,因此无需额外指定视图名,返回的结果会直接以 JSON 形式呈现给调用方[^2]。
---
#### 6. **页面跳转机制:Forward vs Redirect**
在 Spring MVC 中有两种常见的页面跳转方式——转发(Forward)和重定向(Redirect),两者的主要区别在于浏览器地址栏的变化与否以及 HTTP 请求次数的不同。
##### Forward(转发)
转发不会改变用户的 URL 地址,并且只涉及单次服务器端内部跳转。
```java
@RequestMapping("/forwardExample")
public String forwardExample() {
return "forward:/targetPage"; // 不修改浏览器地址栏
}
```
##### Redirect(重定向)
重定向会使浏览器发起新的 GET 请求,从而更新其地址栏显示的内容。
```java
@RequestMapping("/redirectExample")
public String redirectExample() {
return "redirect:/newLocation"; // 修改浏览器地址栏
}
```
这两种方式的选择取决于具体业务需求[^3]。
---
### 总结
以上介绍了 Spring MVC 中几种主要的页面跳转与数据回写技术手段及其适用场景。无论是采用何种形式,都需要根据实际项目特点权衡性能开销和服务质量等因素做出合理决策。
阅读全文
相关推荐














