深入理解Spring MVC概要與環(huán)境配置
一、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早期的開發(fā)中,通常采用的都是Model1。Model1中,如圖所示主要分為兩層,視圖層和模型層。Model2把一個(gè)項(xiàng)目分成三部分,包括視圖、控制、模型。這樣不僅提高的代碼的復(fù)用率與項(xiàng)目的擴(kuò)展性,且大大降低了項(xiàng)目的維護(hù)成本。Model 1模式的實(shí)現(xiàn)比較簡(jiǎn)單,適用于快速開發(fā)小規(guī)模項(xiàng)目,Model1中JSP頁(yè)面身兼View和Controller兩種角色,將控制邏輯和表現(xiàn)邏輯混雜在一起,從而導(dǎo)致代碼的重用性非常低,增加了應(yīng)用的擴(kuò)展性和維護(hù)的難度。Model2消除了Model1的缺點(diǎn)。

Model1

Model2
常見的服務(wù)器端MVC框架有:Struts、Spring MVC、ASP.NET MVC、Zend Framework、JSF;常見前端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開始,使用Java 5或者以上版本的用戶可以采用基于注解的controller聲明方式。官網(wǎng)上說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ì)象來實(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)制開發(fā)人員使用單一特定技術(shù)相比,Spring顯得更加靈活。
靈活的model轉(zhuǎn)換:在Springweb框架中,使用基于Map的 鍵/值對(duì)來達(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或者HTTP Session。 準(zhǔn)確的說,這并非Spring MVC框架本身特性,而應(yīng)歸屬于Sping MVC使用的WebApplicationContext容器。
三、第一個(gè)Spring MVC 項(xiàng)目:Hello World
3.1、通過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)參考前面寫過的文章:

將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等,具體信息如下:
<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ù)模型,訪問數(shù)據(jù)庫(kù),將模型響應(yīng)給中心控制器,控制器使用模型與視圖渲染視圖結(jié)果,將結(jié)果返回給中心控制器,再將結(jié)果返回給請(qǐng)求者。


修改web.xml文件注冊(cè)該Servlet,修改后的web.xml文件如下:
<?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)掃描包的功能,具體配置信息如下:
<?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è)目錄客戶端不能直接訪問。
3.5、創(chuàng)建HelloWorld控制器
在src/main/java源代碼目錄下創(chuàng)建包c(diǎn)om.zhangguo.springmvc01.controller,在包下創(chuàng)建一個(gè)普通的類:HelloWorld,具體代碼如下:
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方法上都有映射所以訪問時(shí)應(yīng)該是/Hello/Sayhi;方法中聲明Model類型的參數(shù)是為了把Action中的數(shù)據(jù)帶到視圖中;方法返回的結(jié)果是視圖的名稱sayhi。
3.6、創(chuàng)建視圖
在WEB-INF/view目錄中創(chuàng)建視圖,視圖將從Action中帶回的信息展示,具體內(nèi)容如下:
<%@ 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_jb51.rar
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Java?靜態(tài)代理與動(dòng)態(tài)代理解析
這篇文章主要介紹了Java?靜態(tài)代理與動(dòng)態(tài)代理解析,關(guān)于靜態(tài)代理與動(dòng)態(tài)代理,一直是比較困擾很多新人開發(fā),但實(shí)際我們開發(fā)中,小到寫的某個(gè)工具類,大到經(jīng)常使用的Retrofit?其內(nèi)部都使用了動(dòng)態(tài)代理,所以這篇文章從基礎(chǔ)到源碼解析,以便簡(jiǎn)單理解靜態(tài)代理與Jdk中的動(dòng)態(tài)代理2022-02-02
springmvc json類型轉(zhuǎn)換錯(cuò)誤解決方案
這篇文章主要介紹了springmvc json類型轉(zhuǎn)換錯(cuò)誤解決方案,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-12-12
java數(shù)據(jù)類型轉(zhuǎn)換陷阱包括列表陷阱
這篇文章主要介紹了java數(shù)據(jù)類型轉(zhuǎn)換的一些陷阱,包括基本數(shù)據(jù)類型轉(zhuǎn)換列表陷阱,基本上這一篇就把常見的問題就給大家分享一下2020-10-10
Java實(shí)現(xiàn)文件上傳的兩種方法(uploadify和Spring)
這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)文件上傳的兩種方法,uploadify和Spring實(shí)現(xiàn)文件上傳,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-11-11
log4j2 項(xiàng)目日志組件的實(shí)例代碼
下面小編就為大家分享一篇log4j2 項(xiàng)目日志組件的實(shí)例代碼,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2017-12-12
基于request.getAttribute與request.getParameter的區(qū)別詳解
本篇文章小編為大家介紹,基于request.getAttribute與request.getParameter的區(qū)別詳解。需要的朋友參考下2013-04-04
SpringBoot實(shí)現(xiàn)異步事件驅(qū)動(dòng)的方法
本文主要介紹了SpringBoot實(shí)現(xiàn)異步事件驅(qū)動(dòng)的方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-06-06
java 實(shí)現(xiàn)單鏈表逆轉(zhuǎn)詳解及實(shí)例代碼
這篇文章主要介紹了java 實(shí)現(xiàn)單鏈表逆轉(zhuǎn)實(shí)例代碼的相關(guān)資料,需要的朋友可以參考下2017-02-02
Java 使用JdbcTemplate 中的queryForList發(fā)生錯(cuò)誤解決辦法
這篇文章主要介紹了Java 使用JdbcTemplate 中的queryForList發(fā)生錯(cuò)誤解決辦法的相關(guān)資料,需要的朋友可以參考下2017-07-07

