java Spring MVC4環(huán)境搭建實(shí)例詳解(步驟)
spring WEB MVC框架提供了一個(gè)MVC(model-view-controller)模型-視圖-控制器的結(jié)構(gòu)和組件,利用它可以開發(fā)更靈活、松耦合的web應(yīng)用。MVC模式使得整個(gè)服務(wù)應(yīng)用的各部分(控制邏輯、業(yè)務(wù)邏輯、UI界面展示)分離開來(lái),使它們之間的耦合性更低。
Model
模型層封裝了整個(gè)應(yīng)用程序的數(shù)據(jù)對(duì)象并且將會(huì)持久化POJO
View
視圖層負(fù)責(zé)渲染模型層的數(shù)據(jù),一般最終使用HTML展示到用戶瀏覽器或移動(dòng)設(shè)備終端
Controller
控制層負(fù)責(zé)處理用戶的請(qǐng)求、構(gòu)建合適的模型數(shù)據(jù)并將其傳輸?shù)揭晥D層進(jìn)行渲染
SpringMVC核心-DispatcherServlet分發(fā)器
SpringMVC框架是設(shè)計(jì)用來(lái)處理所有的HTTP請(qǐng)求和響應(yīng)的,它的核心是圍繞著一個(gè)分發(fā)器DispatcherServlet。在Spring Web MVC DispatcherServlet的請(qǐng)求處理流程如下圖所示:

