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; } }
