springmvc請求流程:
- 1、用戶發送請求至前端控制器DispatcherServlet
- 2、DispatcherServlet收到請求調用HandlerMapping處理器映射器。
- 3、處理器映射器根據請求url找到具體的處理器,生成處理器對象及處理器攔截器(如果有則生成)一並返回給DispatcherServlet。
- 4、DispatcherServlet通過HandlerAdapter處理器適配器調用處理器
- 5、執行處理器(Controller,也叫后端控制器)。
- 6、Controller執行完成返回ModelAndView
- 7、HandlerAdapter將controller執行結果ModelAndView返回給DispatcherServlet
- 8、DispatcherServlet將ModelAndView傳給ViewReslover視圖解析器
- 9、ViewReslover解析后返回具體View
- 10、DispatcherServlet對View進行渲染視圖(即將模型數據填充至視圖中)。
- 11、DispatcherServlet響應用戶
入門程序
1.創建web工程,不使用SpringMVC模板。
2、設置項目名稱為SpringMVCDemo
3、導入jar包
4、jar包引入到項目中。
5、在src下添加一個Spring配置文件,項目目錄結構如下:
6、SpringMVC本身就是Spring的子項目,對Spring兼容性很好,不需要做很多配置。這里只配置一個Controller掃描就可以了,讓Spring對頁面控制層Controller進行管理。
<?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:p="http://www.springframework.org/schema/p" xmlns:context="http://www.springframework.org/schema/context" xmlns:mvc="http://www.springframework.org/schema/mvc" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd"> <!-- 配置controller掃描包 --> <context:component-scan base-package="com.yyb.controller" /> </beans>
7、 配置前端控制器。配置SpringMVC的前端控制器DispatcherServlet。在web.xml中:
<?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_3_1.xsd" version="3.1"> <!-- 配置SpringMVC前端控制器 --> <servlet> <servlet-name>springmvc-demo</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <!-- 指定SpringMVC配置文件 --> <!-- SpringMVC的配置文件的默認路徑是/WEB-INF/${servlet-name}-servlet.xml --> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:springmvc.xml</param-value> </init-param> </servlet> <servlet-mapping> <servlet-name>springmvc-demo</servlet-name> <!-- 設置所有以action結尾的請求進入SpringMVC --> <url-pattern>*.action</url-pattern> </servlet-mapping> </web-app>
8、在index.jsp中添加以下代碼:
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt"%> <html> <head> <title>$Title$</title> </head> <body> <table width="100%" border=1> <tr> <td>商品名稱</td> <td>商品價格</td> <td>生產日期</td> <td>商品描述</td> </tr> <c:forEach items="${list}" var="item"> <tr> <td>${item.name }</td> <td>${item.price }</td> <td><fmt:formatDate value="${item.createtime}" pattern="yyyy-MM-dd HH:mm:ss"/></td> <td>${item.detail }</td> </tr> </c:forEach> </table> </body> </html>
9、創建pojo,創建商品pojo:

