响应数据和结果视图
- SpringMVC中的处理器方法的返回值用来指定页面跳转到哪个视图,处理器的返回值可以为
String,void,ModelAndView
对象- 返回值分类的详解:
- String类型:
- controller 中的方法返回字符串可以
指定逻辑视图名
,通过视图解析器解析为物理视图地址 - Spring容器配置文件
bean.xml
中配置的视图解析器中注入prefix(前缀)和suffix(后缀)属性,所以视图解析器会把处理器返回的"xxx"解析为"/WEB-INF/pages/xxx.jsp",再请求对应视图.这是一个请求转发过程,浏览器地址栏不会发生变化//指定逻辑视图名,经过视图解析器解析为 jsp 物理路径:/WEB-INF/pages/success.jsp @RequestMapping("/testReturnString") public String testReturnString() { System.out.println("AccountController 的 testReturnString 方法执行了。。。。"); return "success"; }
- controller 中的方法返回字符串可以
- void类型:
- 执行完处理器方法体内代码后,不进行请求转发,而直接转发到当前URL.若没有在
web.xml
中配置当前对应的url-pattern,
则会返回404错误 - 这样的形式,可以使用Servlet原生的API进行页面的跳转,就是将Servlet原生的API当做控制器方法中的参数 使用重定向 或者是请求转发等来进行页面的跳转
// 请求转发 注意的是:手动的转发不能使用视图解析器 request.getRequestDispatcher("/WEB-INF/pages/success.jsp").forward(request, response); // 重定向 注意的是:重定向是不能直接访问WEB-INF文件夹下的内容的,web-inf的权限高 response.sendRedirect("testRetrunString"); //使用response来指定响应的结果 如 json数据 response.setCharacterEncoding("utf-8"); response.setContentType("application/json;charset=utf-8"); response.getWriter().write("json 串");
- 执行完处理器方法体内代码后,不进行请求转发,而直接转发到当前URL.若没有在
- ModelAndView类型:
- ModelAndView是SpringMVC中提供的一个内置的对象,该对象也能当做控制器方法中的返回值 这样能更加灵活的进行属性的添加或者是视图的跳转
- 常用的方法有两种:
- addObject:是将对象存储到modelAndView中 最终会将对象存到request域对象中
- setViewName:指定跳转的页面 使用的是视图解析器 返回String类型的方式同样底层是使用的是ModelAndView
- 注意:返回ModelAndView 类型时,浏览器跳转只能是请求转发
@RequestMapping("/testModelAndView") public ModelAndView testModelAndView(){ // 首先创建对象ModelAndView 两个常用的方法 ModelAndView modelAndView = new ModelAndView(); System.out.println("testModelAndView方法执行成功了"); User user = new User(); user.setUsername("美美"); user.setPassword("123"); user.setAge(30); // 常用的方法1 将user对象存储到modelAndView中 最终会将对象存到request域对象中 modelAndView.addObject("user", user); // 常用的方法2 指定跳转的页面使用的是视图解析器 返回String类型的方式同样底层是使用的是ModelAndView modelAndView.setViewName("success"); return modelAndView; }
- String类型:
- 返回值分类的详解:
- SpringMVC框架提供的请求转发和重定向
- 请求转发: String 类型的返回值,默认就是请求转发
- 要使用SpringMVC框架提供的请求转发,只需要在处理器方法返回的
viewName
字符串首加上forward:
即可,要注意的是,此时forward:
后的地址不能直接被视图解析器解析,因此要写完整的相对路径@RequestMapping("/testForward") public String testForward() { System.out.println("AccountController 的 testForward 方法执行了。。。。"); return "forward:/WEB-INF/pages/success.jsp"; }
- 这样的形式相当于:
request.getRequestDispatcher("实际的url").forward(request,response)
使用请求转发,既能转发到jsp中,也能转发到其他的控制器方法中
- 要使用SpringMVC框架提供的请求转发,只需要在处理器方法返回的
- 重定向:
- 使用SpringMVC框架提供的请求重定向,只需要在处理器方法返回的
viewName
字符串首加上redirect:
即可,要注意的是,此时redirect:
后的地址要写相对于ContextPath的路径 (一般使用request.getContextPath()
来获取contextPath)@RequestMapping("/testForwardOrRedirect") public String testForwardOrRedirect(){ System.out.println("testForwardOrRedirect 方法执行成功了"); // 重定向:使用的是redirect关键字 但是这样的方式不需要在加上项目的名称 return "redirect:/index.jsp"; }
- 注意的一点:是重定向到 jsp 页面,则 jsp 页面不能写在 WEB-INF 目录中,否则无法找到 原因上面说了
- 使用SpringMVC框架提供的请求重定向,只需要在处理器方法返回的
- 请求转发: String 类型的返回值,默认就是请求转发
- SpringMVC响应json格式的数据
- 使用的注解是:
@ResponseBody
- 作用:将 Controller 的方法返回的对象,通过
HttpMessageConverter
接口转换为指定格式的
数据如:json,xml 等,通过Response
响应给客户端
- 作用:将 Controller 的方法返回的对象,通过
- 准备工作:
- 在配置文件中进行
前端控制器
的配置:静态资源不进行拦截否则前端控制器会将所有的资源进行拦截 否则访问静态资源或报404错误 使用的标签是<mvc:resources>
<!-- location属性必须是一个有效的目录,因此必须以 / 结尾 --> <mvc:resources location="/css/" mapping="/css/**"/> <mvc:resources location="/images/" mapping="/images/**"/> <mvc:resources location="/js/" mapping="/js/**"/>
- Springmvc 默认用
MappingJacksonHttpMessageConverter
(类型转换器) 对 json 数据进行转换,需要导入jackson 的包 在pom.xml文件中添加的坐标:
注意:2.7.0 以下的版本用不了<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
- 在jsp页面中发送json数据 使用的是jQuery
<script> // 页面加载,绑定单击事件 $(function () { $("#btn").click(function () { // 发送ajax请求 $.ajax({// 使用的是ajax的形式 // 配置请求参数 url: "user/testAjax", contentType: "application/json;charset=UTF-8", dataType: "json", type: "post", // 请求的json数据 data: '{"username":"myname","password":"mypassowrd","age":30}', // 回调函数,处理服务器返回的数据returnData success: function (returnData) { // 我们假定服务器返回的是一个user对象,将其输出在控制台上 console.log(returnData); } }); }); }); </script>
- 使用
@RequestBody
注解响应json数据@Controller @RequestMapping("/user") public class UserController { @RequestMapping("/testAjax") @ResponseBody public User testAjax(@RequestBody User user) { System.out.println(user); // 将user对象返回给前端页面 return user; } }
- 在前端页面中显示数据
- 在配置文件中进行
- 使用的注解是: