Spring MVC的介紹
Spring Web MVC是一種基於Java的實現了Web MVC設計模式的請求驅動類型的輕量級Web框架,
即使用了MVC架構模式的思想,將web層進行職責解耦,基於請求驅動指的就是使用請求-響應模型,
框架的目的就是幫助我們簡化開發,Spring Web MVC也是要簡化我們日常Web開發
MVC設計模式
MVC 是一種著名的設計模式,特別是在 Web 應用程序領域。模式全都是關於將包含業務數據的模塊與顯示模塊的視圖解耦的。這是怎樣發生的?視圖(例如,JSP 頁面)怎樣能夠與其模型(例如,包含數據的 JavaBean)解耦?記得這句格言么?一個層次的重定向幾乎可以解決計算機業中的所有問題。確實,在模型和視圖之間引入重定向層可以解決問題。此重定向層是控制器。控制器將接收請求,執行更新模型的操作,然后通知視圖關於模型更改的消息。依賴於模型的狀態並且依賴於請求的控制器可以決定要顯示哪個視圖。
Spring MVC框架的優勢(特點)
1、清晰的角色划分:
前端控制器(DispatcherServlet)、
請求到處理器映射(HandlerMapping)、
處理器適配器(HandlerAdapter)、
視圖解析器(ViewResolver)、
處理器或頁面控制器(Controller)、
驗證器( Validator)、
表單對象(Form Object 提供給表單展示和提交到的對象就叫表單對象)。
2、由於命令對象就是一個POJO,無需繼承框架特定API,可以使用命令對象直接作為業務對象;
3、和Spring 其他框架無縫集成,是其它Web框架所不具備的;
4、可適配,通過HandlerAdapter可以支持任意的類作為處理器;
5、可定制性,HandlerMapping、ViewResolver等能夠非常簡單的定制;
6、功能強大的數據驗證、格式化、綁定機制;
7、利用Spring提供的Mock對象能夠非常簡單的進行Web層單元測試;
8、本地化、主題的解析的支持,使我們更容易進行國際化和主題的切換。
9、RESTful風格的支持、簡單的文件上傳、約定優於配置的契約式編程支持、基於注解的零配置支持等等。
MVC三元組的概念
Model(模型):組件等價於 實體層 + 業務邏輯層 + 持久層
View(視圖):負責進行模型的展示,一般就是我們見到的用戶界面,客戶想看到的東西。
Controller(控制器):接收用戶請求,委托給模型進行處理(狀態改變),處理完畢后把返回的模型數據返回給視圖。
SpringMVC框架請求處理流程
具體步驟:
第一步:發起請求到前端控制器(DispatcherServlet)
第二步:前端控制器請求HandlerMapping查找 Handler (可以根據xml配置、注解進行查找)
第三步:處理器映射器HandlerMapping向前端控制器返回Handler,HandlerMapping會把請求映射為HandlerExecutionChain對象
(包含一個Handler處理器(頁面控制器)對象,多個HandlerInterceptor攔截器對象),通過這種策略模式,很容易
添加新的映射策略
第四步:前端控制器調用處理器適配器去執行Handler
第五步:處理器適配器HandlerAdapter將會根據適配的結果去執行Handler
第六步:Handler執行完成給適配器返回ModelAndView
第七步:處理器適配器向前端控制器返回ModelAndView (ModelAndView是springmvc框架的一個底層對象,包括 Model和view)
第八步:前端控制器請求視圖解析器去進行視圖解析 (根據邏輯視圖名解析成真正的視圖(jsp)),通過這種策略很容易更換其
他視圖技術,只需要更改視圖解析器即可
第九步:視圖解析器向前端控制器返回View
第十步:前端控制器進行視圖渲染 (視圖渲染將模型數據(在ModelAndView對象中)填充到request域)
第十一步:前端控制器向用戶響應結果
(摘自:https://www.cnblogs.com/leskang/p/6101368.html)
Spring MVC 框架小案例
步驟一:導入依賴
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>4.2.0.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-web</artifactId> <version>4.2.0.RELEASE</version> </dependency>
<dependency>
<groupId>javaee</groupId>
<artifactId>javaee-api</artifactId>
<version>5</version>
</dependency>
步驟二:創建控制器
public class FirstController implements Controller { /** * * @param httpServletRequest 請求對象 * @param httpServletResponse 響應對象 * @return * @throws Exception */ @Override public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception { ModelAndView mv=new ModelAndView(); mv.addObject("user","張三"); mv.setViewName("/jsp/index.jsp");
return mv; } }
步驟三:創建大配置文件(appliocationContext-mvc.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: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.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd"> <!--將Controller注入到容器中 id就是瀏覽器請求地址--> <bean id="/firstController" class="com.springmvc.controller.FirstController"/>
<!--視圖解析器--> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/jsp/"/> <property name="suffix" value=".jsp"/> </bean>
</beans>
步驟四:中央調度器(Web.xml)
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd" > <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:appliocationContext-mvc.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>
步驟五:index.jsp
<%@page language="java" pageEncoding="UTF-8" contentType="text/html; UTF-8" isELIgnored="false" %> <html> <body> <h2>Hello World!</h2> ${user} </body> </html>
Spring MVC 框架小案例(注解)
步驟一:修改控制器
/** * 控制器 */ @Controller @RequestMapping("/second") public class SecondController { @RequestMapping("one") public ModelAndView oneRequest(){ ModelAndView mv=new ModelAndView(); mv.addObject("user","張三"); mv.setViewName("index"); return mv; } @RequestMapping("two") public ModelAndView twoRequest(){ ModelAndView mv=new ModelAndView(); mv.addObject("user","李四"); mv.setViewName("index"); return mv; } }
步驟二:大配置文件
<?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: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.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd"> <!--將Controller注入到容器中 id就是瀏覽器請求地址--> <!--<bean id="/firstController" class="com.springmvc.controller.FirstController"/>--> <!--掃描注解--> <context:component-scan base-package="com.springmvc"/> <!--Spring對SpringMVC注解支持--> <mvc:annotation-driven/> <!--視圖解析器--> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/jsp/"/> <property name="suffix" value=".jsp"/> </bean> </beans>
Spring MVC攔截器
方式一:在web.xml中加入以下代碼(其他需求自行改變)
<!--基於DefaultServlet: 默認訪問前會執行DeafultServlet--> <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>*.jpg</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>*.gif</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>*.png</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>*.mp3</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>*.jpeg</url-pattern> </servlet-mapping>
方式二:大配置文件中加入
<!--攔截器--> <mvc:default-servlet-handler/>
方式三:大配置文件中加入
<!--Spring3.0.4版本提供資源釋放行為--> <mvc:resources mapping="/**" location="/img/"/>
.jsp中加入圖片
<%@page language="java" pageEncoding="UTF-8" contentType="text/html; UTF-8" isELIgnored="false" %> <html> <body> <h2>Hello World!</h2> ${user}<br> <img src="/img/20170610095055_G5LM8.jpeg" width="500" height="300"> </body> </html>