SpringMVC的响应数据的返回值分类

SpringMVC响应数据类型详解
本文详细介绍了SpringMVC框架下三种响应数据类型的使用场景和实现方式:字符串(String)、空(void)及ModelAndView对象。通过具体示例,阐述了如何通过这三种类型返回视图、直接响应数据或进行页面跳转。

响应数据的返回值分类

  1. 1. 返回字符串

    Controller方法返回值是字符串,可以指定逻辑视图的名称,根据视图解析器为物理视图的地址。

     

    1.   @RequestMapping(value="/hello")
            public String sayHello() {
                System.out.println("Hello SpringMVC!!");
                // 跳转到页面
                return "success";
            }

       

    2. 具体的应用场景

      @Controller
      @RequestMapping("/user")
      public class UserController {
      	
      	/**
      	 * 请求参数的绑定
      	 */
      	@RequestMapping(value="/initUpdate")
      	public String initUpdate(Model model) {
      		// 模拟从数据库中查询的数据
      		User user = new User();
      		user.setUsername("张三");
      		user.setPassword("123");
      		user.setMoney(100d);
      		user.setBirthday(new Date());
      		model.addAttribute("user", user);
      		return "update";
      	}
      	
      }
      
      	<h3>修改用户</h3>
      	${ requestScope }
      	<form action="user/update" method="post">
      		姓名:<input type="text" name="username" value="${ user.username }"><br>
      		密码:<input type="text" name="password" value="${ user.password }"><br>
      		金额:<input type="text" name="money" value="${ user.money }"><br>
      		<input type="submit" value="提交">
      	</form>

       

    2. 返回值是void

     

    1. 如果控制器的方法返回值编写成void,执行程序报404的异常,默认查找JSP页面没有找到。

      默认会跳转到@RequestMapping(value="/initUpdate") initUpdate的页面。
    2. 可以使用请求转发或者重定向跳转到指定的页面

      @RequestMapping(value="/initAdd")
      	public void initAdd(HttpServletRequest request,HttpServletResponse response) throws Exception {
      		System.out.println("请求转发或者重定向");
      		// 请求转发
      		// request.getRequestDispatcher("/WEB-INF/pages/add.jsp").forward(request, response);
      		// 重定向
      		// response.sendRedirect(request.getContextPath()+"/add2.jsp");
      		
      		response.setCharacterEncoding("UTF-8");
      		response.setContentType("text/html;charset=UTF-8");
      		
      		// 直接响应数据
      		response.getWriter().print("你好");
      		return;
      	}

       
       

       

3.返回值是ModelAndView对象

ModelAndView对象是Spring提供的一个对象,可以用来调整具体的JSP视图

/**
	 * 返回ModelAndView对象
	 * 可以传入视图的名称(即跳转的页面),还可以传入对象。
	 * @return
	 * @throws Exception
	 */
	@RequestMapping(value="/findAll")
	public ModelAndView findAll() throws Exception {
		ModelAndView mv = new ModelAndView();
		// 跳转到list.jsp的页面
		mv.setViewName("list");
		
		// 模拟从数据库中查询所有的用户信息
		List<User> users = new ArrayList<>();
		User user1 = new User();
		user1.setUsername("张三");
		user1.setPassword("123");
		
		User user2 = new User();
		user2.setUsername("赵四");
		user2.setPassword("456");
		
		users.add(user1);
		users.add(user2);
		// 添加对象
		mv.addObject("users", users);
		
		return mv;
	}




跳转的页面:
	
	<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    
    <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
    
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>

	<h3>查询所有的数据</h3>
	<c:forEach items="${ users }" var="user">
		${ user.username }
	</c:forEach>

</body>
</html>

 

 

小结:

 SpringMVC的响应数据分为三类,String,void和ModelAndView

1,返回值是String时,会将数据封装成一个实例对象

2,返回值是void时,有请求转发/重定向/直接响应三种情况

3,返回值是ModelAndView时,也就是返回值是String的底层实现方式




 

 

 