以下是對(duì)應(yīng)一個(gè)HTTP請(qǐng)求時(shí)分發(fā)器的處理流程:
1.接收到一個(gè)Http請(qǐng)求后,DispatcherServlet 告訴映射處理器HandlerMapping 去調(diào)用相應(yīng)的Controller(控制器)。
2.然后Controller控制器根據(jù)接收到的的請(qǐng)求調(diào)用相應(yīng)的Service服務(wù)方法,基于請(qǐng)求所使用的GET或PUT等其它請(qǐng)求方式。Service方法將會(huì)根據(jù)業(yè)務(wù)邏輯設(shè)置模型數(shù)據(jù)并且返回一個(gè)視圖給DispatcherServlet分發(fā)器。
3.DispatcherServlet 分發(fā)器將會(huì)請(qǐng)求視圖解析器ViewResolver去處理找到該請(qǐng)求對(duì)應(yīng)的已經(jīng)定義的視圖view。
4.一旦視圖確定了,DispatcherServlet 會(huì)將模型數(shù)據(jù)傳輸給該視圖view,最終渲染到用戶瀏覽設(shè)備上。
上述提到的所有組件:映射處理器HandlerMapping, 控制器Controller 和視圖解析器ViewResolver都是WebApplicationContext 的組成部分。WebApplicationContext 擴(kuò)展了ApplicationContext ,但是為web應(yīng)用程序提供了更多的必要的特性。
SpringMVC需要的配置要求
為了將用戶的請(qǐng)求映射到分發(fā)器DispatcherServlet 去處理,需要在web.xml中配置URL映射。
以下是一個(gè)聲明和映射了Demo應(yīng)用HelloWeb的分發(fā)器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> <!--聲明一個(gè)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與處理請(qǐng)求的映射模式--> <servlet-mapping> <servlet-name>HelloWeb</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> </web-app>
首先: web.xml文件根據(jù)servlet規(guī)范放在WebContent/WEB-INF目錄下,使用Mavan風(fēng)格的放在scr/main/webapp/WEB-INF目錄下。
一旦初始化HelloWeb的的DispatcherServlet,框架將會(huì)嘗試從WebContent/WEB-INF目錄下的[servlet-name]-servlet.xml配置文件加載應(yīng)用上下文application context。在這個(gè)Demo中,會(huì)去加載 HelloWeb-servlet.xml文件。這是默認(rèn)行為,我們也可以指定加載配置文件的位置,這點(diǎn)后面會(huì)有實(shí)例示范。
然后: <\servlet-mapping>標(biāo)簽指明什么樣的URL才會(huì)被DispatcherServlet映射處理。這里配置的是所有的HTTP請(qǐng)求都會(huì)被HelloWeb的DispatcherServlet映射處理
如果你不想使用默認(rèn)的文件名[servlet-name]-servlet.xml和默認(rèn)的context加載位置WebContent/WEB-INF(或者scr/main/webapp/WEB-INF),你也可以在web.xml中通過(guò)添加一個(gè)servlet監(jiān)聽器ContextLoaderListener來(lái)自定義指定文件名和位置。示例配置如下:
<web-app...> <!-------- DispatcherServlet的定義,上面的配置這里略過(guò)了-----> .... <!--指定上下文配置文件的位置,指定classpath下的spring-mvc-config.xml文件 使用Maven風(fēng)格,可以將該文件放在src/main/resources目錄下 --> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:spring-mvc-config.xml</param-value> </context-param> <!--增加監(jiān)聽器--> <listener> <listener-class> org.springframework.web.context.ContextLoaderListener </listener-class> </listener> </web-app>
接下來(lái): 使用自定義servlet上下文配置后,我們來(lái)看看spring-mvc-config.xml文件的配置信息,該文件放在src/main/resources目錄下,文末會(huì)展示Demo結(jié)構(gòu)視圖:
<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>
這里有幾點(diǎn)比較重要:
[servlet-name]-servlet.xml文件(現(xiàn)在我們自定義為spring-mvc-config.xml) 會(huì)創(chuàng)建已經(jīng)定義的bean, 會(huì)覆蓋其他位置已經(jīng)定義的同名的全局的bean,這點(diǎn)是血淚的教訓(xùn),參見mapper注入失敗問題解決
<context:component-scan...> 標(biāo)簽用于激活Spring MVC注解掃描功能,像@Controller、 @RequestMapping等
InternalResourceViewResolver 將使用下面定義的規(guī)則來(lái)解析視圖名稱。 按照我們配置的規(guī)則:一個(gè)名為”hello”的邏輯視圖的實(shí)現(xiàn)將會(huì)是/WEB-INF/jsp/目錄下的hello.jsp文件來(lái)渲染。
接下來(lái): 我們編寫一些實(shí)際使用的組件例如Controller, Model and View。
定義一個(gè)Controller
DispatcherServlet代表請(qǐng)求通過(guò)控制器來(lái)執(zhí)行該請(qǐng)求的指定業(yè)務(wù)處理功能。@Controller 注解表明該類是一個(gè)控制器。@RequestMapping注解用于請(qǐng)求的URL映射到一個(gè)類或一個(gè)特定的處理方法
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注解將一個(gè)類定義為Spring MVC 的控制器controller。 在這里@RequestMapping的第一個(gè)使用位置是表明這個(gè)Controller類的所有方法都是處理/hello請(qǐng)求的。 第二個(gè)位置的用法@RequestMapping(method = RequestMethod.GET) 表明printHello()方法作為這個(gè)Controller類的默認(rèn)服務(wù)方法去處理HTTP的GET請(qǐng)求。你可以依葫蘆畫瓢定義一個(gè)方法處理同名的的URL的POST請(qǐng)求,試試,你僅僅需要在新方法中將@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方式的請(qǐng)求/hello。 以下有幾點(diǎn)比較重要:
你可以在Controller的處理方法中調(diào)用其他業(yè)務(wù)方法去處理業(yè)務(wù)邏輯。
基于定義的業(yè)務(wù)邏輯,你需要在該方法中創(chuàng)建一個(gè)模型對(duì)象。你可以設(shè)置不同的模型屬性,這些屬性可以讓視圖訪問最終渲染給用戶。這個(gè)demo中創(chuàng)建了一個(gè)包含”message”屬性的模型對(duì)象。
一個(gè)定義的服務(wù)方法可以返回一個(gè)包含渲染模型的視圖名字的字符串。這個(gè)demo返回的”hello” 作為一個(gè)邏輯視圖的名字。
創(chuàng)建JSP視圖
SpringMVC支持多種類型的視圖顯示技術(shù)。包括 JSP, HTML, PDF, Excel worksheets, XML, Velocity 末班, XSLT, JSON, Atom 和RSS feeds, JasperReports, Thymeleaf等等。這里我們使用jap視圖, 在/WEB-INF/hello/jsp目錄下創(chuàng)建一個(gè)hello.jsp:
<html>
<head>
<title>Hello Spring MVC</title>
</head>
<body>
<h2>${message}</h2>
</body>
</html>
這里的${message} 是Controller中模型對(duì)象設(shè)置的屬性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> <!--聲明一個(gè)servlet配置--> <servlet> <servlet-name>dispatcherServlet</servlet-name> <servlet-class> org.springframework.web.servlet.DispatcherServlet </servlet-class> <!-- 自定義servlet文件名、文件位置需要使用該參數(shù)配置 --> <init-param> <!-- 分發(fā)器攔截的上下文-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與處理請(qǐng)求的映射模式,會(huì)對(duì)所有*.jsp的后綴請(qǐng)求處理--> <servlet-mapping> <servlet-name>dispatcherServlet</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> <!--指定上下文配置文件的位置,指定classpath下的spring-mvc-config.xml文件 使用Maven風(fēng)格,可以將該文件放在src/main/resources目錄下 --> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:spring-mvc-config.xml</param-value> </context-param> <!--增加監(jiān)聽器--> <listener> <listener-class> org.springframework.web.context.ContextLoaderListener </listener-class> </listener> </web-app>
demo項(xiàng)目的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視圖:

