提到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文件模版的新建选项
最后,欢迎关注个人微信公众号:「申城异乡人」,全部博客会同步更新。