<think>嗯,用户想了解Spring MVC的响应数据方式。我得先回忆一下Spring MVC处理响应的各种方法。首先,控制器返回字符串通常用于视图名称,但用户可能更关心数据绑定,比如@ResponseBody和@RestController的区别。还有ModelAndView对象,这个可能比较基础,但需要提到。 然后,返回对象或集合,配合@ResponseBody自动转JSON或XML,这部分很重要,特别是现在RESTful API流行。可能需要解释消息转换器的工作原理,比如HttpMessageConverter接口,以及如何根据Content-Type处理不同格式。 还有直接写回HttpServletResponse的情况,比如用OutputStream手动输出,虽然不常用,但在特定场景下有用。比如文件下载或者需要细粒度控制响应时。 可能用户还会关心视图技术,比如JSP、Thymeleaf,虽然现在前后端分离多了,但传统方法还是有必要提一下。此外,ResponseEntity可以自定义状态码和头信息,适合需要更多控制的场景。 别忘了@RestController是组合了@Controller和@ResponseBody,简化了REST控制器的编写。另外,路径变量@PathVariable和请求参数@RequestParam如何绑定到响应数据里,可能需要举例说明。 还要注意不同的内容类型,比如JSON和XML的配置,可能需要依赖如Jackson或JAXB库。消息转换器的配置方法,比如WebMvcConfigurer里添加转换器。 可能用户在实际开发中会遇到乱码问题,所以需要提到produces属性设置charset=UTF-8,或者在配置中统一设置消息转换器的字符编码。 最后,总结各种方式的适用场景,帮助用户根据需求选择合适的方法。比如前后端分离常用@RestController返回JSON,传统应用可能用ModelAndView结合模板引擎。</think>Spring MVC 提供了多种响应数据的方式,以下是核心方法分步详解: 1. **返回视图名称(传统模式)** ```java @Controller @RequestMapping("/demo") public class DemoController { @GetMapping("/view") public String showView(Model model) { model.addAttribute("message", "Hello Thymeleaf"); return "demoPage"; // 对应src/main/resources/templates/demoPage.html } } ``` - 配合视图解析器(如Thymeleaf、JSP) - 数据通过Model对象传递 2. **返回字符串内容** ```java @Controller public class TextController { @GetMapping(value = "/text", produces = "text/plain;charset=UTF-8") @ResponseBody public String getText() { return "直接文本响应"; } } ``` - 需要@ResponseBody注解 - 设置produces属性定义MIME类型 3. **返回JSON/XML(RESTful常用)** ```java @RestController // 组合了@Controller + @ResponseBody @RequestMapping("/api") public class ApiController { @GetMapping("/user/{id}") public User getUser(@PathVariable int id) { return new User(id, "张三", 25); } @GetMapping("/list") public List<User> getUsers() { return Arrays.asList( new User(1, "李四", 30), new User(2, "王五", 28) ); } } ``` - 自动通过Jackson库转换对象为JSON - 需要配置消息转换器: ```xml <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> </dependency> ``` 4. **ModelAndView 对象** ```java @Controller public class MavController { @GetMapping("/mav") public ModelAndView getMAV() { ModelAndView mav = new ModelAndView("viewName"); mav.addObject("key", "value"); return mav; } } ``` - 可同时控制视图和数据 - 适合需要灵活设置响应头的场景 5. **ResponseEntity 精控响应** ```java @GetMapping("/custom") public ResponseEntity<Map<String, Object>> customResponse() { Map<String, Object> body = new HashMap<>(); body.put("status", 200); body.put("data", "自定义响应"); return ResponseEntity.status(HttpStatus.ACCEPTED) .header("X-Custom-Header", "value") .body(body); } ``` - 可设置状态码、响应头、内容类型 - 适用于需要精确控制HTTP响应的场景 6. **直接操作HttpServletResponse** ```java @GetMapping("/manual") public void manualResponse(HttpServletResponse response) throws IOException { response.setContentType("text/html"); response.setCharacterEncoding("UTF-8"); PrintWriter writer = response.getWriter(); writer.write("<h1>手动输出</h1>"); writer.flush(); } ``` - 完全控制响应对象 - 适用于文件下载等特殊需求 **配置关键点:** 1. 消息转换器配置(WebMvcConfigurer): ```java @Configuration public class WebConfig implements WebMvcConfigurer { @Override public void configureMessageConverters(List<HttpMessageConverter<?>> converters) { converters.add(new MappingJackson2HttpMessageConverter()); converters.add(new StringHttpMessageConverter(StandardCharsets.UTF_8)); } } ``` 2. 常见注解: - `@ResponseBody`:方法返回值直接作为响应体 - `@RestController`:类级别组合注解 - `@RequestMapping(produces = "application/json")`:指定输出格式 **选择策略:** - 前后端分离:优先使用@RestController + JSON - 传统Web应用:视图名称 + 模板引擎 - 特殊需求:ResponseEntity或直接操作HttpServletResponse 这些方式覆盖了从传统Web应用到现代RESTful服务的各种场景,开发者可根据具体需求灵活选择组合使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值