運(yùn)行項(xiàng)目,在瀏覽器輸入http://localhost:8080/helloWeb/hello,顯示:

若參考本文編寫第一個(gè)SpringMVC Demo跑不起來(lái),可以到原文留言提出意見。
- java環(huán)境搭建教程
- Java Spring開發(fā)環(huán)境搭建及簡(jiǎn)單入門示例教程
- Java運(yùn)行環(huán)境搭建的圖文教程
- JAVA開發(fā)環(huán)境搭建教程
- JavaEE開發(fā)基于Eclipse的環(huán)境搭建以及Maven Web App的創(chuàng)建
- java selenium教程環(huán)境搭建基于Maven
- java selenium教程環(huán)境搭建方法
- Java+MyBatis+MySQL開發(fā)環(huán)境搭建流程詳解
- Windows下Java+MyBatis框架+MySQL的開發(fā)環(huán)境搭建教程
- Java新手環(huán)境搭建 JDK8安裝配置教程
相關(guān)文章
java實(shí)用型-高并發(fā)下RestTemplate的正確使用說(shuō)明
這篇文章主要介紹了java實(shí)用型-高并發(fā)下RestTemplate的正確使用說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-10-10
Java 關(guān)于eclipse導(dǎo)入項(xiàng)目發(fā)生的問題及解決方法(推薦)
下面小編就為大家分享一篇Java 關(guān)于eclipse導(dǎo)入項(xiàng)目發(fā)生的問題及解決方法(推薦),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2017-12-12
Java正則表達(dá)式matcher.group()用法代碼
這篇文章主要給大家介紹了關(guān)于Java正則表達(dá)式matcher.group()用法的相關(guān)資料,最近在做一個(gè)項(xiàng)目,需要使用matcher.group()方法匹配出需要的內(nèi)容,文中給出了詳細(xì)的代碼示例,需要的朋友可以參考下2023-08-08
java實(shí)現(xiàn)pgsql自動(dòng)更新創(chuàng)建時(shí)間與更新時(shí)間的兩種方式小結(jié)
本文主要介紹了java實(shí)現(xiàn)pgsql自動(dòng)更新創(chuàng)建時(shí)間與更新時(shí)間的兩種方式小結(jié),主要包括通過(guò)數(shù)據(jù)庫(kù)自身實(shí)現(xiàn)以及通過(guò)mybatisplus的TableField注解添加,具有一定的參考價(jià)值,感興趣的可以了解一下2024-01-01
SpringMVC返回的ResponseEntity出現(xiàn)亂碼及解決
這篇文章主要介紹了SpringMVC返回的ResponseEntity出現(xiàn)亂碼及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-02-02
解決Spring boot整合mybatis,xml資源文件放置及路徑配置問題
這篇文章主要介紹了解決Spring boot整合mybatis,xml資源文件放置及路徑配置問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-12-12
java調(diào)用遠(yuǎn)程服務(wù)器的shell腳本以及停止的方法實(shí)現(xiàn)
這篇文章主要介紹了java調(diào)遠(yuǎn)程服務(wù)器的shell腳本以及停止的方法實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-03-03

