提到MVC,參與過Web應用程序開發的同窗都很熟悉,它是展示層(也能夠理解成直接展示給用戶的那一層)開發的一種架構模式,M全稱是Model,指的是數據模型,V全稱是View,指的是視圖頁面,如JSP、Thymeleaf等,C全稱是Controller,指的是控制器,用來處理用戶在客戶端(瀏覽器)發起的請求。html
Spring MVC就是基於MVC模式實現,可以幫你構建像Spring框架那樣靈活和鬆耦合的Web應用程序。java
也就是說,Spring MVC是基於Spring的,它主要用來開發Web應用程序。git
在Web應用程序中,請求是必不可少的,每次請求由用戶(客戶端)發起,到用戶(客戶端)接收到響應結束,下圖展現了一個請求在Spring MVC中所經歷的每一個流程:github
接下來咱們對圖中的每一個流程作下講解:web
瞭解了Spring MVC的請求流程後,咱們來接着瞭解下如何搭建和配置Spring MVC項目。spring
咱們仍然延用以前博客中新建的spring-action項目,有興趣的同窗能夠看下本系列的前11篇博客或者直接下載源碼:github.com/zwwhnly/spr…。apache
要想使用Spring MVC,首先咱們須要在pom.xml中添加以下依賴:windows
<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>
複製代碼
由於後面要將項目部署到Tomcat,因此咱們在pom.xml中配置下打包方式爲war包:api
<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>
複製代碼
在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文件模板,就像下面這樣:
解決方案以下所示:
依次點擊File--Project Structure,打開Project Structure對話框,左側選中Modules,而後點擊+號,選擇Web
此時再次右鍵新增JSP文件,就會看到JSP文件模板:
此時項目根目錄會生成1個web文件夾,能夠將其刪除。
新建配置類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;
}
}
複製代碼
注意事項:
1)該配置類使用了@EnableWebMvc
註解來啓用Spring MVC,它會開啓一些默認配置。
2)該配置類配置了視圖解析器,這裏咱們配置的是JSP的視圖解析器。
視圖解析器中,咱們設置了前綴和後綴,若是控制器中返回的邏輯視圖名稱是index,實際渲染時找的視圖就是/WEB-INF/classes/views/index.jsp,爲何設置的前綴是/WEB-INF/classes/views/而不是/src/main/resources/views/呢,那是由於項目編譯完運行時的目錄是/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>
複製代碼
新建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);
}
}
複製代碼
這裏重點要關注的是,該類實現了接口WebApplicationInitializer並重寫了onStartup()方法,WebApplicationInitializer類是Spring提供用來配置Servlet 3.0+版本配置的接口,從而能夠替代掉web.xml。
新建控制器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映射,如今問題來了,咱們如何查看代碼的運行效果呢?
這就涉及到了項目打包和項目部署,咱們繼續往下看。
由於咱們的項目是經過Maven管理的,在pom.xml中也配置了打包方式爲war包和打包插件,因此咱們能夠在IDEA的右側找到Maven資源管理器,而後以下圖所示,點擊clean:
而後再點擊package:
最後生成的war包以下所示:
這就是咱們要部署到Tomcat中的war包。
既然要部署到Tomcat中,那麼就有2個問題須要解答:
先回答第1個問題,Tomcat是一個免費的開放源代碼的輕量級的Web應用服務器,若是你接觸過.NET的Web開發,它就相似於IIS。
再回答第2個問題,能夠參考以下步驟安裝Tomcat。
打開Tomcat官網,找到你要下載的Tomcat版本,我這裏選擇的是Tomcat 8.5.45 Released版本:
而後選擇合適的版本下載,由於個人開發機器是Windows 64位操做系統,因此我選擇的是以下所示的版本:
下載完成後,將其解壓到你喜歡的目錄,我解壓到的目錄是E:\Tools\apache-tomcat-8.5.45-windows-x64\apache-tomcat-8.5.45,解壓完成後長以下這樣:
其中webapps就是網站要部署的目錄。
安裝完成後,考慮的問題就是如何啓動Tomcat?
第1種方法是雙擊bin目錄下的tomcat8.exe:
而後在瀏覽器輸入地址http://localhost:8080/,看到以下界面,表明Tomcat安裝部署成功。
使用這種方法的缺點就是,若是把tomcat8.exe打開的窗口關閉了,Tomcat也就關閉了,很是不方便,所以建議使用第2種方法,將Tomcat安裝成一個後臺服務,讓其在後臺運行,操做方法以下所示:
依次打開計算機--屬性--高級系統設置--高級--環境變量,新增系統變量:
變量名:CATALINA_HOME
變量值:E:\Tools\apache-tomcat-8.5.45-windows-x64\apache-tomcat-8.5.45(你將Tomcat解壓的目錄)
而後編輯系統變量Path,在其最後添加以下內容:
;%CATALINA_HOME%\lib;%CATALINA_HOME%\bin
而後以管理員身份打開cmd窗口,切換到Tomcat的bin目錄,執行命令:service.bat install。
而後打開Windows的服務列表,會看到一個Tomcat8的服務:
將服務修改爲自動啓動並啓動該服務便可在後臺一直運行Tomcat服務器。
若是你好奇新建的系統變量爲何必須是CATALINA_HOME,那麼能夠用記事本打開bin目錄下的service.bat,看到以下內容你就明白了:
從上圖也能夠看出,運行Tomcat須要依賴環境變量JAVA_HOME(配置JAVA SDK路徑),不過我以前已經配置過了,以下所示:
將以前打包好的spring-action-1.0-SNAPSHOT.war複製到Tomcat的webapps目錄:
由於咱們的Tomcat服務器設置成了後臺運行,過一會該目錄就會生成1個和war包名相同的spring-action-1.0-SNAPSHOT文件夾,目錄結構以下所示:
咱們的代碼和JSP視圖文件都在WEB-INF目錄下的classes文件夾下:
在瀏覽器中輸入地址http://localhost:8080/spring-action-1.0-SNAPSHOT/index,頁面展現以下所示:
源碼地址:github.com/zwwhnly/spr…,歡迎下載。
Craig Walls 《Spring實戰(第4版)》
汪雲飛《Java EE開發的顛覆者:Spring Boot實戰》
【IntelliJ IDEA】使用idea解決新建jsp文件而找不到jsp文件模版的新建選項
最後,歡迎關注個人微信公衆號:「申城異鄉人」,全部博客會同步更新。