17 SpringMVC response响应
1.Model、ModelMap和ModelAndView的使用详解
Spring-MVC在请求处理方法可出现和返回的参数类型中,最重要就是Model和ModelAndView了,对于MVC框架,控制器Controller执行业务逻辑,用于产生模型数据Model,而视图View用于渲染模型数据。
SpringMVC在调用方法前会创建一个隐含的数据模型,作为模型数据(Model、ModelMap和ModelAndView)的存储容器, 成为”隐含模型”。 也就是说在每一次的前后台请求的时候会随带这一个背包,不管你用没有,这个背包确实是存在的,用来盛放我们请求交互传递的值;
使用Model和ModelAndView这两个类在spring的视图解析时作用以及区别:
(1)Model只是用来传输数据的,并不会进行业务的寻址。Model是每一次请求可以自动创建,可以用model来接收各种类型的数据.Model对象的作用主要是保存数据,可以借助它们将数据带到前端。Model对象可以将数据存到request域中。
原理归纳:业务方法执行完成后,返回Model给 DispatcherServlet,DispatcherServlet 通过 ViewResolver 对视图信息进行解析,逻辑视图映射到物理视图,同时将模型数据绑定到 JSP 的 request 域对象中,在 JSP 页面,可直接通过 EL 表达式取值。
(2)ModelAndView 却是可以进行业务寻址的,就是设置对应的要请求的静态文件,这里的静态文件指的是类似jsp的文件。 ModelAndView 是需要我们自己去new的。
(3)ModelMap对象主要用于传递控制方法处理过的数据到结果页面,也就是说我们把结果页面上需要的数据放到ModelMap对象中即可, 他的作用类似于request对象的setAttribute方法的作用: 用来在一个请求过程中传递处理的数据。 ModelMap或者Model通过addAttribute方法向页面传递参数.
参考文献:https://blog.csdn.net/ITBigGod/article/details/79685610
2.Model的使用案例
(1)搭建项目
(2)部分重要代码
<1>springmvc.xml
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:context="http://www.springframework.org/schema/context" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> <!-- 开启注解扫描 --> <context:component-scan base-package="lucky"/> <!-- 视图解析器对象 --> <bean id="internalResourceViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <!--配置控制器方法中return返回的字符串对应的同名文件所在目录--> <property name="prefix" value="/WEB-INF/pages/"/> <!--配置文件的后缀名--> <property name="suffix" value=".jsp"/> </bean> <!-- 开启SpringMVC框架注解的支持 --> <mvc:annotation-driven/> </beans>
<2>web.xml
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd" > <web-app> <display-name>Archetype Created Web Application</display-name> <!--配置前端控制器,让前端控制器去加载resources包下的springmvc.xml配置文件--> <servlet> <servlet-name>dispatcherServlet</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <!--全局的初始化参数--> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:springmvc.xml</param-value> </init-param> </servlet> <servlet-mapping> <servlet-name>dispatcherServlet</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> <!--配置解决中文乱码的过滤器--> <filter> <filter-name>characterEncodingFilter</filter-name> <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> <init-param> <param-name>encoding</param-name> <param-value>UTF-8</param-value> </init-param> </filter> <filter-mapping> <filter-name>characterEncodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> </web-app>
<3>UserController.java控制器类
package lucky.controller; import lucky.domain.User; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.RequestMapping; @Controller @RequestMapping(path = "/user") public class UserController { @RequestMapping(path = "/testString") public String testString(Model model){ System.out.println("testString方法执行了"); //模拟从数据库中查询出user对象 User user=new User(); user.setUsername("lucky"); user.setPassword("plj666"); user.setAge(26); //model对象 model.addAttribute("user",user); return "success"; } }
<4>User.java实体类
package lucky.domain; import java.io.Serializable; public class User implements Serializable { private String username; private String password; private Integer age; public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } @Override public String toString() { return "User{" + "username='" + username + '\'' + ", password='" + password + '\'' + ", age=" + age + '}'; } }
<5>response.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>Title</title> </head> <body> <a href="/day18_spingmvc_response/user/testString">testString</a> </body> </html>
<6>success.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %> <html> <head> <title>Title</title> </head> <body> <h3>执行成功</h3> ${user.username} ${user.password} ${user.age} </body> </html>
(3)执行效果图
控制台输出:
3.Controller类中方法的返回值类型
(1)String 类型
testString()方法返回值类型为String,返回的字符串可以指定逻辑视图名,通过视图解析器解析为物理视图地址。
package lucky.controller; import lucky.domain.User; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.RequestMapping; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @Controller @RequestMapping(path = "/user") public class UserController { /** * @param model * @return 返回值类型为String */ @RequestMapping(path = "/testString") public String testString(Model model){ System.out.println("testString方法执行了"); //模拟从数据库中查询出user对象 User user=new User(); user.setUsername("lucky"); user.setPassword("plj666"); user.setAge(27); //model对象 model.addAttribute("user",user); return "success"; } }
(2)void 类型
package lucky.controller; import lucky.domain.User; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.RequestMapping; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @Controller @RequestMapping(path = "/user") public class UserController { /** * 返回类型是void,可以利用HttpServletRequest自己编码进行转发 * @param request * @param response */ @RequestMapping(path = "/testVoid") public void testVoid(HttpServletRequest request, HttpServletResponse response) throws Exception{ System.out.println("testVoid方法执行了"); //编写转发的程序 //request.getRequestDispatcher("/WEB-INF/pages/success.jsp").forward(request,response); //编写重定向的程序 response.sendRedirect(request.getContextPath()+"/index.jsp"); } }
(3)ModelAndView 类型
package lucky.controller; import lucky.domain.User; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.servlet.ModelAndView; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @Controller @RequestMapping(path = "/user") public class UserController { /** * 返回ModelAndView对象 * @return 返回值类型为String */ @RequestMapping(path = "/testModelAndView") public ModelAndView testModelAndView(){ //创建ModelAndView对象 ModelAndView mv=new ModelAndView(); System.out.println("testModelAndView方法执行了"); //模拟从数据库中查询出user对象 User user=new User(); user.setUsername("linda"); user.setPassword("plj888"); user.setAge(29); //把user对象存储到ModelAndView对象中,通过ModelAndView对象再把user对象存到request对象中 mv.addObject("user",user); //跳转到哪个页面 mv.setViewName("success"); return mv; } }
4.Springmvcxml文件配置不拦截静态资源
在springmvc.xml文件中配置如下内容:
注意:js目录与WEB-INF目录是同级的
<!--前端控制器,哪些静态资源不拦截--> <mvc:resources location="/css/" mapping="/css/**"/> <mvc:resources location="/images/" mapping="/images/**"/> <mvc:resources location="/js/" mapping="/js/**"/>
5.响应json格式的数据
(1)json字符串和JavaBean对象互相转换的过程中,需要使用jackson的jar包,在pom文件中添加如下内容
<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>
(2)ajax请求编写
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>Title</title> <script src="js/jquery-3.3.1.min.js"></script> <script> //页面加载绑定单击事件 $(function () { //发送ajax请求 $("#btn").click(function () { $.ajax({ //编写json格式,设置属性和值 url:"user/testAjax", contentType:"application/json;charset=utf-8", data:'{"username":"lucky","password":"plj666","age":25}', dataType:"json", type:"post", success:function (data) { //data为服务器响应的json数据 alert(data.username+data.password+data.age); } }) }); }); </script> </head> <body> <button id="btn">发送ajax</button> </body> </html>
(3)Controller类中方法
package lucky.controller; import lucky.domain.User; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.servlet.ModelAndView; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @Controller @RequestMapping(path = "/user") public class UserController { /** * 模拟异步请求 * springmvc会自动的将json数据转为javabean对象 */ @RequestMapping(path = "/testAjax") public @ResponseBody User testAjax(@RequestBody User user) throws Exception{ System.out.println("testAjax方法执行了"); System.out.println(user); //模拟查询数据库操作 user.setUsername("linda"); user.setAge(31); return user; } }