package com.yyb.bean; import java.util.Date; /** * Created by yang on 2017/8/12. */ public class Item { // 商品id private int id; // 商品名稱 private String name; // 商品價格 private double price; // 商品創建時間 private Date createtime; // 商品描述 private String detail; public Item() {} public Item(int id, String name, double price, Date createtime, String detail) { this.id = id; this.name = name; this.price = price; this.createtime = createtime; this.detail = detail; } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public double getPrice() { return price; } public void setPrice(double price) { this.price = price; } public Date getCreatetime() { return createtime; } public void setCreatetime(Date createtime) { this.createtime = createtime; } public String getDetail() { return detail; } public void setDetail(String detail) { this.detail = detail; } }
10、創建ItemController。ItemController是一個普通的java類,不需要實現任何接口。需要在類上添加@Controller注解,把Controller交由Spring管理,在方法上面添加@RequestMapping注解,里面指定請求的url。其中“.action”可以加也可以不加。
package com.yyb.controller; import com.yyb.bean.Item; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.servlet.ModelAndView; import java.util.ArrayList; import java.util.Date; import java.util.List; /** * Created by yang on 2017/8/12. */ @Controller public class ItemController { // @RequestMapping:里面放的是請求的url,和用戶請求的url進行匹配 // action可以寫也可以不寫 @RequestMapping("/itemList.action") public ModelAndView queryItemList() { // 創建頁面需要顯示的商品數據 List<Item> list = new ArrayList<>(); list.add(new Item(1, "1華為 榮耀8", 2399, new Date(), "質量好!1")); list.add(new Item(2, "2華為 榮耀8", 2399, new Date(), "質量好!2")); list.add(new Item(3, "3華為 榮耀8", 2399, new Date(), "質量好!3")); list.add(new Item(4, "4華為 榮耀8", 2399, new Date(), "質量好!4")); list.add(new Item(5, "5華為 榮耀8", 2399, new Date(), "質量好!5")); list.add(new Item(6, "6華為 榮耀8", 2399, new Date(), "質量好!6")); // 創建ModelAndView,用來存放數據和視圖 ModelAndView modelAndView = new ModelAndView(); // 設置數據到模型中 modelAndView.addObject("list", list); // 設置視圖jsp,需要設置視圖的物理地址 modelAndView.setViewName("index.jsp"); return modelAndView; } }
11、啟動項目測試。啟動項目,瀏覽器訪問地址:http://localhost:8080/SpringMVCDemo/itemList.action
效果如下圖:
Springmvc架構
框架結構如下圖:
組件說明
以下組件通常使用框架提供實現:
- DispatcherServlet:前端控制器。用戶請求到達前端控制器,它就相當於mvc模式中的c,dispatcherServlet是整個流程控制的中心,由它調用其它組件處理用戶的請求,dispatcherServlet的存在降低了組件之間的耦合性。
- HandlerMapping:處理器映射器。HandlerMapping負責根據用戶請求url找到Handler即處理器,springmvc提供了不同的映射器實現不同的映射方式,例如:配置文件方式,實現接口方式,注解方式等。
- Handler:處理器,也就是程序員要開發的部分。Handler 是繼DispatcherServlet前端控制器的后端控制器,在DispatcherServlet的控制下Handler對具體的用戶請求進行處理。由於Handler涉及到具體的用戶業務請求,所以一般情況需要程序員根據業務需求開發Handler。
- HandlAdapter:處理器適配器。通過HandlerAdapter對處理器進行執行,這是適配器模式的應用,通過擴展適配器可以對更多類型的處理器進行執行。
- ViewResolver:視圖解析器。View Resolver負責將處理結果生成View視圖,View Resolver首先根據邏輯視圖名解析成物理視圖名即具體的頁面地址,再生成View視圖對象,最后對View進行渲染將處理結果通過頁面展示給用戶。
- View:視圖。springmvc框架提供了很多的View視圖類型的支持,包括:jstlView、freemarkerView、pdfView等。我們最常用的視圖就是jsp。一般情況下需要通過頁面標簽或頁面模版技術將模型數據通過頁面展示給用戶,需要由程序員根據業務需求開發具體的頁面。
在springmvc的各個組件中,處理器映射器、處理器適配器、視圖解析器稱為springmvc的三大組件。需要用戶開發的組件有handler、view。
默認加載的組件:
我們沒有做任何配置,就可以使用這些組件,因為框架已經默認加載這些組件了,配置文件位置如下圖:
組件掃描器:
使用組件掃描器省去在spring容器配置每個Controller類的繁瑣。使用<context:component-scan>自動掃描標記@Controller的控制器類,在springmvc.xml配置文件中配置如下:
<!-- 配置controller掃描包,多個包之間用,分隔 --> <context:component-scan base-package="cn.itcast.springmvc.controller" />
注解映射器和適配器
1、配置處理器映射器
@RequestMapping:定義請求url到處理器功能方法的映射。
注解式處理器映射器,對類中標記了@ResquestMapping的方法進行映射。根據@ResquestMapping定義的url匹配@ResquestMapping標記的方法,匹配成功返回HandlerMethod對象給前端控制器。HandlerMethod對象中封裝url對應的方法Method。從spring3.1版本開始,廢除了DefaultAnnotationHandlerMapping的使用,推薦使用RequestMappingHandlerMapping完成注解式處理器映射。
在springmvc.xml配置文件中配置如下:
<!-- 配置處理器映射器 --> <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping" /> </bean>
2、配置處理器適配器
從spring3.1版本開始,廢除了AnnotationMethodHandlerAdapter的使用,推薦使用RequestMappingHandlerAdapter完成注解式處理器適配。在springmvc.xml配置文件中配置如下:
<!-- 配置處理器適配器 --> <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter" /> </bean>
3、注解驅動
上面的方式直接配置處理器映射器和處理器適配器比較麻煩,可以使用注解驅動來加載。SpringMVC使用<mvc:annotation-driven>自動加載RequestMappingHandlerMapping和RequestMappingHandlerAdapter。可以在springmvc.xml配置文件中使用<mvc:annotation-driven>替代注解處理器和適配器的配置。
<!-- 注解驅動 --> <mvc:annotation-driven />
視圖解析器
視圖解析器使用SpringMVC框架默認的InternalResourceViewResolver,這個視圖解析器支持JSP視圖解析,在springmvc.xml配置文件中配置如下:
<!-- 配置視圖解析器,不用每次都寫前綴和后綴,比如:/WEB-INF/jsp/test.jsp --> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <!-- 配置邏輯視圖的前綴 --> <property name="prefix" value="/WEB-INF/jsp/" /> <!-- 配置邏輯視圖的后綴 --> <property name="suffix" value=".jsp" /> </bean>
邏輯視圖名需要在controller中返回ModelAndView指定,最終jsp物理地址:前綴+邏輯視圖名+后綴
// 設置視圖jsp,需要設置視圖的物理地址 // modelAndView.setViewName("/WEB-INF/jsp/itemList.jsp"); // 配置好視圖解析器前綴和后綴,這里只需要設置邏輯視圖就可以了。 // 視圖解析器根據前綴+邏輯視圖名+后綴拼接出來物理路徑 modelAndView.setViewName("itemList");
在SpringMVC中 /* 和 / 的區別
- <url-pattern> / </url-pattern>:會匹配到 /springmvc 這樣的路徑型url,而不會匹配到像 .jsp 這樣的后綴型的url。
- <url-pattern> /* </url-pattern>:會匹配到所有的url:路徑型url 和后綴型的url (包括/springmvc,.jsp,.js,和.html等)。
對靜態資源放行
web.xml配置時,是設置所有的請求都進入SpringMVC。但是SpringMVC無法處理css、js等靜態資源,所以無法正常顯示。
方式一:在springmvc.xml中配置:
<!--對靜態資源放行--> <!--**防止文件夾下又有文件夾--> <mvc:resources mapping="/css/**" location="/css/"></mvc:resources> <mvc:resources mapping="/fonts/**" location="/fonts/"></mvc:resources> <mvc:resources mapping="/js/**" location="/js/"></mvc:resources>
方式二:在springmvc.xml中配置:
<!-- 解決靜態資源無法被springMVC處理的問題 --> <mvc:default-servlet-handler />