SpringMvc簡介及使用
很多應用程式的問題在於處理業務資料和顯示業務資料的檢視的物件之間存在緊密耦合。通常,更新業務物件的命令都是從檢視本身發起的,使檢視對任何業務物件更改都有高度敏感性。而且,當多個檢視依賴同一個業務物件是沒有靈活性的。
Spring Web Mvc是一種基於Java的實現了Web Mvc設計模式的請求驅動型別的輕量級web框架,即使使用了MVC架構模式的思想,將web層進行指責解耦,基於請求驅動指的是使用請求-響應模型,框架的目的就是幫助我們簡化開發,Spring Web Mvc也是我們日常web開發的。
一、SpringMvc簡介
在早期的Javaweb開發中,統一把顯示層、控制層、資料層的操作全部交給JSP或者JavaBean來進行處理,稱作為Model1:
這樣開發web應用的話會出現幾個弊端,
- Jsp和JavaBean之間嚴重耦合,Java程式碼和HTML程式碼耦合在了一起
- 對於開發者的要求大大增加,需要前後端一起掌握
- 前端和後端相互依賴,前端需要等待後端完成,後端也需要等待前端完成,才能進行測試的過程
- 程式碼難以複用
所以出現了servlet+jsp+JavaBean這種模式,這就是早期的MVC模式model2:
首先使用者的請求會到達servlet,然後根據請求呼叫響應的JavaBean,並把所有顯示的結果交給JSP去完成,這樣的模式就稱作為MVC模式化
- M代表模型,模型就是資料,就是dao,bean
- V代表檢視,檢視就是網頁,用來展示模型中的資料
- C代表控制器,控制器就是把不同的資料展示在不同的頁面上,servlet就是這個角色
為了解決一些問題,資料庫事務問題和NoSql,傳統的模型層被拆分為業務層和資料訪問層。在service下可以通過spring的宣告式事務操作資料訪問層。在業務層上允許可以直接訪問NoSql,這樣就能滿足Nosqsl,它可以大大的提高網際網路的效能。
架構的特點為:結構鬆散,幾乎可以在Spring Mvc中使用各類檢視;鬆耦合,各個模組分離;與spring無縫整合。
二、SpringMvc使用
使用idea建立一個springMvc架構專案,idea會自動下載一些所需的jar包,並且建立好結構,結構圖如下圖所示
修改web.xml配置檔案,攔截所有的請求,並交由Spring Mvc的後臺控制器來處理,
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" version="4.0"> <context-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/applicationContext.xml</param-value> </context-param> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <servlet> <servlet-name>dispatcher</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>dispatcher</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> </web-app>
修改spring 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" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <bean id="simpleUrlHandlerMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping"> <property name="mappings"> <props> <!-- /hello 路徑的請求交給 id 為 helloController 的控制器處理--> <prop key="/hello">helloController</prop> </props> </property> </bean> <bean id="helloController" class="controller.HelloController"></bean> </beans>
編寫HelloController類,獲取請求後操作index.jsp頁面
public class HelloController implements Controller { @Override public ModelAndView handleRequest(javax.servlet.http.HttpServletRequest httpServletRequest, javax.servlet.http.HttpServletResponse httpServletResponse) throws Exception { ModelAndView mav = new ModelAndView("index.jsp"); mav.addObject("message", "Hello Spring MVC"); return mav; } }
編寫好index,jsp和配置Tomcat及相關環境啟動即可
根據Spring Mvc請求
當用戶在頁面中點選連線或者提交表單的時候,請求就開始工作了,從離開瀏覽器開始到獲取響應返回,它會經歷很多站點,在每一個站點都會留下一些資訊同時也會帶上其他資訊。
第一站:DispatcherServlet
從請求離開瀏覽器以後,第一站到達的就是DispatcherServlet,看名字的話是一個servlet,servlet是可以攔截並處理HTTP請求,DispatcherServlet會攔截所有的請求,並且把這些請求發給Spring Mvc控制器
<servlet> <servlet-name>dispatcher</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>dispatcher</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping>
DispatcherServlet的任務就是攔截請求傳送給Spring Mvc控制器
第二站:處理對映器
應用程式中可能會有很多個控制器,那麼這些請求是對應哪個控制器呢?
所以DispatcherServlet會查詢一個或多個處理器來確定下一站是哪裡,處理器對映會根據請求的地址來進行決定,例如simpleUrlHandlerMapping 來將/hello地址交給HelloController類進行處理
<bean id="simpleUrlHandlerMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping"> <property name="mappings"> <props> <!-- /hello 路徑的請求交給 id 為 helloController 的控制器處理--> <prop key="/hello">helloController</prop> </props> </property> </bean> <bean id="helloController" class="controller.HelloController"></bean>
第三站:控制器
一旦選擇了合適的控制器,DispatcherServlet會將請求傳送給選中的控制器,到了控制器,請求會將使用者的請求傳送到控制器等待控制器處理完這些資訊然後返回
public class HelloController implements Controller { @Override public ModelAndView handleRequest(javax.servlet.http.HttpServletRequest httpServletRequest, javax.servlet.http.HttpServletResponse httpServletResponse) throws Exception { //處理邏輯 } }
第四站:返回DispatcherServlet
當控制器在完成邏輯處理後,會產生一些資訊,這些資訊就是需要返回給使用者在瀏覽器上顯示的資訊,它們被稱作為模型(model)。這些資訊需要以使用者友好的方式進行格式化,一般是HTML,所以資訊需要傳送一個檢視(view),通常會是jsp。
控制器所做的最後一件事情就是將資料模型打包,並且表示出用於渲染輸出的檢視名。接下來會將請求連同模型和檢視名傳送回DispatcherServlet。
第五站:檢視解析器
這樣一來,控制器就不會和特定的檢視耦合,傳遞給DispatcherServlet的檢視名並不直接表示某個特定的JSP。相反,它傳遞的僅僅是一個邏輯名稱,這個名稱將會用來查詢產生結果的真正檢視。
第六站:檢視
既然DispatcherServlet已經知道哪個檢視渲染結果,那請求的任務基本上已經完成了。檢視交付模型資料,請求的任務也就完成了。檢視使用模型資料渲染出結果,這個輸出結果會通過影響物件傳遞給客戶端