SpringMVC原理圖: 步驟: 前端控制器對視圖進行渲染。 View——>渲染,View會根據傳進來的Model模型數據進行渲染,此處的Model實際是一個Map數據結構,所以其很容易支持其他視圖技術。 組件介紹: 前端控制器(DispatcherServlet):接收請求,響應結果。 處理器映 ...
SpringMVC原理圖:
步驟:
- 首先用戶發送請求。——>DispatcherServlet,前端控制器收到請求後自己不進行處理,而是委托給其他的解析器進行處理,作為統一訪問點,進行全局的流程式控制制。
- DispatcherServlet——>HandlerMapping, HandlerMapping將會把請求映射為HandlerExecutionChain對象(包含一個Handler處理器(頁面控制器)對象、多個HandlerInterceptor攔截器)對象,使用了策略模式。
- 前端控制器調用適配器去執行Handler。DispatcherServlet——>HandlerAdapter,HandlerAdapter將會把處理器包裝為適配器,從而支持多種類型的處理器,即適配器設計模式的應用。
- 處理器適配器去執行handler。HandlerAdapter——>處理器功能處理方法的調用,HandlerAdapter將會根據適配的結果調用真正的處理器的功能處理方法,完成功能處理;並返回一個ModelAndView對象(包含模型數據、邏輯視圖名)。
- 前端控制器請求視圖解析器去進行視圖的解析。ModelAndView的邏輯視圖名——> ViewResolver, ViewResolver將把邏輯視圖名解析為具體的View,再次使用策略模式。
-
前端控制器對視圖進行渲染。 View——>渲染,View會根據傳進來的Model模型數據進行渲染,此處的Model實際是一個Map數據結構,所以其很容易支持其他視圖技術。
- 返回控制權給DispatcherServlet,由DispatcherServlet返迴響應給用戶,到此一個流程結束。(圖中的連線有錯,偷懶沒有改過來)。
組件介紹:
- 前端控制器(DispatcherServlet):接收請求,響應結果。
-
處理器映射器(HandlerMapping):根據url去查找handler。
- 處理器(Handler):(這個是我們自己寫的)。
-
處理器適配器(HandlerAdapter):要求我們按照這個規則去寫。
-
視圖解析器(ViewResolver):把邏輯視圖解析成真正的視圖。真正的視圖=首碼+邏輯視圖名+尾碼
-
視圖(View):需要用戶自己開發。
一.基於註解的HelloWorld
1.導入jar包
2.在web.xml文件中配置一個前端控制器(DispatcherServlet)
web.xml
1 <servlet> 2 <servlet-name>dispatcher</servlet-name> 3 <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 4 <!-- 5 預設的配置文件的地址:/WEB-INF/servlet的名字-servlet.xml,如需另外指定 6 <init-param> 7 <param-name>contextConfigLocation</param-name> 8 <param-value>classpath:文件名</param-value> 9 </init-param> 10 --> 11 </servlet> 12 <servlet-mapping> 13 <servlet-name>dispatcher</servlet-name> 14 <!-- 15 第一種:*.html,*.action 就是過濾以.xxx結尾的 16 第二種:/ 所有的地址都會進入這個進行解析,靜態的資源,需要添加配置 17 第三種:/* 他就是變態,連jsp頁面都進來,結果就是報錯XXXXX別用 18 -> 19 <url-pattern>/</url-pattern> 20 </servlet-mapping>
3.配置處理器映射器(HandlerMapping)和處理器適配器(HandlerAdapter),視圖解析器(ViewResolver)
dispatcher-servlet.xml
1 <!-- 處理器映射器 --> 2 <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"></bean> 3 <!-- 處理器適配器 --> 4 <bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"></bean> 5 <!-- 配置ViewResolver --> 6 <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"> 7 <property name="prefix" value="/WEB-INF/jsp/"></property> 8 <property name="suffix" value=".jsp"></property> 9 </bean>
其實,上面我們說的處理器適配器(HandlerAdapter)和處理器映射器(HandlerMapping)在這裡可以不用配置,因為SpringMVC會預設載入這些配置。
採用預設的註解驅動:<mvc:annotation-driven/>, 預設的註解驅動,裡面有很多參數綁定的方法 。
用註解我們不可以一個個去掃描Handler,所以採用組件掃描的方式:
<context:component-scan base-package="com.test"></context:component-scan>
HelloWorld.java
1 package com.test.controller; 2 3 import java.util.HashMap; 4 import java.util.Map; 5 6 import org.springframework.stereotype.Controller; 7 import org.springframework.web.bind.annotation.RequestMapping; 8 import org.springframework.web.bind.annotation.RequestMethod; 9 import org.springframework.web.servlet.ModelAndView; 10 11 @Controller 12 @RequestMapping(value = "/hello") 13 public class HelloWorld { 14 @RequestMapping(value = "/hello")// 就是訪問的路徑 15 public ModelAndView hello() { 16 Map<String, String> map = new HashMap<String, String>(); 17 map.put("name", "傻逼"); 18 ModelAndView mv = new ModelAndView("hello", map); 19 return mv; 20 } 21 22 }
至此,基本的配置就完成了。
下麵再來介紹一下幾個基本的註解:
- @requestMapping()——基本的url映射
- 窄化映射請求(可以在類上面定義根路徑,在方法上面定義子路徑),此時你訪問的路徑就是:根路徑+子路徑。
- 顯示http請求的方法:@requestMapping(value="/user",method="{RequestMethod.POST}")。限制後的出錯信息:
2.@Controller
方法返回值的討論:
-
- 返回ModelAndView:返回一個邏輯視圖名和數據放在request中。
- 返回String:
- 返回一個邏輯視圖名。
- 重定向:return "redirect:路徑"
1 @RequestMapping(value = "/index") 2 public String index() { 3 return "redirect:hello"; 4 }
- 請求轉發:return "forward:路徑"。類比Servlet中的request.getRequestDispatcher("/WEB-INF/jsp/xxx.jsp").forward(request, response);
- 返回void:(此時用法和servlet一樣)
1 public void test_void(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException { 2 request.getParameter(""); 3 request.getRequestDispatcher("").forward(request, response); 4 }