Spring學(xué)習(xí)之Spring MVC 初探
前言
MVC模式,是現(xiàn)代開發(fā)中一種比較常見的模式,主要的作用在于將視圖與控制邏輯藏斩、數(shù)據(jù)等進(jìn)行分離,分離的主要目的自然是為了解耦却盘,試想一下狰域,如果在一個JSP頁面中夾雜了JDBC代碼,事務(wù)處理代碼黄橘,邏輯控制代碼兆览,這樣的頁面是何等的混亂維護(hù)起來的難度也是非常之大。MVC模式正是將者三者進(jìn)行解耦塞关,將整體分為控制層Controller(通常由Servlet來負(fù)責(zé))抬探,視圖層View(通常由JSP或者FreeMaker等模板技術(shù)負(fù)責(zé)),數(shù)據(jù)層Model(通常有Java對象及其相應(yīng)的操作負(fù)責(zé))帆赢,這樣小压,這三者之間各司其職砰左,控制層負(fù)責(zé)控制整體的邏輯,數(shù)據(jù)模型層負(fù)責(zé)對數(shù)據(jù)進(jìn)行處理场航,視圖層在控制層的控制下對數(shù)據(jù)模型層的產(chǎn)生的數(shù)據(jù)進(jìn)行渲染,形成對應(yīng)的視圖廉羔。
Spring MVC簡介
在Web開發(fā)過程中憋他,Web的MVC模式與一般的MVC模式有點(diǎn)差別,主要是由于Web一般是采用HTTP協(xié)議進(jìn)行交互镀娶,而HTTP協(xié)議的一個最大特點(diǎn)就是基于請求-響應(yīng)模式梯码,也就是說好啰,只有當(dāng)有請求的時候框往,才能對其進(jìn)行相應(yīng),換句話說许溅,如果用戶沒有請求數(shù)據(jù)贤重,則服務(wù)器是沒有辦法將數(shù)據(jù)傳輸過去的沐飘。所以在Web中耐朴,MVC模式中的各個層次之間的交互一般都是由控制層進(jìn)行處理,控制層響應(yīng)客戶端的請求铐刘,分析請求的內(nèi)容影晓,控制模型層產(chǎn)生數(shù)據(jù),控制視圖層渲染數(shù)據(jù)疤祭,并且將渲染后的結(jié)果返回給客戶端。
在Spring MVC出現(xiàn)之前戏售,出現(xiàn)了Struts等一系列優(yōu)秀的MVC框架灌灾,不過悲柱,由于Spring MVC與Spring的無縫整合,加上Spring社區(qū)的推動嘿般,現(xiàn)在Spring MVC在Web開發(fā)中的地位越來越高博个,甚至于超越了Struts功偿,而且,從Spring MVC 3.0之后共耍,Spring MVC 提供了基于注解的處理方式痹兜,使得開發(fā)效率更加高了颤诀。
Spring MVC 小案例
動手永遠(yuǎn)都是學(xué)習(xí)編程的最佳方式,接下來通過一個小案例來學(xué)習(xí)Spring MVC遗淳。
Spring MVC的配置方式是比較簡單的屈暗,主要包括在容器中注冊Spring MVC养叛,也就是在web.xml文件中配置Spring MVC的前端控制器,主要用于在Web容器啟動時啟動Spring MVC容器弃甥,具體的配置方式如下所示
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_3_0.xsd"
version="3.0">
<!--配置前端控制器DispatcherServlet-->
<servlet>
<servlet-name>dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<!--加載類路徑下的Spring MVC配置文件-->
<param-value>classpath*:/spring-mvc.xml</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<!--攔截對應(yīng)的請求肮之,/表示所有的請求-->
<url-pattern>/</url-pattern>
</servlet-mapping>
<context-param>
<param-name>contextConfigLocation</param-name>
<!--加載Spring的配置文件,當(dāng)容器啟動之后眶明,根據(jù)配置文件的內(nèi)容,完成Bean的創(chuàng)建等一系列的操作-->
<param-value>classpath*:/spring-config/*.xml</param-value>
</context-param>
<listener>
<!--監(jiān)聽Web容器的啟動丑瞧,用于在MVC容器中獲得父容器绊汹,也就是Spring容器的信息-->
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
</web-app>
spring-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">
<!--掃描對應(yīng)的控制器-->
<context:component-scan base-package="cn.xuhuanfeng.springweb.controller"/>
<!--開啟注解驅(qū)動,簡化配置-->
<mvc:annotation-driven/>
<!--啟動默認(rèn)的Servlet映射器坛增,用于處理靜態(tài)資源-->
<mvc:default-servlet-handler/>
<!--配置視圖解析器-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" >
<property name="prefix" value="/WEB-INF/views/" />
<property name="suffix" value=".jsp"/>
</bean>
<!--文件上傳解析器,需要添加Apache common fileUpload依賴-->
<bean name="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="maxUploadSize" value="4096000"/>
<property name="maxInMemorySize" value="20000"/>
</bean>
</beans>
如上所示届案,簡單的Spring整合Spring MVC配置文件就完成了楣颠,由于Spring MVC的默認(rèn)配置基本上滿足我們的需求童漩,所以在一般情況下不需要對其做過多的修改仓蛆。
接下來就可以開始動手編寫對應(yīng)的控制器了
// 將CommonController聲明為控制器
// 用于處理對應(yīng)的請求
@Controller
public class CommonController {
// 配置對應(yīng)的訪問路徑
// 當(dāng)訪問 部署路徑/hello就會到該方法中
@RequestMapping("/hello")
public String hello(){
// 返回對應(yīng)的視圖名稱
// 根據(jù)前面配置的視圖解析器可以知道,此時
// 對應(yīng)的視圖的全路徑為 /WEB-INF/views/index.jsp
return "index";
}
}
創(chuàng)建對應(yīng)的視圖index.jsp如下所示
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Hello World</title>
</head>
<body>
<h2>Hello World</h2>
</body>
</html>
當(dāng)所需要的依賴導(dǎo)入完成豆拨,將項(xiàng)目進(jìn)行部署之后施禾,返回部署路徑/hello就可以看到如下內(nèi)容了
這樣一個最簡單的Spring MVC就配置完成了。
Spring MVC常用配置
Spring MVC提供了非常豐富的注解配置邮绿,但是常用的注解并不是很多船逮,具體如下
-
@Controller
主要用于將一個普通的Java類聲明為控制器挖胃,負(fù)責(zé)處理用戶的請求 -
@RequestMapping
主要用于標(biāo)注對應(yīng)的請求路徑- 該注解可以用于標(biāo)注類和方法梆惯,如果標(biāo)注類垛吗,則該類下的所有方法的訪問均在類的路徑之下怯屉,比如上面,如果在類上面標(biāo)注
@RequestMapping("/index")
則Hello的訪問路徑應(yīng)該為index/hello
而不再是/hello
- RequestMapping如其名所示蝗敢,是將請求與對應(yīng)的控制方法進(jìn)行映射寿谴,那么失受,在一個Http請求中,所有內(nèi)容痪署,如請求方法狼犯,請求頭等信息悯森,也是可以進(jìn)行配置的,比如
@RequestMapping( value = "/hello", method = RequestMethod.GET)
,具體的可以根據(jù)需要進(jìn)行配置
- 該注解可以用于標(biāo)注類和方法梆惯,如果標(biāo)注類垛吗,則該類下的所有方法的訪問均在類的路徑之下怯屉,比如上面,如果在類上面標(biāo)注
-
@ResponseBody
,用于將方法的返回內(nèi)容標(biāo)注為數(shù)據(jù)(默認(rèn)返回的內(nèi)容會經(jīng)由視圖解析器進(jìn)行解析)祝蝠,也就是說绎狭,方法返回的內(nèi)容不會被當(dāng)成視圖進(jìn)行解析褥傍,而是當(dāng)成純粹的數(shù)據(jù)進(jìn)行處理恍风,比如在上面的方法中加上該注解,則運(yùn)行結(jié)果如下所示
總結(jié)
本小節(jié)主要學(xué)習(xí)了Spring MVC的基本配置以及一些常用的注解配置御滩,關(guān)于Spring MVC還有一些內(nèi)容沒有學(xué)習(xí)到,將在后面繼續(xù)學(xué)習(xí)党远。