一、mvc概要
mvc是模型(model)、視圖(view)、控制器(controller)的簡(jiǎn)寫,是一種軟件設(shè)計(jì)規(guī)范,用一種將業(yè)務(wù)邏輯、數(shù)據(jù)、顯示分離的方法組織代碼,mvc主要作用是降低了視圖與業(yè)務(wù)邏輯間的雙向偶合。mvc不是一種設(shè)計(jì)模式,mvc是一種架構(gòu)模式。當(dāng)然不同的mvc存在差異。
在web早期的開(kāi)發(fā)中,通常采用的都是model1。model1中,如圖所示主要分為兩層,視圖層和模型層。model2把一個(gè)項(xiàng)目分成三部分,包括視圖、控制、模型。這樣不僅提高的代碼的復(fù)用率與項(xiàng)目的擴(kuò)展性,且大大降低了項(xiàng)目的維護(hù)成本。model 1模式的實(shí)現(xiàn)比較簡(jiǎn)單,適用于快速開(kāi)發(fā)小規(guī)模項(xiàng)目,model1中jsp頁(yè)面身兼view和controller兩種角色,將控制邏輯和表現(xiàn)邏輯混雜在一起,從而導(dǎo)致代碼的重用性非常低,增加了應(yīng)用的擴(kuò)展性和維護(hù)的難度。model2消除了model1的缺點(diǎn)。
model1
model2
常見(jiàn)的服務(wù)器端mvc框架有:struts、spring mvc、asp.net mvc、zend framework、jsf;常見(jiàn)前端mvc框架:angularjs、reactjs、backbone;由mvc演化出了另外一些模式如:mvp、mvvm。
二、spring mvc介紹
spring mvc是spring framework的一部分,是基于java實(shí)現(xiàn)mvc的輕量級(jí)web框架。spring mvc的特點(diǎn):
1、輕量
2、高效
3、與spring兼容性好
4、功能強(qiáng)大
restful、數(shù)據(jù)驗(yàn)證、格式化、綁定機(jī)制、本地化、主題等
5、簡(jiǎn)潔靈活
spring的web框架圍繞dispatcherservlet設(shè)計(jì)。 dispatcherservlet的作用是將請(qǐng)求分發(fā)到不同的處理器。從spring 2.5開(kāi)始,使用java 5或者以上版本的用戶可以采用基于注解的controller聲明方式。官網(wǎng)上說(shuō)spring的web模塊提供了大量獨(dú)特的功能,包括:
清晰的角色劃分:控制器(controller)、驗(yàn)證器(validator)、 命令對(duì)象(command object)、表單對(duì)象(form object)、模型對(duì)象(model object)、 servlet分發(fā)器(dispatcherservlet)、 處理器映射(handler mapping)、視圖解析器(view resolver)等等。 每一個(gè)角色都可以由一個(gè)專門的對(duì)象來(lái)實(shí)現(xiàn)。
強(qiáng)大而直接的配置方式:將框架類和應(yīng)用程序類都能作為javabean配置,支持跨多個(gè)context的引用,例如,在web控制器中對(duì)業(yè)務(wù)對(duì)象和驗(yàn)證器(validator)的引用。
可適配、非侵入:可以根據(jù)不同的應(yīng)用場(chǎng)景,選擇合適的控制器子類 (simple型、command型、form型、wizard型、multi-action型或者自定義),而不是從單一控制器 (比如action/actionform)繼承。
可重用的業(yè)務(wù)代碼:可以使用現(xiàn)有的業(yè)務(wù)對(duì)象作為命令或表單對(duì)象,而不需要去擴(kuò)展某個(gè)特定框架的基類。
可定制的綁定(binding) 和驗(yàn)證(validation):比如將類型不匹配作為應(yīng)用級(jí)的驗(yàn)證錯(cuò)誤, 這可以保存錯(cuò)誤的值。再比如本地化的日期和數(shù)字綁定等等。在其他某些框架中,你只能使用字符串表單對(duì)象, 需要手動(dòng)解析它并轉(zhuǎn)換到業(yè)務(wù)對(duì)象。
可定制的handler mapping和view resolution:spring提供從最簡(jiǎn)單的url映射, 到復(fù)雜的、專用的定制策略。與某些web mvc框架強(qiáng)制開(kāi)發(fā)人員使用單一特定技術(shù)相比,spring顯得更加靈活。
靈活的model轉(zhuǎn)換:在springweb框架中,使用基于map的 鍵/值對(duì)來(lái)達(dá)到輕易地與各種視圖技術(shù)的集成。
可定制的本地化和主題(theme)解析:支持在jsp中可選擇地使用spring標(biāo)簽庫(kù)、支持jstl、支持velocity(不需要額外的中間層)等等。
簡(jiǎn)單而強(qiáng)大的jsp標(biāo)簽庫(kù)(spring tag library):支持包括諸如數(shù)據(jù)綁定和主題(theme) 之類的許多功能。它提供在標(biāo)記方面的最大靈活性。
jsp表單標(biāo)簽庫(kù):在spring2.0中引入的表單標(biāo)簽庫(kù),使得在jsp中編寫 表單更加容易。
spring bean的生命周期可以被限制在當(dāng)前的http request或者h(yuǎn)ttp session。 準(zhǔn)確的說(shuō),這并非spring mvc框架本身特性,而應(yīng)歸屬于sping mvc使用的webapplicationcontext容器。
三、第一個(gè)spring mvc 項(xiàng)目:hello world
3.1、通過(guò)maven新建一個(gè)web項(xiàng)目
在eclipse中新建maven項(xiàng)目,選擇“create a simple project”,創(chuàng)建一個(gè)簡(jiǎn)單項(xiàng)目,不選擇模板。
修改層面信息,更加詳細(xì)的內(nèi)容請(qǐng)參考前面寫過(guò)的文章:
將webcontent中的所有內(nèi)容復(fù)制到webapp目錄下,并刪除webcontent目錄,刪除后的結(jié)果如下:
修改項(xiàng)目的部署信息,刪除測(cè)試文件夾,添加webapp為項(xiàng)目根目錄:
如果不打算在pom.xml中添加對(duì)server runtime的依賴,則這里必須手動(dòng)添加依賴,如下圖所示:
另外如果pom.xml報(bào)錯(cuò),修改任意位置保存。
3.2、添加依賴的jar包
1、修改pom.xml文件、添加jar包的依賴,主要有:spring框架核心庫(kù)、spring mvc、jstl等,具體信息如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
|
<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>com.zhangguo</groupid> <artifactid>springmvc01</artifactid> <version> 0.0 . 1 </version> <packaging>war</packaging> <properties> <project.build.sourceencoding>utf- 8 </project.build.sourceencoding> <spring.version> 4.3 . 0 .release</spring.version> </properties> <dependencies> <!--spring框架核心庫(kù) --> <dependency> <groupid>org.springframework</groupid> <artifactid>spring-context</artifactid> <version>${spring.version}</version> </dependency> <!-- spring mvc --> <dependency> <groupid>org.springframework</groupid> <artifactid>spring-webmvc</artifactid> <version>${spring.version}</version> </dependency> <!-- jstl --> <dependency> <groupid>javax.servlet</groupid> <artifactid>jstl</artifactid> <version> 1.2 </version> </dependency> </dependencies> </project> |
當(dāng)依賴成功時(shí),會(huì)加載的jar包如下:
3.3、修改web.xml注冊(cè)中心控制器dispatcherservlet
spring mvc框架像許多其他mvc框架一樣, 請(qǐng)求驅(qū)動(dòng),圍繞一個(gè)中心servlet分派請(qǐng)求及提供其他功能,dispatcherservlet是一個(gè)實(shí)際的servlet (它繼承自httpservlet 基類)。如下圖所示當(dāng)發(fā)起請(qǐng)求時(shí)被前置的控制器攔截到請(qǐng)求,根據(jù)請(qǐng)求參數(shù)生成代理請(qǐng)求,找到請(qǐng)求對(duì)應(yīng)的實(shí)際控制器,控制器處理請(qǐng)求,創(chuàng)建數(shù)據(jù)模型,訪問(wèn)數(shù)據(jù)庫(kù),將模型響應(yīng)給中心控制器,控制器使用模型與視圖渲染視圖結(jié)果,將結(jié)果返回給中心控制器,再將結(jié)果返回給請(qǐng)求者。
修改web.xml文件注冊(cè)該servlet,修改后的web.xml文件如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
|
<?xml version= "1.0" encoding= "utf-8" ?> <web-app xmlns:xsi= "http://www.w3.org/2001/xmlschema-instance" xmlns= "http://java.sun.com/xml/ns/javaee" xsi:schemalocation= "http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id= "webapp_id" version= "3.0" > <servlet> <!--名稱 --> <servlet-name>springmvc</servlet-name> <!-- servlet類 --> <servlet- class >org.springframework.web.servlet.dispatcherservlet</servlet- class > <!-- 啟動(dòng)順序,數(shù)字越小,啟動(dòng)越早 --> <load-on-startup> 1 </load-on-startup> <init-param> <!--springmvc配置參數(shù)文件的位置 --> <param-name>contextconfiglocation</param-name> <!--默認(rèn)名稱為servletname-servlet.xml --> <param-value>classpath*:springmvc-servlet.xml</param-value> </init-param> </servlet> <!--所有請(qǐng)求都會(huì)被springmvc攔截 --> <servlet-mapping> <servlet-name>springmvc</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> </web-app> |
3.4、添加spring mvc配置文件
在src/main/java源代碼目錄下添加springmvc-servlet.xml配置文件,配置的形式與spring容器配置基本類似,為了支持基于注解的ioc,設(shè)置了自動(dòng)掃描包的功能,具體配置信息如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
|
<?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-4.3.xsd http: //www.springframework.org/schema/mvc http: //www.springframework.org/schema/mvc/spring-mvc-4.3.xsd"> <!-- 自動(dòng)掃描包,實(shí)現(xiàn)支持注解的ioc --> <context:component-scan base- package = "com.zhangguo.springmvc01" /> <!-- spring mvc不處理靜態(tài)資源 --> <mvc: default -servlet-handler /> <!-- 支持mvc注解驅(qū)動(dòng) --> <mvc:annotation-driven /> <!-- 視圖解析器 --> <bean class = "org.springframework.web.servlet.view.internalresourceviewresolver" id= "internalresourceviewresolver" > <!-- 前綴 --> <property name= "prefix" value= "/web-inf/view/" /> <!-- 后綴 --> <property name= "suffix" value= ".jsp" /> </bean> </beans> |
在視圖解析中我們把所有的視圖都存放在/web-inf/目錄下,這樣是為了視圖安全,因?yàn)檫@個(gè)目錄客戶端不能直接訪問(wèn)。
3.5、創(chuàng)建helloworld控制器
在src/main/java源代碼目錄下創(chuàng)建包c(diǎn)om.zhangguo.springmvc01.controller,在包下創(chuàng)建一個(gè)普通的類:helloworld,具體代碼如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
package com.zhangguo.springmvc01.controller; import org.springframework.stereotype.controller; import org.springframework.ui.model; import org.springframework.web.bind.annotation.requestmapping; @controller @requestmapping ( "/hello" ) public class helloworld { @requestmapping ( "/sayhi" ) public string sayhi(model model) { model.addattribute( "message" , "hello spring mvc!" ); return "sayhi" ; } } |
注解為@controller是為了讓spring ioc容器初始化時(shí)自動(dòng)掃描到;@requestmapping是為了映射請(qǐng)求路徑,這里因?yàn)轭惻c方法上都有映射所以訪問(wèn)時(shí)應(yīng)該是/hello/sayhi;方法中聲明model類型的參數(shù)是為了把a(bǔ)ction中的數(shù)據(jù)帶到視圖中;方法返回的結(jié)果是視圖的名稱sayhi。
3.6、創(chuàng)建視圖
在web-inf/view目錄中創(chuàng)建視圖,視圖將從action中帶回的信息展示,具體內(nèi)容如下:
1
2
3
4
5
6
7
8
9
10
11
12
|
<%@ page language= "java" contenttype= "text/html; charset=utf-8" pageencoding= "utf-8" %> <%@ taglib prefix= "c" uri= "http://java.sun.com/jsp/jstl/core" %> <!doctype html> <html> <head> <meta http-equiv= "content-type" content= "text/html; charset=utf-8" > <title>hello spring mvc!</title> </head> <body> <h2>${message}</h2> </body> </html> |
3.7、測(cè)試運(yùn)行
啟動(dòng)tomcat運(yùn)行項(xiàng)目,請(qǐng)注意查看啟動(dòng)信息,如果有異常應(yīng)該先解決異常信息,運(yùn)行成功后的結(jié)果如下所示:
3.8、示例下載
項(xiàng)目地址:springmvcdemo.rar
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持服務(wù)器之家。
原文鏈接:http://www.cnblogs.com/best/p/5653916.html