SpringMVC
一豫尽、概述
SpringMVC是由Spring官方提供的基于MVC設(shè)計理念的web框架鳖宾。
SpringMVC是基于Servlet封裝的用于實現(xiàn)MVC控制的框架吼砂,實現(xiàn)前端和服務端的交互。
1.1 SpringMVC優(yōu)勢
- 嚴格遵守了MVC分層思想
- 采用了松耦合鼎文、插件式結(jié)構(gòu)
- SpringMVC是基于Spring的擴展渔肩、提供了一套完善的MVC注解
- SpringMVC在數(shù)據(jù)綁定、視圖解析都提供了多種處理方式拇惋,可靈活配置
- SpringMVC對RESTful URL設(shè)計方法提供了良好的支持
1.2 SpringMVC本質(zhì)工作
- 接收并解析請求
- 處理請求
- 數(shù)據(jù)渲染周偎、響應請求
二、部署
2.1 創(chuàng)建web工程
基于Maven創(chuàng)建一個web工程
2.2 添加依賴
添加所需對應的依賴
- spring-context
- spring-aspects
- spring-jdbc
- spring-test
- spring-web
- spring-webmvc
2.3 創(chuàng)建配置文件
創(chuàng)建SpringMVC配置文件:
在resources目錄下創(chuàng)建名為spring-servlet.xml的文件
-
添加MVC命名空間
<?xml version="1.0" encoding="UTF-8" ?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:mvc="http://www.springframework.org/schema/mvc" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd"> <context:annotation-config/> <context:component-scan base-package="com.test"/> <!--聲明MVC使用注解驅(qū)動--> <mvc:annotation-driven/> <!--配置靜態(tài)資源放行--> <mvc:resources mapping="/css/**" location="/css/"/> <mvc:resources mapping="/js/**" location="/js/"/> ... </beans>
2.4 配置前端控制器
在web.xml中配置SpringMVC的前端控制器
SpringMVC提供了一個名為DispatcherServlet的類(SpringMVC中央處理器)撑帖,用于攔截用戶請求交由SpringMVC處理
<servlet>
<servlet-name>SpringMVC</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<!--配置初始化參數(shù)-->
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring-servlet.xml</param-value>
</init-param>
<!--當值為0或者大于0時蓉坎,代表容器啟動時加載該servlet。正數(shù)的值越小胡嘿,啟動時加載該servlet的優(yōu)先級越高蛉艾。如果為負數(shù),則容器啟動時不會加載該servlet衷敌,只有該servlet被選擇時才會加載勿侯。-->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>SpringMVC</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<url-pattern>中 '/*'與'/'的區(qū)別
/* 攔截所有的HTTP請求,包括.jsp的請求缴罗,都將其當作控制器類的請求路徑處理
/ 表示攔截除.jsp外的HTTP請求助琐,但不會放行靜態(tài)資源請求(html/css/js/圖片)
所以需要在spring-servlet.xml中配置靜態(tài)資源放行。
三瞒爬、使用
在SpringMVC中弓柱,我們把接收用戶請求沟堡、處理用戶請求的類稱之為Controller(控制器)
3.1 創(chuàng)建控制器
創(chuàng)建controller包(需要在Spring注解掃描的范圍內(nèi))
創(chuàng)建相應的類
在類上添加
@Controller
注解侧但,聲明此類為SpringMVC的控制器-
在類上添加
@RequestMapping("/url")
,聲明此控制器類的請求url@Controller @RequestMapping("/test") public class TestController{ }
3.2 定義處理請求的方法
在一個控制器類中可以定義多個方法處理不同請求
-
在每個方法上添加
@RequesstMapping("/url")
用于聲明當前方法請求的url@Controller @RequestMapping("/test") public class TestController{ @RequestMapping("/add") public void addTest(){ System.out.println("add"); } @RequestMapping("/list") public void listTest(){ System.out.println("list"); } }
3.3 前端頁面提交數(shù)據(jù)
3.3.1 表單提交
-
表單提交:輸入框需要提供name屬性,SpringMVC控制器是通過name屬性取值的
<body> <h3>TEST</h3> <form action="test/add" method="post"> <p>名稱<input type="text" name="testName"/></p> <p>數(shù)字<input type="text" name="num"/></p> <p><input type="submit" value="提交"/></p> </form> </body>
3.3.2 URL提交
- URL提交:<a href="test/add?testName=myTest"/>
3.3.3 AJAX提交
-
AJAX提交:請求行航罗、請求頭禀横、請求體都可以用來傳值
<input type="button" value="ajax提交" id="btn"/> <script type="text/javascript" src="js/jquery-3.4.1.min.js"></script> <script type="text/javascript"> $('#btn').click(function(){ var obj = {}; obj.TestName = "myTest"; obj.num = 1.11; $.ajax({ url:"test/add?k1=aaa", //請求行傳值 type:"post", headers:{ key2:"bbb" //請求頭傳值 }, contentType:"application/json", data:obj, //請求體傳值 success:function(res){ console.log(res); } }); }); </script>
3.4 控制器接收數(shù)據(jù)
3.4.1 接收請求行傳值
- 表單提交
- URL提交
- $.ajax()請求的url傳值
-
.get()中的{}傳值
@RequestParam
注解用于接收請求行傳遞的數(shù)據(jù),有以下三個參數(shù):
- value:如果控制器中方法參數(shù)名與前端變量名一致粥血,則可以省略柏锄,否則需要設(shè)置value屬性指定前端變量名
- required:該參數(shù)是否為必傳項。默認是true复亏,表示請求中一定要傳入對應的參數(shù)趾娃,否則會報404錯誤,如果設(shè)置為false時缔御,當請求中沒有此參數(shù)抬闷,將會默認為null,而對于基本數(shù)據(jù)類型的變量,則必須有值,這時會拋出空指針異常笤成。如果允許空值评架,則接口中變量需要使用包裝類來聲明。
- defaultValue:參數(shù)的默認值炕泳,如果請求中沒有同名的參數(shù)時纵诞,該變量默認為此值。注意默認值可以使用SpEL表達式培遵,如"#{systemProperties[‘java.vm.version’]}"
3.4.2 請求頭傳值
-
ajax封裝請求頭數(shù)據(jù)
$.ajax({ ..., headers:{ }, ... })
@RequestHeader
注解用于接收請求頭傳遞的數(shù)據(jù)
3.4.3 請求體傳值
-
ajax封裝請求體數(shù)據(jù)
$.ajax({ ..., data:{ }, ... })
@RequestBody
注解用于接收請求體傳遞的數(shù)據(jù)
@RequestBody會將前端提交的JSON格式數(shù)據(jù)轉(zhuǎn)換成Java對象浙芙,它依賴于jackson包。在SSM下籽腕,需要手動導入jackson的依賴才能實現(xiàn)JSON對象的轉(zhuǎn)換茁裙,SpringBoot下則會默認導入jackson依賴
3.5 控制器響應數(shù)據(jù)
3.5.1 響應同步請求
同步請求:form表單、超鏈接
-
處理同步請求的方法的返回類型為String或者ModelAndView节仿,以實現(xiàn)頁面的跳轉(zhuǎn)
-
String
請求跳轉(zhuǎn)(轉(zhuǎn)發(fā)):
@RequestMapping("/add") public void addTest(){ return "/tips.jsp"; // '/'表示根路徑晤锥,如果不加則會在add下尋找tips.jsp文件 }
重定向:
@RequestMapping("/add") public void addTest(){ return "redirect:/tips.jsp"; }
-
ModelAndView:
請求跳轉(zhuǎn):
@RequestMapping("/add") public void addTest(){ ModelAndView modelAndView = new ModelAndView("/tips.jsp"); return modelAndView; }
重定向:
@RequestMapping("/add") public void addTest(){ ModelAndView modelAndView = new ModelAndView("redirect:/tips.jsp"); return modelAndView; }
-
-
同步請求傳值
只有轉(zhuǎn)發(fā)響應才能傳值,重定向不能傳值廊宪。
-
String:
//1.在控制器方法中定義一個Model類型的參數(shù) //2.在return頁面之前矾瘾,向model中添加鍵值對,添加的鍵值對就會被傳遞到轉(zhuǎn)發(fā)的頁面 @RequestMapping("/add") public void addTest(Model model){ model.addAttribute("key","value"); return "/tips.jsp"; } //除了使用Model對象傳值外箭启,還可以直接使用HttpServletRequest對象 @RequestMapping("/add") public void addTest(HttpServletRequest request){ request.setAttribute("key","value"); return "/tips.jsp"; }
-
ModelAndView
@RequestMapping("/add") public void addTest(){ ModelAndView modelAndView = new ModelAndView("/tips.jsp"); modelAndView.addObject("key","value"); return modelAndView; }
-
3.5.2 響應異步請求(AJAX)
使用response中的輸出流進行響應:
- 控制器方法的返回類型為void
- 控制器方法添加HttpServletResponse response參數(shù)
- 在方法中通過response獲取輸出流壕翩,使用流響應ajax請求
@RequestMapping("/list")
public void listTest(HttpServletResponse response) throws IOException {
Test test = new Test();
//使用ObjectMapper將對象轉(zhuǎn)換成JSON格式字符串
String s = new ObjectMapper().writeValueAsString(test);
response.setCharacterEncoding("utf-8");
response.setContentType("application/json");
PrintWriter out = response.getWriter();
out.print(s);
out.flush();
out.close();
}
直接在控制器方法返回響應的對象:
- 控制器方法的返回類型設(shè)置為響應給ajax請求的對象類型
- 在控制器方法前添加
@ResponseBody
注解,將返回的對象轉(zhuǎn)換成JSON響應給ajax請求 - 如果一個類中所有方法都響應ajax請求傅寡,則可以將@ResponseBody注解添加到類上
@RequestMapping("/list")
@ResponseBody
public Test listTest(){
Test test = new Test();
return test;
}
3.6 解決中文亂碼問題
3.6.1前端編碼:
-
JSP頁面:
<%@ page contentType="text/html;charset=UTF-8" language="java" pageEncoding="UTF-8" %>
-
HTML頁面:
<meta charset="UTF-8">
3.6.2 服務器編碼:
-
tomcat/conf/server.xml
添加UTF-8
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" URIEncoding="UTF-8"/>
3.6.3 設(shè)置SpringMVC的編碼方式
-
在web.xml中配置SpringMVC編碼過濾器的編碼方式
<filter> <filter-name>EncodingFilter</filter-name> <filter-class>org.springframework.web.filter.CharaterEncodingFilter</filter-class> <init-param> <param-name>encoding</param-name> <param-value>utf-8</param-value> </init-param> <init-param> <param-name>forceEncoding</param-name> <param-value>true</param-value> </init-param> </filter> <filter-mapping> <filter-name>EncodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>