<!-- 前端控制器(加載classpath:springmvc.xml 服務器啓動建立servlet) --> <servlet> <servlet-name>dispatcherServlet</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <!-- 配置初始化參數,建立完DispatcherServlet對象,加載springmvc.xml配置文件 --> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:springmvc.xml</param-value> </init-param> <!-- 服務器啓動的時候,讓DispatcherServlet對象建立 --> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>dispatcherServlet</servlet-name> <url-pattern>*.do</url-pattern> </servlet-mapping>
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/WEB-INF/pages/"></property> <property name="suffix" value=".jsp"></property> </bean>
<!--配置 ContextLoaderListener 用以初始化 Spring IoC 容器一> <listener> <listener-class> org.springframework.web.context.ContextLoaderListener </listener-class> </listener > <配置 DispatcherServlet>
ContextLoaderListener 實現了接口 ServletContextListener ,經過 Java Web 容器的 習, 咱們知道 ServletContextListener 的做用是能夠在整個 We 工程先後加入自定義代 碼,因此能夠在 Web 工程初始化以前,它先完成對 Spring IoC 容器的初始化,也可 以在 Web 工程關閉之時完成 Spring IoC 容器的資源進行釋放。javascript
<!一使用註解驅動--> <mvc : annotation-driven /> <!必定義掃描裝載的包一> <context :component-scan base-package =」 com.*」/> <!必定義視圖解析器一> <!一找到 Web 工程/WEB-INF /JSP 文件夾,且文件結尾爲 jsp 的文件做爲映射--> <bean id="viewResolver" class=」 org.springframework.web.servlet.view.InternalResourceViewResolver」 p:prefix=」/WEB-INF/jsp/」 p:suffix=」. jsp」/>
一、服務器啓動,應用被加載。讀取到 web.xml 中的配置建立 spring 容器而且初始化容器中的對象
從入門案例中能夠看到的是:HelloController 和 InternalResourceViewResolver,可是遠不
止這些。
二、瀏覽器發送請求,被 DispatherServlet 捕獲,該 Servlet 並不處理請求,而是把請求轉發出去。轉發
的路徑是根據請求 URL,匹配@RequestMapping 中的內容。
三、匹配到了後,執行對應方法。該方法有一個返回值。
四、根據方法的返回值,藉助 InternalResourceViewResolver 找到對應的結果視圖。
五、渲染結果視圖,響應瀏覽器。
用戶請求到達前端控制器,它就至關於 mvc 模式中的 c,dispatcherServlet 是整個流程控制的中心,由
它調用其它組件處理用戶的請求,dispatcherServlet 的存在下降了組件之間的耦合性。
HandlerMapping 負責根據用戶請求找到 Handler 即處理器,SpringMVC 提供了不一樣的映射器實現不一樣的映射方式,例如:配置文件方式,實現接口方式,註解方式
它就是咱們開發中要編寫的具體業務控制器。由 DispatcherServlet 把用戶請求轉發到 Handler。由
Handler 對具體的用戶請求進行處理。
經過 HandlerAdapter 對處理器進行執行,這是適配器模式的應用,經過擴展適配器能夠對更多類型的處理
器進行執行。
View Resolver負責將處理結果生成 View 視圖,View Resolver首先根據邏輯視圖名解析成物理視圖名即具體的頁面地址,再生成 View 視圖對象,最後對 View 進行渲染將處理結果經過頁面展現給用
SpringMVC 框架提供了不少的 View 視圖類型的支持,包括:jstlView、freemarkerView、pdfView等。咱們最經常使用的視圖就是 jsp。通常狀況下須要經過頁面標籤或頁面模版技術將模型數據經過頁面展現給用戶,須要由程序員根據業務需求開發具體的頁面
在 SpringMVC 的各個組件中,處理器映射器、處理器適配器、視圖解析器稱爲 SpringMVC 的三大組件。
使 用 <mvc:annotation-driven> 自動加載 RequestMappingHandlerMapping (處理映射器) 和
RequestMappingHandlerAdapter ( 處 理 適 配 器 ) , 可 用 在 SpringMVC.xml 配 置 文 件 中 使 用
<mvc:annotation-driven>替代註解處理器和適配器的配置。
它就至關於在 xml 中配置了:
...................幾個類的servlet配置
post 請求方式:在 web.xml 中配置一個過濾器<!-- 配置 springMVC 編碼過濾器 -->
<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> <!-- 啓動過濾器 --> <init-param> <param-name>forceEncoding</param-name> <param-value>true</param-value> </init-param> </filter> <!-- 過濾全部請求 --> <filter-mapping> <filter-name>CharacterEncodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> 在 springmvc 的配置文件中能夠配置,靜態資源不過濾: <!-- location 表示路徑,mapping 表示文件,**表示該目錄下的文件以及子目錄的文件 --> <mvc:resources location="/css/" mapping="/css/**"/> <mvc:resources location="/images/" mapping="/images/**"/> <mvc:resources location="/scripts/" mapping="/javascript/**"/>
get 請求方式:
tomacat 對 GET 和 POST 請求處理方式是不一樣的,GET 請求的編碼問題,要改 tomcat 的 server.xml
配置文件,以下:
<Connector connectionTimeout="20000" port="8080"
protocol="HTTP/1.1" redirectPort="8443"/>
改成:
<Connector connectionTimeout="20000" port="8080"
protocol="HTTP/1.1" redirectPort="8443"
useBodyEncodingForURI="true"/>
若是遇到 ajax 請求仍然亂碼,請把:
useBodyEncodingForURI="true"改成 URIEncoding="UTF-8"便可。
做用:
把請求中指定名稱的參數給控制器中的形參賦值。
屬性:
value:請求參數中的名稱。
required:請求參數中是否必須提供此參數。默認值:true。表示必須提供,若是不提供將報
示例:
public String useRequestParam(
做用:
用於獲取請求體內容。直接使用獲得是 key=value&key=value...結構的數據。通常獲取從前臺傳過來的json字符串
get 請求方式不適用。
屬性:
required:是否必須有請求體。默認值是:true。當取值爲 true 時,get 請求方式會報錯。若是取值
爲 false,get 請求獲得是 null。
示例:public String useRequestBody(
做用:
用於綁定 url 中的佔位符。例如:請求 url 中 /delete/{id},這個{id}就是 url 佔位符。url 支持佔位符是 spring3.0 以後加入的。是 springmvc 支持 rest 風格 URL 的一個重要標誌。
屬性:
value:用於指定 url 中佔位符名稱。required:是否必須提供佔位
示例:
<a href="springmvc/usePathVariable/100">pathVariable 註解</a>
@RequestMapping("/usePathVariable/{id}")public String usePathVariable(@PathVariable("id") Integer id)System.out.println(id);return "success"
Java EE 基礎學習中,有時候咱們會暫存數據到 HTTP request對象或者Session對象中,在開發控制器的時候,有時也須要保存對應的數據到這些對象中去,或者從中獲取數據。而 Spring MVC 給予了支持,它的主要註解有 個:@RquestAttribute,@SessionAttribute,@SessionAttributes.他們的主要做用以下:css
• RequestAttribute 獲取在HTTP 的請求( request )對象屬性值,用來傳遞給控制器的參數。 • SessionAttribute 在HTTP的會話( Session )對象屬性值中,用來傳遞給控制器的參數。 • SessionAttributes 能夠給它配置一個字符串數組,這個數組對應的是數據模型對應的鍵值對 而後將這些鍵值對保存到 Session 中。前端
做用:獲取在HTTP 的請求( request )對象屬性值,用來傳遞給控制器的參數。
範圍:一次請求中
下面兩個註解和 HTTP 的會話對象有關,在瀏覽器和服務器保持聯繫的時候 HTTP 會建立一個會話對象,這樣可讓咱們在和服務器會話期間(請注意這個時間範圍)經過它讀/寫會話對象的屬性,緩存必定數據信息。 先來討論一下設置會話屬性,在控制器中可使用註解@SessionAttributes 來設置對應的鍵值對,不過這個註解只能對類進行標註,不能對方法或者參數註解它能夠配置屬性名稱或者屬性類型。它的做用是當這個類被註解後, Spring MVC 執行完控制器的邏輯後,將數據模型中對應的屬性名稱或者屬性類型保存到 HTTP的Session 對象中。java
做用:在HTTP的會話( Session )對象屬性值中,用來傳遞給控制器的參數。
做用:能夠給它配置一個字符串數組,這個數組對應的是數據模型對應的鍵值對,而後將這些鍵值對保存到Session中。
什麼是 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):把資源具體呈現出來的形式,叫作它的表現層 (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
/account HTTP POST: 新增 account
return "redirect: ./show.do";
在 URL 重定向的過程當中,並不能有效傳遞對象,由於 HTTP 的重定向參數是以字符串傳遞的。這個時SpringMVC提供了 個方法一-flash 屬性,你須要提供的數據模型就是 一個RedirectAttribute ,讓咱們先來看看它是怎麼實現的程序員
原理:web
使用addFlashAttribut 方法後, spring MVC 會將數據保存到 Session中(session在一個會話期有效),重定向後咱們會將其清除,這樣咱們就能將其傳遞給下一個地址了,如圖所示ajax