响应数据与视图
返回字符串
Controller 方法返回字符串可以指定逻辑视图的名称,根据视图解析器为物理视图的地址。
@RequestMapping(value="/hello") public String sayHello() { // 跳转到 success 页面 return "success"; }
返回 void
1、默认会跳转到同 mapping 同名的页面,如@RequestMapping(value="/hello")
默认跳转到 hello 页面,不存在报 404
2、已知道 Servlet 原始 API 可以作为控制器中方法的参数,可使用其做转发或重定向
@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"); // 用 getWriter()直接响应数据 response.getWriter().print(" 你好 "); return; }
3、使用 SpringMVC 关键字进行转发与重定向
如下重定向与转发不仅仅可以跳页面也能跳到其他 Controller 的 mapping
//"forward: 转发的 JSP 路径 ",不走视图解析器了,所以需要编写完整的路径 // 转发 @RequestMapping("/delete") public String delete() throws Exception { // return "forward:/WEB-INF/pages/success.jsp"; return "forward:/user/findAll"; } // 重定向 到本机不需要完整路径 @RequestMapping("/count") public String count() throws Exception { return "redirect:/add.jsp"; // return "redirect:/user/findAll"; }
Model 与 ModelAndView
Model
Model 作为参数可调用其 addAttribute 方法添加数据到 request 域,如下:
@RequestMapping(value = "/initUpdate") public String initUpdate(Model model) { // 模拟从数据库中查询的数据 User user = new User(); user.setUsername(" 张三 "); model.addAttribute("user", user); return "update"; }
在 jsp 页面可通过 ${requestScope}
或 ${user.username}
调用 request 中内容。
ModelAndView
ModelAndView 对象是 Spring 提供的一个对象,可以用来调整具体的 JSP 视图。它可以同时传入跳转页面名与数据对象,与上方 Model 功能差不多。只是 Model 将数据存在 Model 中,返回 String 页面名称,一般作为参数,但 ModelAndView 是作为返回值的。
/** * 返回 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; }
JSP 页面开启 c 标签调用
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
获取集合中值通过 forEach 遍历
<c:forEach items="${ users }" var="user"> ${ user.username } </c:forEach>
ResponseBody 返回 json
@ResponseBody 注解写在方法上或者方法返回的类型前,或者写在类上或者使用 @RestCotroller 注解
public @ResponseBody Address testJson(@RequestBody String body) {}
RequestBody 转对象
上述代码如果 @RequestBody 注解修饰的 String 变量封装成 JavaBean 对象
public @ResponseBody Address testJson(@RequestBody Address address) {}
使用 jackson 添加 jar 包即可,Springmvc 默认用 MappingJacksonHttpMessageConverter 对 json 数据进行转换
<dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.9.0</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-core</artifactId> <version>2.9.0</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-annotations</artifactId> <version>2.9.0</version> </dependency>
- 返回字符串
- 返回 void
- Model 与 ModelAndView
- Model
- ModelAndView
- ResponseBody 返回 json
- RequestBody 转对象
- 返回字符串
- 返回 void
- Model 与 ModelAndView
- Model
- ModelAndView
- ResponseBody 返回 json
- RequestBody 转对象