初識Spring MVC
一、spring MVC 簡介
1. Spring MVC也叫Spring Web mvc,屬於表現層的框架。Spring MVC是spring框架的一部分,是在Spring3.0後發布的。
2.spring MVC架構
(1)
(2)
3.spring MVC請求流程
request---------->DispatcherServlet(中央調度器/前端控制器)--------->HandlerMapping(處理器映射器)------------>返回一個執行鏈--------->將執行鏈轉交給 HandlerAdaptor(處理器適配器)------->
調度Handler(處理器)--------->ModelAndView--------->先將結果交給HandlerAdaptor,然後再由HandlerAdaptor轉交給DispatcherServlet--------->DispatcherServlet調度ViewResolver(試圖解析器)-------->交給DispatcherServlet--------->尋找View-------->View做出響應(response)。
4.SpringMVC第一個入門案例
案例:用戶提交一個請求,服務器端處理器在接受到這個請求後,給出一條歡迎信息,在頁面中顯示。
01.導入jar包
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>4.3.7.RELEASE</version> </dependency> <!-- https://mvnrepository.com/artifact/org.springframework/spring-context-support --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context-support</artifactId> <version>4.2.0.RELEASE</version> </dependency>
02. 配置步驟
1〉在web.xml中配置前端控制器
2〉處理器映射器(HandlerMapping,有默認值,因此可以不用配置)
3〉處理器適配器(HandlerAdaptor,有默認值,因此可以不用配置)
4〉處理器
5〉試圖解析器(ViewResovler,有默認值,因此可以不用配置)
03.註冊前端控制器
<web-app> <display-name>Archetype Created Web Application</display-name> <servlet> <servlet-name>springmvc</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:applicationContext.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>springmvc</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> </web-app>
04.定制處理器
import org.springframework.web.servlet.ModelAndView; import org.springframework.web.servlet.mvc.Controller; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class FirstController implements Controller { public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception { ModelAndView mv = new ModelAndView(); mv.setViewName("/index.jsp"); //邏輯視圖名 return mv; } }
05.jsp頁面的搭建
<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <html> <head> <title>Title</title> </head> <body> <h2>Hello World!</h2> </body> </html>
06.applicationContext.xml配置
<?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:mv="http://www.springframework.org/schema/mvc" 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"> <bean id="/hello.do" class="cn.happy.controller.FirstController"></bean> </beans>
5.第一個案例的提升----〉試圖解析器
01.在applicationContext.xml中加入:
<!--試圖解析器--> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <!--前綴--> <property name="prefix" value="/"></property> <!--後綴--> <property name="suffix" value=".jsp"></property> </bean>
02.將定制處理器中的邏輯試圖名修改一下:
mv.setViewName("index"); //邏輯視圖名
6.關於urlpattern的說法
01.最好配成*.do,不能配成/*,(無法訪問*.jsp等動態資源),最好也不要配成/(無法訪問靜態資源),不得不配成/。一切源於Restful編程
02.不能配置為/* : DispatcherServlet會將向動態頁面請求,即向jsp頁面跳轉請求也當作是一個普通的Controller請求。中央調度器會調用處理器映射器為其查找相應的處理器。當然是找不到的。jap頁面回報404錯誤。 結論: /* 會攔截動態資源。
7.解決動態資源無法訪問的三種方法:
01.不得不配成/,使用Tomcat默認的Servlet解決,在web.xml中加入如下代碼:
<!--解決靜態資源方案 一 --> <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>*.jpg</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>*.css</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>*.js</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>*.pdb</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>*.gif</url-pattern> </servlet-mapping>
02. 使用MVC的default-servlet-handler,會將對靜態資源訪問的請求通過HandlerMapping映射到默認的Servlet請求處理器DefaultServletRequestHandler對象。而該處理器調用了Tomcat的DefaultServlet來處理靜態資源的訪問請求。當然需要引入mvc約束。
xmlns:mv="http://www.springframework.org/schema/mvc" <!--解決靜態資源方案二 放在映射器下面--> <mv:default-servlet-handler/>
03.使用MVC的resource解決
在spring3.0.4之後,spring定義了專門用於處理靜態資源請求處理器ResourceHttpRequestHandler。並且添加了<mvc:resource/>標簽,專門用於解決靜態資源無法訪問問題。
<!--解決靜態資源方案三--> <mv:resources mapping="/image/**" location="/image/"/>
Location:靜態資源所在的目錄
mapping:對資源的請求
初識Spring MVC