您好,登錄后才能下訂單哦!
spring WEB MVC框架提供了一個MVC(model-view-controller)模型-視圖-控制器的結構和組件,利用它可以開發更靈活、松耦合的web應用。MVC模式使得整個服務應用的各部分(控制邏輯、業務邏輯、UI界面展示)分離開來,使它們之間的耦合性更低。
Model
模型層封裝了整個應用程序的數據對象并且將會持久化POJO
View
視圖層負責渲染模型層的數據,一般最終使用HTML展示到用戶瀏覽器或移動設備終端
Controller
控制層負責處理用戶的請求、構建合適的模型數據并將其傳輸到視圖層進行渲染
SpringMVC核心-DispatcherServlet分發器
SpringMVC框架是設計用來處理所有的HTTP請求和響應的,它的核心是圍繞著一個分發器DispatcherServlet。在Spring Web MVC DispatcherServlet的請求處理流程如下圖所示:
以下是對應一個HTTP請求時分發器的處理流程:
1.接收到一個Http請求后,DispatcherServlet 告訴映射處理器HandlerMapping 去調用相應的Controller(控制器)。
2.然后Controller控制器根據接收到的的請求調用相應的Service服務方法,基于請求所使用的GET或PUT等其它請求方式。Service方法將會根據業務邏輯設置模型數據并且返回一個視圖給DispatcherServlet分發器。
3.DispatcherServlet 分發器將會請求視圖解析器ViewResolver去處理找到該請求對應的已經定義的視圖view。
4.一旦視圖確定了,DispatcherServlet 會將模型數據傳輸給該視圖view,最終渲染到用戶瀏覽設備上。
上述提到的所有組件:映射處理器HandlerMapping, 控制器Controller 和視圖解析器ViewResolver都是WebApplicationContext 的組成部分。WebApplicationContext 擴展了ApplicationContext ,但是為web應用程序提供了更多的必要的特性。
SpringMVC需要的配置要求
為了將用戶的請求映射到分發器DispatcherServlet 去處理,需要在web.xml中配置URL映射。
以下是一個聲明和映射了Demo應用HelloWeb的分發器DispatcherServlet 的配置示例(就是servlet映射配置):
<web-app id="WebApp_ID" version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"> <display-name>Spring MVC Application</display-name> <!--聲明一個servlet配置--> <servlet> <servlet-name>HelloWeb</servlet-name> <servlet-class> org.springframework.web.servlet.DispatcherServlet </servlet-class> <load-on-startup>1</load-on-startup> </servlet> <!--配置servlet與處理請求的映射模式--> <servlet-mapping> <servlet-name>HelloWeb</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> </web-app>
首先: web.xml文件根據servlet規范放在WebContent/WEB-INF目錄下,使用Mavan風格的放在scr/main/webapp/WEB-INF目錄下。
一旦初始化HelloWeb的的DispatcherServlet,框架將會嘗試從WebContent/WEB-INF目錄下的[servlet-name]-servlet.xml配置文件加載應用上下文application context。在這個Demo中,會去加載 HelloWeb-servlet.xml文件。這是默認行為,我們也可以指定加載配置文件的位置,這點后面會有實例示范。
然后: <\servlet-mapping>標簽指明什么樣的URL才會被DispatcherServlet映射處理。這里配置的是所有的HTTP請求都會被HelloWeb的DispatcherServlet映射處理
如果你不想使用默認的文件名[servlet-name]-servlet.xml和默認的context加載位置WebContent/WEB-INF(或者scr/main/webapp/WEB-INF),你也可以在web.xml中通過添加一個servlet監聽器ContextLoaderListener來自定義指定文件名和位置。示例配置如下:
<web-app...> <!-------- DispatcherServlet的定義,上面的配置這里略過了-----> .... <!--指定上下文配置文件的位置,指定classpath下的spring-mvc-config.xml文件 使用Maven風格,可以將該文件放在src/main/resources目錄下 --> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:spring-mvc-config.xml</param-value> </context-param> <!--增加監聽器--> <listener> <listener-class> org.springframework.web.context.ContextLoaderListener </listener-class> </listener> </web-app>
接下來: 使用自定義servlet上下文配置后,我們來看看spring-mvc-config.xml文件的配置信息,該文件放在src/main/resources目錄下,文末會展示Demo結構視圖:
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/context" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 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/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd "> <context:component-scan base-package="org.byron4j" /> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/> <property name="prefix" value="/WEB-INF/jsp/" /> <property name="suffix" value=".jsp" /> </bean> <mvc:resources mapping="/resources/**" location="/resources/" /> <mvc:annotation-driven /> </beans>
這里有幾點比較重要:
[servlet-name]-servlet.xml文件(現在我們自定義為spring-mvc-config.xml) 會創建已經定義的bean, 會覆蓋其他位置已經定義的同名的全局的bean,這點是血淚的教訓,參見mapper注入失敗問題解決
<context:component-scan...> 標簽用于激活Spring MVC注解掃描功能,像@Controller、 @RequestMapping等
InternalResourceViewResolver 將使用下面定義的規則來解析視圖名稱。 按照我們配置的規則:一個名為”hello”的邏輯視圖的實現將會是/WEB-INF/jsp/目錄下的hello.jsp文件來渲染。
接下來: 我們編寫一些實際使用的組件例如Controller, Model and View。
定義一個Controller
DispatcherServlet代表請求通過控制器來執行該請求的指定業務處理功能。@Controller 注解表明該類是一個控制器。@RequestMapping注解用于請求的URL映射到一個類或一個特定的處理方法
package org.byron4j.helloWeb; import org.springframework.stereotype.Controller; import org.springframework.ui.ModelMap; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; /** * Hello world! * */ @Controller @RequestMapping("/hello") public class HelloController{ @RequestMapping(method = RequestMethod.GET) public String printHello(ModelMap model) { model.addAttribute("message", "Hello Spring MVC Framework!"); return "hello"; } }
@Controller注解將一個類定義為Spring MVC 的控制器controller。 在這里@RequestMapping的第一個使用位置是表明這個Controller類的所有方法都是處理/hello請求的。 第二個位置的用法@RequestMapping(method = RequestMethod.GET) 表明printHello()方法作為這個Controller類的默認服務方法去處理HTTP的GET請求。你可以依葫蘆畫瓢定義一個方法處理同名的的URL的POST請求,試試,你僅僅需要在新方法中將@RequestMapping(method = RequestMethod.GET)替換為@RequestMapping(method = RequestMethod.POST)即可。
你也可以將上面的Controller替換成下面的的這種寫法:
@Controller public class HelloController{ @RequestMapping(value = "/hello", method = RequestMethod.GET) public String printHello(ModelMap model) { model.addAttribute("message", "Hello Spring MVC Framework!"); return "hello"; } }
功能是一樣的。
@RequestMapping的value屬性指明該方法僅僅映射處理的GET方式的請求/hello。 以下有幾點比較重要:
你可以在Controller的處理方法中調用其他業務方法去處理業務邏輯。
基于定義的業務邏輯,你需要在該方法中創建一個模型對象。你可以設置不同的模型屬性,這些屬性可以讓視圖訪問最終渲染給用戶。這個demo中創建了一個包含”message”屬性的模型對象。
一個定義的服務方法可以返回一個包含渲染模型的視圖名字的字符串。這個demo返回的”hello” 作為一個邏輯視圖的名字。
創建JSP視圖
SpringMVC支持多種類型的視圖顯示技術。包括 JSP, HTML, PDF, Excel worksheets, XML, Velocity 末班, XSLT, JSON, Atom 和RSS feeds, JasperReports, Thymeleaf等等。這里我們使用jap視圖, 在/WEB-INF/hello/jsp目錄下創建一個hello.jsp:
<html> <head> <title>Hello Spring MVC</title> </head> <body> <h3>${message}</h3> </body> </html>
這里的${message} 是Controller中模型對象設置的屬性message的值。你還可以在你的視圖中展示另外的其他屬性。
demo最后自定義的web.xml:
<web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5"> <display-name>Spring MVC Application</display-name> <welcome-file-list> <welcome-file> /index.jsp </welcome-file> </welcome-file-list> <!--聲明一個servlet配置--> <servlet> <servlet-name>dispatcherServlet</servlet-name> <servlet-class> org.springframework.web.servlet.DispatcherServlet </servlet-class> <!-- 自定義servlet文件名、文件位置需要使用該參數配置 --> <init-param> <!-- 分發器攔截的上下文-contextConfigLocation|指定servlet context配置文件的位置 --> <param-name>contextConfigLocation</param-name> <param-value>classpath:spring-mvc-config.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <!--配置servlet與處理請求的映射模式,會對所有*.jsp的后綴請求處理--> <servlet-mapping> <servlet-name>dispatcherServlet</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> <!--指定上下文配置文件的位置,指定classpath下的spring-mvc-config.xml文件 使用Maven風格,可以將該文件放在src/main/resources目錄下 --> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:spring-mvc-config.xml</param-value> </context-param> <!--增加監聽器--> <listener> <listener-class> org.springframework.web.context.ContextLoaderListener </listener-class> </listener> </web-app>
demo項目的pom.xml:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>org.byron4j</groupId> <artifactId>helloWeb</artifactId> <version>1.0.0-SNAPSHOT</version> <packaging>war</packaging> <name>helloWeb</name> <url>http://blog.csdn.net/zixiao217</url> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <spring.version>4.2.5.RELEASE</spring.version> <log4j.version>1.2.17</log4j.version> </properties> <dependencies> <!-- Spring --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>${spring.version}</version> </dependency> <!-- Log4j --> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>${log4j.version}</version> </dependency> <!-- https://mvnrepository.com/artifact/javax.servlet/servlet-api --> <dependency> <groupId>javax.servlet</groupId> <artifactId>servlet-api</artifactId> <version>2.5</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>3.8.1</version> <scope>test</scope> </dependency> <dependency> <groupId>jstl</groupId> <artifactId>jstl</artifactId> <version>1.2</version> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.5.1</version> <configuration> <source>1.8</source> <target>1.8</target> </configuration> </plugin> </plugins> <finalName>helloWeb</finalName> </build> </project>
以下是demo在eclipse的package explorer視圖:
以下是demo在eclipse的navigator視圖:
運行項目,在瀏覽器輸入http://localhost:8080/helloWeb/hello,顯示:
若參考本文編寫第一個SpringMVC Demo跑不起來,可以到原文留言提出意見。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。