1. Spring MVC介紹
提到MVC,參與過Web應(yīng)用程序開發(fā)的同學(xué)都很熟悉,它是展現(xiàn)層(也可以理解成直接展現(xiàn)給用戶的那一層)開發(fā)的一種架構(gòu)模式,M全稱是Model,指的是數(shù)據(jù)模型,V全稱是View,指的是視圖頁面,如JSP、Thymeleaf等,C全稱是Controller,指的是控制器,用來處理用戶在客戶端(瀏覽器)發(fā)起的請求。
Spring MVC就是基于MVC模式實(shí)現(xiàn),能夠幫你構(gòu)建像Spring框架那樣靈活和松耦合的Web應(yīng)用程序。
也就是說,Spring MVC是基于Spring的,它主要用來開發(fā)Web應(yīng)用程序。
2. Spring MVC請求流程
在Web應(yīng)用程序中,請求是必不可少的,每次請求由用戶(客戶端)發(fā)起,到用戶(客戶端)接收到響應(yīng)結(jié)束,下圖展示了一個請求在Spring
MVC中所經(jīng)歷的每個流程:
接下來我們對圖中的每個流程做下講解:
* 請求離開瀏覽器時(圖中的①),會帶有用戶所請求內(nèi)容的信息,比如請求的URL和提交的表單信息。
* 然后進(jìn)入到請求的第一站,即Spring的DispatcherServlet,它的任務(wù)是將請求發(fā)送給Spring MVC控制器。
* 因?yàn)樵趹?yīng)用程序中會有多個控制器,因此DispatcherServlet會查詢一個或多個處理器映射(handler
mapping),處理器映射會根據(jù)請求所攜帶的URL來確定應(yīng)該將請求發(fā)送給哪個控制器(圖中的②)。
*
確定好控制器后,DispatcherServlet會將請求發(fā)送給確定好的控制器,然后等待控制器處理用戶提交的信息,不過一般情況下,控制器本身幾乎不處理工作,而是將業(yè)務(wù)邏輯委托給一個或多個服務(wù)對象進(jìn)行處理(圖中的③)。
*
控制器完成業(yè)務(wù)邏輯處理后,通常會產(chǎn)生一些模型(Model)信息,這些信息需要返回給用戶并在瀏覽器上顯示,為了更友好的展示這些信息,比如以Html形式展示,我們需要將信息發(fā)送給一個視圖(View),比如JSP、Thymeleaf。
*
控制器所做的最后一件事就是將模型數(shù)據(jù)打包,并且標(biāo)示出用于渲染輸出的視圖名,它會將請求連同模型和視圖名發(fā)送回DispatcherServlet(圖中的④),不過控制器只會返回一個視圖的邏輯名稱,而不是返回具體的某個特定視圖,這個邏輯名稱將會用來查找產(chǎn)生結(jié)果的真正視圖。DispatcherServlet會使用視圖解析器(view
resolver)來將邏輯視圖名匹配為某個特定視圖(圖中的⑤),比如JSP或者Thymeleaf。
* 請求的最后一站是視圖的實(shí)現(xiàn)(圖中的⑥),在這里視圖將使用模型數(shù)據(jù)渲染輸出,這個輸出會通過響應(yīng)對象傳遞給用戶/客戶端(圖中的⑦)。
了解了Spring MVC的請求流程后,我們來接著了解下如何搭建和配置Spring MVC項(xiàng)目。
3. 搭建Spring MVC項(xiàng)目
我們?nèi)匀谎佑弥安┛椭行陆ǖ膕pring-action項(xiàng)目,有興趣的同學(xué)可以看下本系列的前11篇博客或者直接下載源碼:
https://github.com/zwwhnly/spring-action.git
<https://github.com/zwwhnly/spring-action.git>。
3.1 添加依賴
要想使用Spring MVC,首先我們需要在pom.xml中添加如下依賴:
<dependency> <groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId> <version>4.3.18.RELEASE</version>
</dependency> <!-- 其他Web依賴 --> <dependency> <groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId> <version>1.2</version> </dependency> <dependency>
<groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version> <scope>provided</scope> </dependency>
因?yàn)楹竺嬉獙㈨?xiàng)目部署到Tomcat,所以我們在pom.xml中配置下打包方式為war包:
<packaging>war</packaging> <build> <plugins> <!--其他配置--> <plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId> <version>3.2.3</version>
<configuration> <failOnMissingWebXml>false</failOnMissingWebXml>
</configuration> </plugin> </plugins> </build>
3.2 新建演示頁面
在src/main/resources下新建views目錄,然后在此目錄下新建index.jsp頁面如下所示:
<%@ page contentType="text/html;charset=UTF-8" language="java"
pageEncoding="UTF-8" %> <html> <head> <title>Spring MVC</title> </head> <body>
<pre> Welcome to Spring MVC world </pre> </body> </html>
這里可能存在的問題是,右鍵新建JSP文件時,沒有JSP文件模板,就像下面這樣:
解決方案如下所示:
依次點(diǎn)擊File--Project Structure,打開Project Structure對話框,左側(cè)選中Modules,然后點(diǎn)擊+號,選擇Web
此時再次右鍵新增JSP文件,就會看到JSP文件模板:
此時項(xiàng)目根目錄會生成1個web文件夾,可以將其刪除。
3.3 Spring MVC配置
新建配置類MyMvcConfig如下所示:
package chapter05.config; import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan; import
org.springframework.context.annotation.Configuration; import
org.springframework.web.servlet.config.annotation.EnableWebMvc; import
org.springframework.web.servlet.view.InternalResourceViewResolver; import
org.springframework.web.servlet.view.JstlView; /** * Spring MVC配置 */
@Configuration @EnableWebMvc @ComponentScan("chapter05") public class
MyMvcConfig { /** * 視圖解析器配置 * * @return */ @Bean public
InternalResourceViewResolver viewResolver() { InternalResourceViewResolver
viewResolver = new InternalResourceViewResolver();
viewResolver.setPrefix("/WEB-INF/classes/views/");
viewResolver.setSuffix(".jsp"); viewResolver.setViewClass(JstlView.class);
return viewResolver; } }
注意事項(xiàng):
1)該配置類使用了@EnableWebMvc注解來啟用Spring MVC,它會開啟一些默認(rèn)配置。
2)該配置類配置了視圖解析器,這里我們配置的是JSP的視圖解析器。
視圖解析器中,我們設(shè)置了前綴和后綴,如果控制器中返回的邏輯視圖名稱是index,實(shí)際渲染時找的視圖就是/WEB-INF/classes/views/index.jsp,為什么設(shè)置的前綴是/WEB-INF/classes/views/而不是/src/main/resources/views/呢,那是因?yàn)轫?xiàng)目編譯完運(yùn)行時的目錄是/WEB-INF/classes/views/。
如果編譯完成該目錄下沒有jsp文件,則需要在pom.xml中添加如下配置:
<build> <resources> <resource> <directory>src/main/resources</directory>
<includes> <include>**/*.jsp</include> <include>**/*.js</include> </includes>
</resource> </resources> </build>
3.4 Web配置
新建Web配置類WebInitializer如下所示:
package chapter05.config; import
org.springframework.web.WebApplicationInitializer; import
org.springframework.web.context.support.AnnotationConfigWebApplicationContext;
import org.springframework.web.servlet.DispatcherServlet; import
javax.servlet.ServletContext; import javax.servlet.ServletException; import
javax.servlet.ServletRegistration.Dynamic; public class WebInitializer
implements WebApplicationInitializer { @Override public void
onStartup(ServletContext servletContext) throws ServletException {
AnnotationConfigWebApplicationContext context = new
AnnotationConfigWebApplicationContext(); context.register(MyMvcConfig.class);
context.setServletContext(servletContext); Dynamic servlet =
servletContext.addServlet("dispatcher", new DispatcherServlet(context));
servlet.addMapping("/"); servlet.setLoadOnStartup(1); } }
這里重點(diǎn)要關(guān)注的是,該類實(shí)現(xiàn)了接口WebApplicationInitializer并重寫了onStartup()方法,WebApplicationInitializer類是Spring提供用來配置Servlet
3.0+版本配置的接口,從而可以替代掉web.xml。
3.5 新建控制器
新建控制器HelloController如下所示:
package chapter05.controller; import
org.springframework.stereotype.Controller; import
org.springframework.web.bind.annotation.RequestMapping; @Controller public
class HelloController { @RequestMapping("/index") public String hello() { //
這里返回的邏輯視圖名 return "index"; } }
上面代碼中的@Controller注解聲明這是1個控制器,@RequestMapping("/index")
用來配置URL映射,現(xiàn)在問題來了,我們?nèi)绾尾榭创a的運(yùn)行效果呢?
這就涉及到了項(xiàng)目打包和項(xiàng)目部署,我們繼續(xù)往下看。
4. 項(xiàng)目部署到Tomcat中
4.1 打包(war包)
因?yàn)槲覀兊捻?xiàng)目是通過Maven管理的,在pom.xml中也配置了打包方式為war包和打包插件,所以我們可以在IDEA的右側(cè)找到Maven資源管理器,然后如下圖所示,點(diǎn)擊clean:
然后再點(diǎn)擊package:
最后生成的war包如下所示:
這就是我們要部署到Tomcat中的war包。
4.2 Tomcat安裝及部署
既然要部署到Tomcat中,那么就有2個問題需要解答:
* 什么是Tomcat?
* Tomcat如何安裝?
先回答第1個問題,Tomcat是一個免費(fèi)的開放源代碼的輕量級的Web應(yīng)用服務(wù)器,如果你接觸過.NET的Web開發(fā),它就類似于IIS。
再回答第2個問題,可以參考如下步驟安裝Tomcat。
打開Tomcat官網(wǎng) <http://tomcat.apache.org/>,找到你要下載的Tomcat版本,我這里選擇的是Tomcat 8.5.45
Released版本:
然后選擇合適的版本下載,因?yàn)槲业拈_發(fā)機(jī)器是Windows 64位操作系統(tǒng),所以我選擇的是如下所示的版本:
下載完成后,將其解壓到你喜歡的目錄,我解壓到的目錄是E:\Tools\apache-tomcat-8.5.45-windows-x64\apache-tomcat-8.5.45,解壓完成后長如下這樣:
其中webapps就是網(wǎng)站要部署的目錄。
安裝完成后,考慮的問題就是如何啟動Tomcat?
第1種方法是雙擊bin目錄下的tomcat8.exe:
然后在瀏覽器輸入地址http://localhost:8080/,看到如下界面,代表Tomcat安裝部署成功。
使用這種方法的缺點(diǎn)就是,如果把tomcat8.exe打開的窗口關(guān)閉了,Tomcat也就關(guān)閉了,非常不方便,因此建議使用第2種方法,將Tomcat安裝成一個后臺服務(wù),讓其在后臺運(yùn)行,操作方法如下所示:
依次打開計(jì)算機(jī)--屬性--高級系統(tǒng)設(shè)置--高級--環(huán)境變量,新增系統(tǒng)變量:
變量名:CATALINA_HOME
變量值:E:\Tools\apache-tomcat-8.5.45-windows-x64\apache-tomcat-8.5.45(你將Tomcat解壓的目錄)
然后編輯系統(tǒng)變量Path,在其最后添加如下內(nèi)容:
;%CATALINA_HOME%\lib;%CATALINA_HOME%\bin
然后以管理員身份打開cmd窗口,切換到Tomcat的bin目錄,執(zhí)行命令:service.bat install。
然后打開Windows的服務(wù)列表,會看到一個Tomcat8的服務(wù):
將服務(wù)修改成自動啟動并啟動該服務(wù)即可在后臺一直運(yùn)行Tomcat服務(wù)器。
如果你好奇新建的系統(tǒng)變量為什么必須是CATALINA_HOME,那么可以用記事本打開bin目錄下的service.bat,看到如下內(nèi)容你就明白了:
從上圖也可以看出,運(yùn)行Tomcat需要依賴環(huán)境變量JAVA_HOME(配置JAVA SDK路徑),不過我之前已經(jīng)配置過了,如下所示:
4.3 將war包部署到Tomcat中
將之前打包好的spring-action-1.0-SNAPSHOT.war復(fù)制到Tomcat的webapps目錄:
因?yàn)槲覀兊腡omcat服務(wù)器設(shè)置成了后臺運(yùn)行,過一會該目錄就會生成1個和war包名相同的spring-action-1.0-SNAPSHOT文件夾,目錄結(jié)構(gòu)如下所示:
我們的代碼和JSP視圖文件都在WEB-INF目錄下的classes文件夾下:
在瀏覽器中輸入地址http://localhost:8080/spring-action-1.0-SNAPSHOT/index,頁面展示如下所示:
5. 源碼及參考
源碼地址:https://github.com/zwwhnly/spring-action.git
<https://github.com/zwwhnly/spring-action.git>,歡迎下載。
Craig Walls 《Spring實(shí)戰(zhàn)(第4版)》
汪云飛《Java EE開發(fā)的顛覆者:Spring Boot實(shí)戰(zhàn)》
【IntelliJ IDEA】使用idea解決新建jsp文件而找不到j(luò)sp文件模版的新建選項(xiàng)
<https://www.cnblogs.com/sxdcgaq8080/p/7676294.html>
Tomcat安裝及配置教程 <https://www.cnblogs.com/dgj15222301178/p/7834815.html>
Tomcat安裝及后臺運(yùn)行的方法
<https://jingyan.baidu.com/article/77b8dc7f3e4fba2174eab6d9.html>
6. 最后
歡迎掃碼關(guān)注微信公眾號:「申城異鄉(xiāng)人」,定期分享Java技術(shù)干貨,讓我們一起進(jìn)步。
熱門工具 換一換