SpringMVC最詳細筆記partⅠ
- 2020 年 3 月 28 日
- 筆記
一、springMVC-quickStar
- 解決maven載入項目過慢
archetypeCatalog internal
- 導入依賴
<!-- 版本鎖定 --> <properties> <spring.version>5.0.2.RELEASE</spring.version> </properties> <dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-web</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>servlet-api</artifactId> <version>2.5</version> <scope>provided</scope> </dependency> <dependency> <groupId>javax.servlet.jsp</groupId> <artifactId>jsp-api</artifactId> <version>2.0</version> <scope>provided</scope> </dependency> </dependencies>
- web.xml配置
<!-- SpringMVC的核心控制器 --> <servlet> <servlet-name>dispatcherServlet</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <!-- 配置Servlet的初始化參數,讀取springmvc的配置文件,創建spring容器 --> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:springmvc.xml</param-value> </init-param> <!-- 配置servlet啟動時載入對象 --> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>dispatcherServlet</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping
- springMVC的配置文件
<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"> <!-- 配置spring創建容器時要掃描的包 --> <context:component-scan base-package="club.leyvan"/> <!-- 配置視圖解析器 --> <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/WEB-INF/pages/"></property> <property name="suffix" value=".jsp"></property> </bean> <!-- 配置spring開啟註解mvc的支援 --> <mvc:annotation-driven></mvc:annotation-driven> </beans>
在 SpringMVC 的各個組件中,處理器映射器、處理器適配器、視圖解析器稱為 SpringMVC 的三大組件。 使 用 < mvc:annotation-driven> 自動載入 RequestMappingHandlerMapping (處理映射器) 和 RequestMappingHandlerAdapter ( 處 理 適 配 器 ) , 可 用 在 SpringMVC.xml 配 置 文 件 中 使 用 < mvc:annotation-driven>替代註解處理器和適配器的配置。
- 創建控制器類
package club.leyvan.controller //控制器類 @Controller public class HelloController { @RequestMapping(path="/hello") public String sayHello(){ System.out.println("Hello SpringMvc"); return "success"; } }
二、@RequestMapping註解
-
RequestMapping註解的作用是建立請求URL和處理方法之間的對應關係
-
RequestMapping註解可以作用在方法和類上
-
作用在類上:第一級的訪問目錄
-
作用在方法上:第二級的訪問目錄
-
細節:路徑可以不編寫 / 表示應用的根目錄開始
-
細節:${ pageContext.request.contextPath }也可以省略不寫,但是路徑上不能寫 /
-
-
RequestMapping的屬性
- path 指定請求路徑的url
- value value屬性和path屬性是一樣的 源碼中聲明了:@AliasFor("path")
- mthod 指定該方法的請求方式 例:method={RequestMethod.POST}
- params 指定限制請求參數的條件 例:params={"username=123"} 請求中必須含有username參數且值必須為123,否則不接受此請求
- headers 發送的請求中必須包含的請求頭 例:設置一個防爬蟲的請求頭及值,如果不是用戶請求頭則不接受訪問
三、請求參數綁定
-
請求參數的綁定說明
- 綁定機制
- 表單提交的數據都是k=v格式的 username=haha&password=123
- SpringMVC的參數綁定過程是把表單提交的請求參數,作為控制器中方法的參數進行綁定的
- 要求:提交表單的name和方法參數的名稱是相同的
- 支援的數據類型
- 基本數據類型和字元串類型
- 實體類型(JavaBean)
- 集合數據類型(List、map集合等)
- 綁定機制
-
基本數據類型和字元串類型
-
提交表單的name和參數的名稱是相同的
-
區分大小寫
-
實體類型(JavaBean)
- 提交表單的name和JavaBean中的屬性名稱需要一致
- 如果一個JavaBean類中包含其他的引用類型,那麼表單的name屬性需要編寫成:對象.屬性 例如:address.name
-
給集合屬性數據封裝
- JSP頁面編寫方式:list[0].屬性
-
請求參數中文亂碼的解決 :在web.xml中配置Spring提供的過濾器類
<!-- 配置過濾器,解決中文亂碼的問題 --> <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
-
-
不同類型參數綁定的舉例:
/** * 1.基本類型和字元串的參數綁定 * 請求的連接:testParam?username=hehe&password=123 * 輸出結果:username:hehe * password: 123 */ @RequestMapping("/testParam") public String testParam(String username,String password) { System.out.println("username:"+username); System.out.println("password:"+password); return "success"; } /** * 2.JavaBean的參數綁定 * account:Account->username:String;password:String;money:Double * 請求的連接:通過form提交post請求 * <form action="param/saveAccount" metohd="post"> * <input type="text" name="username"/> * <input type="password" name="password"/> * <input type="text" name="money"/> * <input type="submit" value="提交"/> * </form> */ @RequestMapping("/saveAccount") public String saveAccount(Account account) { System.out.println(account.toString()); return "success"; } /** * 3.JavaBean中含有User類型的參數的參數綁定 * account:Account->username:String;password:String;money:Double;user:User * user:User->uname:String;age:String * 請求的連接:通過form提交post請求 * <form action="param/saveAccount" metohd="post"> * <input type="text" name="username"/> * <input type="password" name="password"/> * <input type="text" name="money"/> * <input type="text" name="user.uname"/> * <input type="text" name="user.age"/> * <input type="submit" value="提交"/> * </form> */ @RequestMapping("/saveAccount") public String saveAccount(Account account) { System.out.println(account.toString()); return "success"; } /** * 4.集合數組的參數綁定 * account:Account->username:String;password:String;money:Double;user:User * list:List<User>;map:Map<String,User> * 請求的連接:通過form提交post請求 * <form action="param/saveAccount" metohd="post"> * <input type="text" name="username"/> * <input type="password" name="password"/> * <input type="text" name="money"/> * <input type="text" name="list[0].uname"/> * <input type="text" name="list[0].age"/> * <input type="text" name="map['隨便'].uname"/> * <input type="text" name="map['隨便']user.age"/> * <input type="submit" value="提交"/> * </form> */
四、自定義類型轉換器解決日期格式轉換的錯誤
由於頁面提交的數據全都是字元串的形式但SpringMVC內部自動的將字元串類型的數據進行了轉換,大多數的類型都幫助轉換好了,但還有可能存在問題:
默認轉換的日期格式:2020/3/28 但你想要的是2020-3-28這個時候就需要自定義類型轉換器
1.定義一個類、實現介面Converter<S,T> S:源類型 T:目標類型
/** * 把字元串轉換成日期的轉換器 */ public class StringToDateConverter implements Converter<String, Date>{ /** * String source 傳入進來的字元串 */ public Date convert(String source) { // 判斷 if(source == null) { throw new RuntimeException("參數不能為空"); } try { DateFormat df = new SimpleDateFormat("yyyy-MM-dd"); // 解析字元串 Date date = df.parse(source); return date; } catch (Exception e) { throw new RuntimeException("類型轉換錯誤"); } } }
2.在springMVC的配置文件中配置自定義類型轉換器
<!-- 註冊自定義類型轉換器 --> <bean id="conversionService"class="org.springframework.context.support.ConversionServiceFactoryBean"> <property name="converters"> <set> <bean class="cn.itcast.utils.StringToDateConverter"/> </set> </property> </bean>
3.讓自定義的類型轉換器生效
<!-- 開啟Spring對MVC註解的支援 --> <mvc:annotation-driven conversion-service="conversionService"/>
五、@RequestParam
1.作用:把請求中指定名稱的參數給控制器中的形參賦值(當形參於參數名不同時使用)。
2.位置:在方法的參數類型前
3.參數:
- value:請求參數中的名稱。
- required:請求參數中是否必須提供此參數。默認值:true。表示必須提供,如果不提供將報錯。
六、@RequestBody
1.作用:用於獲取請求體內容。直接使用得到是 key=value&key=value…結構的數據,get 請求方式不適用。 用於非同步請求的json數據獲取
2.位置:在方法的參數類型前
3.參數:
- required:是否必須有請求體。默認值是:true。當取值為 true 時,get 請求方式會報錯。如果取值為 false,get 請求得到是 null。
七、@PathVariable和RESTful風格
-
@PathVariable
1.作用:於@RequestMapping("/test/{id}")聯合使用,用於獲取RequestMapping中的sid的值;用於綁定 url 中的佔位符。例如:請求 url 中 /delete/{id},這個{id}就是 url 佔位符。 @PathVariable(name="id")
url:test/10
2.位置:在方法的參數類型前
3.參數:
- value:用於指定 url 中佔位符名稱。
- required:是否必須提供佔位符。
-
什麼是 rest:
REST(英文:Representational State Transfer,簡稱 REST)描述了一個架構樣式的網路系統,比如 web 應用程式。它首次出現在 2000 年 Roy Fielding 的博士論文中,他是 HTTP 規範的主要編寫者之 一。在目前主流的三種 Web 服務交互方案中,REST 相比於 SOAP(Simple Object Access protocol,簡單 對象訪問協議)以及 XML-RPC 更加簡單明了,無論是對 URL 的處理還是對 Payload 的編碼,REST 都傾向於用更加簡單輕量的方法設計和實現。值得注意的是 REST 並沒有一個明確的標準,而更像是一種設計的風格。它本身並沒有什麼實用性,其核心價值在於如何設計出符合 REST 風格的網路介面。
-
restful 的優點
它結構清晰、符合標準、易於理解、擴展方便,所以正得到越來越多網站的採用。
-
restful 的特性:
資源(Resources):網路上的一個實體,或者說是網路上的一個具體資訊。
它可以是一段文本、一張圖片、一首歌曲、一種服務,總之就是一個具體的存在。可以用一個 URI(統一 資源定位符)指向它,每種資源對應一個特定的 URI 。要 獲取這個資源,訪問它的 URI 就可以,因此 URI 即為每一個資源的獨一無二的識別符。
表現層(Representation):把資源具體呈現出來的形式,叫做它的表現層。
比如,文本可以用 txt 格式表現,也可以用 HTML 格式、XML 格式、JSON 格式表現,甚至可以採用二進位格式。
狀態轉化(State Transfer):每 發出一個請求,就代表了客戶端和伺服器的一次交互過程。 HTTP 協議,是一個無狀態協議,即所有的狀態都保存在伺服器端。因此,如果客戶端想要操作伺服器,必須通過某種手段,讓伺服器端發生「狀態轉化」(State Transfer)。而這種轉化是建立在表現層之上的,所以 就是 「表現層狀態轉化」。具體說,就是 HTTP 協議裡面,四個表示操作方式的動詞:GET 、POST 、PUT、DELETE。它們分別對應四種基本操作:GET 用來獲取資源,POST 用來新建資源,PUT 用來更新資源,DELETE 用來 刪除資源。
-
restful 的示例:
/account/1 HTTP GET : 得到 id = 1 的 account
/account/1 HTTP DELETE: 刪除 id = 1 的 account
/account/1 HTTP PUT: 更新 id = 1 的 account
八、@RequestHeader
1.作用:用於獲取請求消息頭。
2.位置:在方法的參數類型前
3.參數:
- value:獲取消息頭名稱
- required:是否必須有此消息頭
九、@CookieValue
1.作用:用於把指定 cookie 名稱的值傳入控制器方法參數。
2.位置:在方法的參數類型前
3.參數:
- value:指定 cookie 的名稱。
- required:是否必須有此 cookie。
十、@ModelAttribute
1.作用:它可以用於修飾方法和參數。出現在方法上,表示當前方法會在控制器的方法執行之前,先執行。它可以修飾沒有返回值的方法,也可以修飾有具體返回值的方法。出現在參數上,獲取指定的數據給參數賦值。
3.參數:
- value:用於獲取數據的 key。key 可以是 POJO 的屬性名稱,也可以是 map 結構的 key
十一、@SessionAttribute
1.作用:用於將值存入session域中。
2.位置:在類上
3.參數:
- value:用於指定存入的屬性名稱
- type:用於指定存入的數據類型。
4.其他:
- Model類,將值存入request域中
- ModelMap類,可以從域中取值,包括session
- sessionStatus.setComplete();用於刪除session中的內容