網(wǎng)站建設(shè) 后期維護(hù)抖音關(guān)鍵詞排名軟件
一、SpringMVC的基本概念
(一)三層架構(gòu)和MVC
1、三層架構(gòu)概述
????????我們的開發(fā)架構(gòu)一般都是基于兩種形式,一種是 C/S 架構(gòu),也就是客戶端/服務(wù)器,另一種是 B/S 架構(gòu),也就是瀏覽器服務(wù)器。在 JavaEE 開發(fā)中,幾乎全都是基于 B/S 架構(gòu)的開發(fā)。那么在 B/S 架構(gòu)中,系統(tǒng)標(biāo)準(zhǔn)的三層架構(gòu)包括:表現(xiàn)層、業(yè)務(wù)層、持久層。三層架構(gòu)在我們的實際開發(fā)中使用的非常多,所以我們課程中的案例也都是基于三層架構(gòu)設(shè)計的。
三層架構(gòu)中,每一層各司其職,接下來我們就說說每層都負(fù)責(zé)哪些方面:
(1)表現(xiàn)層:也就是我們常說的web層。它負(fù)責(zé)接收客戶端請求,向客戶端響應(yīng)結(jié)果,通常客戶端使用http協(xié)議請求web 層,web 需要接收 http 請求,完成 http 響應(yīng)。
表現(xiàn)層包括展示層和控制層:控制層負(fù)責(zé)接收請求,展示層負(fù)責(zé)結(jié)果的展示。
(2)業(yè)務(wù)層:也就是我們常說的 service 層。它負(fù)責(zé)業(yè)務(wù)邏輯處理,和我們開發(fā)項目的需求息息相關(guān)。
(3)持久層:也就是我們是常說的 dao 層。負(fù)責(zé)數(shù)據(jù)持久化,和數(shù)據(jù)庫做交互。
2、model1模式介紹
????????這種模式十分簡單,頁面顯示,控制分發(fā),業(yè)務(wù)邏輯,數(shù)據(jù)訪問全部通過Jsp去實現(xiàn)
3、model2模式介紹
????????這種模式通過兩部分去實現(xiàn),即Jsp與Servlet。Jsp負(fù)責(zé)頁面顯示,Servlet負(fù)責(zé)控制分發(fā),業(yè)務(wù)邏輯以及數(shù)據(jù)訪問。
4、MVC模式介紹
????????MVC模式則分為三大塊,即視圖(View),控制器(Control),模型(Model).視圖是Jsp負(fù)責(zé)的頁面顯示,控制器則是Servlet負(fù)責(zé)的控制分發(fā),模型包括Service和Dao兩個部分,分別負(fù)責(zé)業(yè)務(wù)邏輯和數(shù)據(jù)訪問。
5、三種模型對比
Model1 模式的優(yōu)缺點:
????????優(yōu)點:架構(gòu)簡單,比較適合小型項目開發(fā)
????????缺點:JSP 職責(zé)不單一,職責(zé)過重,不便于維護(hù)
Model2 模式的優(yōu)缺點:
????????優(yōu)點:職責(zé)清晰,較適合于大型項目架構(gòu)
????????缺點:不適合小型項目開發(fā)
MVC模式的優(yōu)缺點:
????????優(yōu)點:分工明確,各司其職,互不干涉。適用于大型項目架構(gòu),有利于組件的重構(gòu)
????????缺點:增加了系統(tǒng)開發(fā)的復(fù)雜度
(二)SpringMVC 概述
1、springMVC是什么?
????????SpringMVC是一個基于Java的實現(xiàn)了MVC設(shè)計模式的請求驅(qū)動類型的輕量級Web框架,通過把Model,View,Controller分離,將web層進(jìn)行職責(zé)解耦,把復(fù)雜的web應(yīng)用分成邏輯清晰的幾部分,簡化開發(fā),減少出錯,方便組內(nèi)開發(fā)人員之間的配合。它通過一套注解,讓一個簡單的 Java 類成為處理請求的控制器,而無須實現(xiàn)任何接口。同時它還支持RESTful編程風(fēng)格的請求。
2、SpringMVC在三層架構(gòu)中的位置?
????????springMVC位于三層架構(gòu)中的表現(xiàn)層,作用是接收請求響應(yīng)數(shù)據(jù),響應(yīng)的數(shù)據(jù)通過視圖、模板展示給用戶。
3、SpringMVC的優(yōu)勢?
(1)清晰的角色劃分:
????????前端控制器(DispatcherServlet)
????????請求到處理器映射(HandlerMapping)
????????處理器適配器(HandlerAdapter)
????????視圖解析器(ViewResolver)
????????處理器或頁面控制器(Controller)
????????驗證器(Validator)
????????命令對象(Command 請求參數(shù)綁定到的對象就叫命令對象)
????????表單對象(Form Object 提供給表單展示和提交到的對象就叫表單對象)。
(2)分工明確,而且擴(kuò)展點相當(dāng)靈活,可以很容易擴(kuò)展,雖然幾乎不需要。
(3)由于命令對象就是一個POJO,無需繼承框架特定 API,可以使用命令對象直接作為業(yè)務(wù)對象。
(4)和 Spring 其他框架無縫集成,是其它 Web 框架所不具備的。
(5)可適配,通過 HandlerAdapter 可以支持任意的類作為處理器。
(6)可定制性,HandlerMapping、ViewResolver 等能夠非常簡單的定制。
(7)功能強(qiáng)大的數(shù)據(jù)驗證、格式化、綁定機(jī)制。
(8)利用 Spring 提供的 Mock 對象能夠非常簡單的進(jìn)行 Web 層單元測試。
(9)本地化、主題的解析的支持,使我們更容易進(jìn)行國際化和主題的切換。
(10)強(qiáng)大的 JSP 標(biāo)簽庫,使 JSP 編寫更容易。
………………還有比如RESTful風(fēng)格的支持、簡單的文件上傳、約定大于配置的契約式編程支持、基于注解的零配置支持等等。
二、SpringMVC入門
(一)SpringMVC 的入門案例
1、入門案例需求分析
????????構(gòu)建頁面index.jsp發(fā)起請求,在服務(wù)器端處理請求,控制臺打印處理請求成功,跳轉(zhuǎn)main.jsp成功頁面;
2、構(gòu)建maven項目并添加依賴
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.jn</groupId><artifactId>SpringMVC01</artifactId><packaging>war</packaging><version>1.0-SNAPSHOT</version><name>SpringMVC01 Maven Webapp</name><url>http://maven.apache.org</url><dependencies><!--junit--><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>3.8.1</version><scope>test</scope></dependency><!--spring-webmvc--><dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>5.3.4</version></dependency><!--spring-web--><dependency><groupId>org.springframework</groupId><artifactId>spring-web</artifactId><version>5.3.4</version></dependency><!--spring-context--><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.3.4</version></dependency></dependencies>
</project>
3、在web-app目錄下配置index.jsp頁面?
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>Title</title>
</head>
<body>
<a href="/hello/test1"></a></body>
</html>
4、在web-app目錄下配置跳轉(zhuǎn)頁面
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>Title</title>
</head>
<body>
<h2>請求處理成功</h2>
</body>
</html>
5、web.xml中配置核心控制器DispatcherServlet
<!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><!-- 配置Spring MVC的前端控制器 --><servlet><!-- servlet的名稱 --><servlet-name>spring-mvc</servlet-name><!-- servlet的類路徑,指向Spring的請求分發(fā)器 --><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><!-- 初始化參數(shù),指定Spring MVC配置文件的位置 --><init-param><!-- 參數(shù)名稱:配置文件位置 --><param-name>contextConfigLocation</param-name><!-- 參數(shù)值:配置文件在類路徑下的位置 --><param-value>classpath:springmvc.xml</param-value></init-param></servlet><!-- 配置spring-mvc servlet的URL映射規(guī)則 --><servlet-mapping><!-- 對應(yīng)的servlet名稱 --><servlet-name>spring-mvc</servlet-name><!-- URL模式,匹配以.do結(jié)尾的請求 --><url-pattern>*.do</url-pattern></servlet-mapping></web-app>
6、配置springMVC的配置文件springmvc.xml
<?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"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd"><!--掃描注解的包--><context:component-scan base-package="com.jn.controller"/><!--處理映射器:根據(jù)請求路徑匹配映射路徑找到對應(yīng)的執(zhí)行器--><bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"></bean><!--處理適配器:根據(jù)處理映射器返回的執(zhí)行器對象去執(zhí)行執(zhí)行器對象--><bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"></bean><!--視圖解析器:解析視圖--><bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"><property name="prefix" value="/WEB-INF/jsp/"/><property name="suffix" value=".jsp"/></bean>
</beans>
? ?7、控制層controller
package com.jn.controller;import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;@Controller
public class HelloController {@RequestMapping("hello")public String test1(){System.out.println("請求處理成功");return "RequestSuccessful";}
}
8、測試?
? ? ? ? 啟動tomcat進(jìn)行測試 ,然后點擊hello超鏈接跳轉(zhuǎn)到成功頁面。
注意:使用tomcat10以上版本會報錯,所以本次測試使用的是tomcat8版本
(二)SpringMVC執(zhí)行過程及原理分析
1、案例的執(zhí)行過程
????????瀏覽器客戶端發(fā)起請求,請求到達(dá)服務(wù)器tomcat,tomcat將請求相關(guān)信息參數(shù)封裝到對象request和response中,再將request和response對象交給service方法處理,在service方法中會根據(jù)請求路徑將請求交給對應(yīng)的controller執(zhí)行器處理。
2、SpringMVC的請求響應(yīng)流程
????????瀏覽器發(fā)送請求,被DispatcherServlet捕獲,DispatcherServlet沒有直接處理請求,而是將請求交給HandlerMapping處理器映射器,處理器映射器根據(jù)請求路徑去controller控制層中匹配對應(yīng)的執(zhí)行器,并將匹配結(jié)果返回給DispatcherServlet,由DispacherServlet調(diào)用HandlerAdapter處理器適配器來執(zhí)行控制層執(zhí)行器方法;
????????執(zhí)行器方法執(zhí)行后的返回結(jié)果,由DispatcherServlet交給視圖解析器ViewResolver來處理,找到對應(yīng)的結(jié)果視圖,渲染視圖,并將結(jié)果響應(yīng)給瀏覽器。
(三)SpringMVC常用組件介紹
1、DispatcherServlet:前端控制器
????????用戶請求到達(dá)前端控制器,它就相當(dāng)于 mvc 模式中的 c,dispatcherServlet 是整個流程控制的中心,由它調(diào)用其它組件處理用戶的請求,dispatcherServlet 的存在降低了組件之間的耦合性。
2、HandlerMapping:處理器映射器
????????HandlerMapping 負(fù)責(zé)根據(jù)用戶請求找到 Handler 即處理器,SpringMVC提供了不同的映射器實現(xiàn)不同的映射方式,例如:配置文件方式,實現(xiàn)接口方式,注解方式等。
3、Handler:處理器
????????它就是我們開發(fā)中要編寫的具體業(yè)務(wù)控制器。由 DispatcherServlet 把用戶請求轉(zhuǎn)發(fā)到 Handler。由Handler 對具體的用戶請求進(jìn)行處理。
4、HandlAdapter:處理器適配器
????????通過 HandlerAdapter 對處理器進(jìn)行執(zhí)行,這是適配器模式的應(yīng)用,通過擴(kuò)展適配器可以對更多類型的處理器進(jìn)行執(zhí)行。
5、View Resolver:視圖解析器
????????View Resolver 負(fù)責(zé)將處理結(jié)果生成 View 視圖,View Resolver 首先根據(jù)邏輯視圖名解析成物理視圖名即具體的頁面地址,再生成 View 視圖對象,最后對 View 進(jìn)行渲染將處理結(jié)果通過頁面展示給用戶。
6、View:視圖
????????SpringMVC 框架提供了很多的 View 視圖類型的支持,包括:jstlView、freemarkerView、pdfView等。我們最常用的視圖就是 jsp。一般情況下需要通過頁面標(biāo)簽或頁面模版技術(shù)將模型數(shù)據(jù)通過頁面展示給用戶,需要由程序員根據(jù)業(yè)務(wù)需求開發(fā)具體的頁面。
7、mvc:annotation-driven標(biāo)簽說明:
????????在 SpringMVC 的各個組件中,處理器映射器、處理器適配器、視圖解析器稱為 SpringMVC 的三大組件。使用 <mvc:annotation-driven> 自動加載 RequestMappingHandlerMapping(處理映射器)和RequestMappingHandlerAdapter ( 處 理 適 配 器 ),可 用 在 SpringMVC.xml 配 置 文 件 中 使 用<mvc:annotation-driven>替代處理映射器和適配器的配置(一般開發(fā)中都需要該標(biāo)簽)。注意:我們只需要編寫處理具體業(yè)務(wù)的控制器以及視圖。
????
<mvc:annotation-driven> 標(biāo)簽相當(dāng)于以下配置:
<!--處理映射器:根據(jù)請求路徑匹配映射路徑找到對應(yīng)的執(zhí)行器--><bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"></bean><!--處理適配器:根據(jù)處理映射器返回的執(zhí)行器對象去執(zhí)行執(zhí)行器對象--><bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"></bean>
(四)RequestMapping 注解
????????用于定義映射路徑,建立請求url和控制層方法之間的對應(yīng)關(guān)系;
1、RequestMapping 注解源碼解讀
@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Mapping
public @interface RequestMapping {String name() default "";@AliasFor("path")String[] value() default {};@AliasFor("value")String[] path() default {};RequestMethod[] method() default {};String[] params() default {};String[] headers() default {};
}
2、RequestMapping 注解的描述
(1)注解位置:
??? ????????a.類上:定義一級映射路徑;
??? ????????b.方法上:定義二級映射路徑;
(2)注解屬性:???
??? ????????value:用于指定映射路徑url。它和 path 屬性的作用是一樣的。
??? ????????method:用于指定請求的方式。
??? ????????params:用于指定限制請求參數(shù)的條件。它支持簡單的表達(dá)式。要求請求參數(shù)的 ??? key 和 value 必須和配置的一模一樣。eg:params = {"username"},表示請求參數(shù)必須有 username;
??????????? headers:用于指定限制請求消息頭的條件。
??? 注意:多個屬性之間是與的關(guān)系;
三、SpringMVC中的請求參數(shù)綁定
(一)綁定說明
1、綁定的機(jī)制
我們都知道,表單中請求參數(shù)都是基于 key=value 的。SpringMVC綁定請求參數(shù)的過程是通過把表單提交請求參數(shù),作為控制器中方法參數(shù)進(jìn)行綁定的。
2、支持的數(shù)據(jù)類型
基本類型參數(shù):包括基本類型和 String 類型
POJO 類型參數(shù):包括實體類,以及關(guān)聯(lián)的實體類
數(shù)組和集合類型參數(shù):包括 List 結(jié)構(gòu)和 Map 結(jié)構(gòu)的集合(包括數(shù)組)
3、使用要求:
如果是基本類型或者 String 類型:要求我們的參數(shù)名稱必須和控制器中方法的形參名稱保持一致。(嚴(yán)格區(qū)分大小寫)
如果是 POJO 類型,或者它的關(guān)聯(lián)對象:要求表單中參數(shù)名稱和 POJO 類的屬性名稱保持一致。并且控制器方法的參數(shù)類型是 POJO 類型。
如果是集合類型,有兩種方式:
(1)第一種:要求集合類型的請求參數(shù)必須在 POJO 中。在表單中請求參數(shù)名稱要和 POJO 中集合屬性名稱相同。給 List 集合中的元素賦值,使用下標(biāo)。給 Map 集合中的元素賦值,使用鍵值對。
(2)第二種:接收的請求參數(shù)是 json 格式數(shù)據(jù)。需要借助一個注解實現(xiàn)。
(二)參數(shù)綁定示例
1、基本類型和 String 類型作為參數(shù)
(1)頁面定義請求:
<form action="stringTest" method="post">name :<input type="text" name="name"><br>age :<input type="text" name="age"><br><input type="submit" value="提交">
</form>
(2)執(zhí)行器方法綁定參數(shù):
//測試String類型作為參數(shù)@RequestMapping("stringTest")public String testString(String name,int age){System.out.println("name:" + name);System.out.println("age:" + age);return "RequestSuccessful";}
2、POJO 類型作為參數(shù)
(1)實體類創(chuàng)建:
Car:?
package com.jn.pojo;public class Car {private String name;private int price;public String getName() {return name;}public void setName(String name) {this.name = name;}public int getPrice() {return price;}public void setPrice(int price) {this.price = price;}@Overridepublic String toString() {return "Car{" +"name='" + name + '\'' +", price=" + price +'}';}
}
User:?
package com.jn.pojo;public class User {private String name;private int age;private Car car;public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public Car getCar() {return car;}public void setCar(Car car) {this.car = car;}@Overridepublic String toString() {return "User{" +"name='" + name + '\'' +", age=" + age +", car=" + car +'}';}
}
(2)頁面定義請求:
<div><form action="pojoTest">name :<input type="text" name="name"><br>age :<input type="text" name="age"><br>carName :<input type="text" name="car.name"><br>carPrice :<input type="text" name="car.price"><br><input type="submit" value="提交"></form>
</div>
(3)執(zhí)行器方法綁定參數(shù):
//測試Pojo類型作為參數(shù)@RequestMapping("pojoTest")public String testPojo(User user){System.out.println(user);return "RequestSuccessful";}
3、POJO 類中包含集合類型參數(shù)
(1)User類修改
package com.jn.pojo;import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Set;public class User {private String name;private int age;private Car car;private List<Car> carList;private Set<Car> carSet;private HashMap<String,Car> carMap;User(){//初始化set集合carSet=new HashSet<>();Car car = new Car();Car car1=new Car();carSet.add(car);carSet.add(car1);}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public Car getCar() {return car;}public void setCar(Car car) {this.car = car;}public List<Car> getCarList() {return carList;}public void setCarList(List<Car> carList) {this.carList = carList;}public Set<Car> getCarSet() {return carSet;}public void setCarSet(Set<Car> carSet) {this.carSet = carSet;}public HashMap<String, Car> getCarMap() {return carMap;}public void setCarMap(HashMap<String, Car> carMap) {this.carMap = carMap;}@Overridepublic String toString() {return "User{" +"name='" + name + '\'' +", age=" + age +", car=" + car +", carList=" + carList +", carSet=" + carSet +", carMap=" + carMap +'}';}
}
(2)頁面定義請求:
<div><form action="listTest">name :<input type="text" name="name"><br>age :<input type="text" name="age"><br>carName :<input type="text" name="car.name"><br>carPrice :<input type="text" name="car.price"><br>listCarName :<input type="text" name="carList[0].name"><br>listCarPrice :<input type="text" name="carList[0].price"><br>listCarName1 :<input type="text" name="carList[1].name"><br>listCarPrice1 :<input type="text" name="carList[1].price"><br>setCarName :<input type="text" name="carSet[0].name"><br>setCarPrice :<input type="text" name="carSet[0].price"><br>setCarName1 :<input type="text" name="carSet[1].name"><br>setCarPrice1 :<input type="text" name="carSet[1].price"><br>mapCarName :<input type="text" name="carMap['x'].name"><br>mapCarPrice :<input type="text" name="carMap['x'].price"><br>mapCarName1 :<input type="text" name="carMap['y'].name"><br>mapCarPrice1 :<input type="text" name="carMap['y'].price"><br><input type="submit" value="提交"></form>
</div>
(3)執(zhí)行器方法綁定參數(shù):
//測試List類型作為參數(shù)@RequestMapping("listTest")public String testList(User user){System.out.println(user);return "RequestSuccessful";}
4、數(shù)組類型參數(shù)
(1)頁面定義請求:
<div><form action="arrTest">hobby1 :<input type="text" name="hobbies" ><br>hobby2 :<input type="text" name="hobbies" ><br>hobby3 :<input type="text" name="hobbies" ><br>hobby4 :<input type="text" name="hobbies" ><br><input type="submit" value="提交"></form>
</div>
(2)執(zhí)行器方法綁定參數(shù):
//測試數(shù)組類型作為參數(shù)@RequestMapping("arrTest")public String testArray(String[] hobbies){for (String hobby : hobbies) {System.out.println(hobby);}return "RequestSuccessful";}
5、使用 ServletAPI 對象作為方法參數(shù)
(1)引入servletAPI的依賴jar包
(注意jar包作用范圍provided:不參與項目部署)
<!--servlet-api依賴--><dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><version>4.0.1</version></dependency>
(2)執(zhí)行器方法綁定參數(shù)
? ? ? ? 瀏覽器啟動時直接訪問servletTest然后就能進(jìn)行跳轉(zhuǎn)到hello?
//servlet API對象作為返回參數(shù)@RequestMapping("servletTest")public void testServlet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//轉(zhuǎn)發(fā)到/test1System.out.println("正在請求轉(zhuǎn)發(fā)");request.getRequestDispatcher("/hello").forward(request,response);}
6、請求參數(shù)亂碼問題
????????tomacat 對 GET 和 POST 請求處理方式是不同的:
(1)GET 請求的編碼問題,要改 tomcat 的 server.xml配置文件:
進(jìn)行修改:
<Connector port="8080" protocol="HTTP/1.1"connectionTimeout="20000"redirectPort="8443" URIEncoding="UTF-8"/>
(2)POST 請求的編碼問題,要在web.xml文件中配置編碼過濾器:
????????在進(jìn)行過濾器添加的時候報錯The content of element type "web-app" must match "(icon?,display-name?,description?,distributable?,context-param*,filter*,filter-mapping*,listener*,servlet*,servlet-mapping*,session-config?,mime-mapping*,welcome-file-list?,error-page*,taglib*,resourc。最后發(fā)現(xiàn)是DOM樹里面的元素<head>? 版本不匹配,我們改為以下配置就行:
<?xml version="1.0" encoding="UTF-8"?>
<web-app id="WebApp_9" version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"></web-app>
? ? ? ? 然后加入過濾器:
<!--配置post請求時的編碼過濾器--><filter><filter-name>encodingFilter</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>encodingFilter</filter-name><url-pattern>/*</url-pattern></filter-mapping>
7、靜態(tài)資源訪問:
????????靜態(tài)資源的配置有兩種方式,下面的兩種配置方式任選一種配置就行?
(1)將靜態(tài)資源交給默認(rèn)的DefaultServlet處理
?????????在springMVC.xml配置文件中加如下配置:
<!--開啟靜態(tài)資源配置--><mvc:default-servlet-handler></mvc:default-servlet-handler>
(2)指定靜態(tài)資源的訪問路徑:
????????在springMVC.xml配置文件中加如下配置:
<!--開啟靜態(tài)資源配置 第二種方式--><mvc:resources mapping="/images/**" location="/images/"/>
(3)web-app目錄下新建images存入圖片
(4)index.jsp配置顯示靜態(tài)路徑圖片
<div><img src="./images/girls.jpg">
</div>
(5)測試
????????圖片正常顯示
(三)自定義參數(shù)處理
1、使用場景:
????????SpringMVC不能自動識別參數(shù)轉(zhuǎn)換為我們需要的數(shù)據(jù)類型,瀏覽器報400錯誤,類型轉(zhuǎn)換異常;
2、使用步驟:
(1)定義類型轉(zhuǎn)換器
package com.jn.utils;import org.springframework.core.SimpleAliasRegistry;
import org.springframework.core.convert.converter.Converter;import java.text.SimpleDateFormat;
import java.util.Date;
/*
定義類型轉(zhuǎn)化器
定義了一個名為 MyDateConverter 的類,該類實現(xiàn)了 Converter<String, Date> 接口。
主要功能是將字符串格式的日期轉(zhuǎn)換為 Date 對象。*/
public class MyDateConverter implements Converter<String, Date> {@Overridepublic Date convert(String s) {SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");Date date = null;try {date = sdf.parse(s);} catch (Exception e) {e.printStackTrace();}return date;}
}
(2)配置類型轉(zhuǎn)換器
<!--配置類型轉(zhuǎn)換器
將自定義的 MyDateConverter 注冊到 Spring 的類型轉(zhuǎn)換服務(wù)中,使得在應(yīng)用中可以使用 MyDateConverter 來進(jìn)行字符串到日期的轉(zhuǎn)換。--><bean id="formattingConversionServiceFactoryBean" class="org.springframework.format.support.FormattingConversionServiceFactoryBean"><property name="converters"><bean class="com.jn.utils.MyDateConverter"></bean></property></bean>
(3)引用類型轉(zhuǎn)換器
? ? ? ? 1.頁面定義請求?
//測試自定義類型轉(zhuǎn)換器@RequestMapping("typeChange")public String testDate(Date birthday){System.out.println(birthday);return "RequestSuccessful";}
? ? ? ?2. 執(zhí)行器方法綁定參數(shù):
//測試自定義類型轉(zhuǎn)換器@RequestMapping("typeChange")public String testDate(Date date){System.out.println(date);return "RequestSuccessful";}
????????3.發(fā)現(xiàn)錯誤?
?????????Failed to convert value of type 'java.lang.String' to required type 'java.util.Date'; nested exception is java.lang.IllegalStateException: Cannot convert value of type 'java.lang.String' to required type 'java.util.Date': no matching editors or conversion strategy found
? ? ? ? 然后死活不知道怎么修改這個錯誤,最后折騰了半個小時發(fā)現(xiàn)只要早controller里面加入配置函數(shù)運(yùn)行就好了。
@InitBinderprotected void initBinder(WebDataBinder binder) {SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");binder.registerCustomEditor(Date.class, new CustomDateEditor(dateFormat, true));}
四、SpringMVC的注解詳解
(一)RequestParam
1、RequestParam注解介紹
????????使用在方法入?yún)⑽恢?#xff0c;用于指定請求參數(shù)名稱,將該請求參數(shù)綁定到注解參數(shù)位置。
屬性:name:指定要綁定的請求參數(shù)名稱;
???? required:指定請求參數(shù)是否必傳;
??? ?defaultValue:指定當(dāng)沒有傳入請求參數(shù)時的默認(rèn)取值;
2、RequestParam注解使用案例
//測試RequestParam注解測試@RequestMapping("requestParam")public String testRequestParam(@RequestParam("username") String name){System.out.println("name:" + name);return "RequestSuccessful";}
3、RequestParam注解測試結(jié)果
????????啟動Tmocat 輸入:
http://localhost:8080/SpringMVC01_war_exploded/requestParam?username=hhh
(二)RequestHeader
1、RequestHeader注解介紹
????????注解在方法入?yún)⑽恢?#xff0c;用于獲取請求頭信息。
2、RequestHeader注解使用案例
//測試RequestHeader注解@RequestMapping("requestHeader")public String testRequestHeader(@RequestHeader("User-Agent") String header){System.out.println("header:" + header);return "RequestSuccessful";}
3、RequestHeader注解測試結(jié)果
(三)RequestBody
1、RequestBody注解介紹
????????用于方法入?yún)⑽恢?#xff0c;獲取請求體內(nèi)容。直接使用得到是 key=value&key=value...結(jié)構(gòu)的數(shù)據(jù)。get 請求方式不適用。通常用于將json格式字符串綁定到bean對象中;
2、RequestBody注解案例
(1)直接獲取請求體內(nèi)容
<div><form action="typeChange">birthday :<input type="date" name="birthday"><br><input type="submit" value="提交"></form>
</div>
//測試requestBody@RequestMapping("requestBody")public String testRequestBody(@RequestBody String body){System.out.println(body);return "RequestSuccessful";}
(2)將json格式請求參數(shù)綁定到指定對象bean中
? ? ? ? 新建jsp頁面實現(xiàn)ajax請求:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>Title</title><script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.7.1/jquery.min.js"></script><script>//頁面加載時間$(function () {//為按鈕綁定點擊事件$("#btn").click(function () {$.ajax({url:"ajaxTest",data:'{"name":"Tom","age":18}',type:"POST",contentType:"application/json",success:function (obj) {//將控制層操作成功響應(yīng)信息通過彈窗展示alert(obj);},})})})</script>
</head>
<body>
<button id="btn">發(fā)送ajax請求</button>
</body>
</html>
?????????RequestBody注冊使用案例:
//測試json對象的RequestBody@RequestMapping("ajaxTest")public String testRequestBodyJson(@RequestBody String car){System.out.println(car);return "RequestSuccessful";}
3、RequestBody注解測試結(jié)果
(四)CookieValue
1、CookieValue注解介紹
????????用于方法入?yún)⑽恢?#xff0c;把指定 cookie 名稱的值傳入控制器方法參數(shù)。
2、CookieValue注解使用案例
//CookieValue注解使用案例@RequestMapping("cookieValue")public String testCookieValue(@CookieValue("JSESSIONID") String cookie){System.out.println(cookie);return "RequestSuccessful";}
3、CookieValue注解測試結(jié)果
(五)ModelAttribute
1、ModelAttribute注解介紹
????????該注解是SpringMVC4.3版本以后新加入的。它可以用于修飾方法和參數(shù)。出現(xiàn)在方法上,表示當(dāng)前方法會在控制器的方法執(zhí)行之前,先執(zhí)行。它可以修飾沒有返回值的方法,也可以修飾有具體返回值的方法。出現(xiàn)在參數(shù)上,獲取指定的數(shù)據(jù)給參數(shù)賦值。
2、ModelAttribute注解使用案例
(1)注解在方法上:
//ModelAttribute注解用于方法 用來綁定一個公共的參數(shù)sharParam@ModelAttribute("sharParam")public String testModelAttribute(){System.out.println("我是公共參數(shù)");return "公共參數(shù)";}
(2)注解在參數(shù)位置:
//測試ModelAttribute注解用于參數(shù)@RequestMapping("modelAttribute")public String testModelAttribute(@ModelAttribute("sharParam") String modelAttribute){System.out.println("modelAttribute:" + modelAttribute);return "RequestSuccessful";}
3、ModelAttribute注解測試結(jié)果?
?
(六)SessionAttributes
1、SessionAttributes注解介紹
????????注解在類上,作用將請求域中的參數(shù)存放到session域中,用于參數(shù)共享。
2、將參數(shù)放入Session請求域
//將請求對象放入到請求域@RequestMapping("requestAttribute")public ModelAndView testRequestAttribute(HttpServletRequest request, ModelAndView mv){mv.addObject("aa","AA");mv.addObject("bb","BB");mv.addObject("cc","CC");HttpSession session = request.getSession();session.setAttribute("aa", "AA");session.setAttribute("bb", "BB");session.setAttribute("cc", "CC");mv.setViewName("RequestSuccessful");return mv;}
3、 將參數(shù)放入到Session作用域
package com.jn.controller;import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.SessionAttributes;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;@Controller
@SessionAttributes(value = {"aa","bb"})
public class SessionAttributeTest {// 從Session中獲取屬性并添加到模型,用于在另一個請求中展示@RequestMapping("/getSessionAttributes")public String getSessionAttributes(HttpServletRequest request, Model model) {// 從 Session 中獲取屬性HttpSession session = request.getSession();String aaFromSession = (String) session.getAttribute("aa");String bbFromSession = (String) session.getAttribute("bb");String ccFromSession = (String) session.getAttribute("cc");// 將 Session 中的屬性添加到模型中model.addAttribute("aaFromSession", aaFromSession);model.addAttribute("bbFromSession", bbFromSession);model.addAttribute("ccFromSession", ccFromSession);return "sessionAttributesShow";}
}
4、請求成功頁面
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>Title</title>
</head>
<body>
<h2>設(shè)置Session屬性后的結(jié)果頁面</h2>
<p>屬性aa的值:${aa}</p>
<p>屬性bb的值:${bb}</p>
<p>屬性cc的值:${cc}</p>
</body>
</html>
3、SessionAttributes注解測試結(jié)果
?