SpringMVC 配置简介
一提到springMVC大家一定都很熟悉,目前好多公司都还在使用。
但是一提到springMVC的运行流程,估计有好多人就要百度了。再提springMVC的配置,估计更多的人都比较陌生。
目前的Spring 版本是支持 xml,注解和javaConfig配置的。当然这三个也能混合使用。
我们百度一下 spring mvc 搭建。结果基本上都是xml 和 注解的混合使用。
下面我来分享一下我对springMVC的个人理解。
第一步我们先新建一个maven webapp项目
建立web app项目我这里就不演示了,相信大家都会。接下来我开始介绍:
一、SpringMVC的XML配置方式
我们先在pom.xml文件夹中添加三个依赖:
一个为spring-webmvc 依赖,一个 servlet 依赖,一个测试依赖。
第一步
<!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.2.6.RELEASE</version>
</dependency>
<!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>这里有必要提一下:spring-webmvc 这个依赖。 这个依赖直接继承spring了不需要再额外导入spring其他的包了,这时候我的项目jar包就下载过过来了。如下图:

版本方面:
我们查看spring官网可以得知 最新版本的Spring Framework版本为:Version 5.2.7.RELEASE

感兴趣的小伙伴们可以自行查阅新功能。我这里用5.2.6测试。 网上好多用的还是 2.X版本的spring,有些即使用了5.X也用的是2.X的配置。5.0还是有很多新功能的,这里就不一一介绍了。
第二步
1、既然我们用SpringMVC 那就少不了web.xml 文件。
众所周知 springMVC 核心部分之一就是DispatcherServlet 。既然我们需要用到springMVC 那就必须和 servlet 结合起来,application.xml 也需要和servlet结合起来。
我们先在resources文件夹下新建一个application.xml 文件,**先什么都不写。**一会用到再配置。
如图:

2、我们现在就开始配置web.xml .
我们需要关联dispatcherServlet 和 application.xml 代码如下:
<!DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd" >
<web-app>
<display-name>Archetype Created Web Application</display-name>
<servlet>
<servlet-name>dispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:application.xml</param-value>
</init-param>
<!--启动优先级-->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dispatcherServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>同样在web.xml 也可以配置字符转换等等你项目所需要的功能,这里只配个springMVC
我们现在还差Controller和一个tomcat了。
第三步
添加一个纯xml配置的controller
代码如下:
/**
* <p>
* spring mvc xml 配置controller 方式
* </p>
*/
public class XmlController implements Controller {
private Date date;
//我这里运用spring构造方法注入bean
public XmlController(Date date){
this.date = date;
}
@Override
public ModelAndView handleRequest(HttpServletRequest httpServletRequest
, HttpServletResponse httpServletResponse) throws Exception {
System.out.println("xml Coltroller is run......" + date);
return null;
}
}类建好以后,我们需要把类托管给spring 。这时候就需要我们application.xml在中配置。配置代码如下:
<?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.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd">
<bean id="date" class="java.util.Date"/>
<bean name="/my" class="com.my.mvc.controller.XmlController">
<constructor-arg ref="date"/>
</bean>
</beans>解释一下:
<bean id="date" class="java.util.Date"/>
相当于
@Autowired
private Date date;<bean name="/my" class="com.my.mvc.controller.XmlController">
<constructor-arg ref="date"/>
</bean>
就是配置一个XmlController类,他的访问地址为/my至此我们的书写完了Controller了。
第四步
我们还差一个tomcat ,这个很简单,我们自己去tomcat官网下载一个,或者用idea的都行。我这里用的是maven中的出插件。maven 插件中的tomcat比较老,最高只支持tomcat7。大家觉得低也可以换成jetty jettry maven plugs支持更高版本。
我这里就不换了。具体怎么配置tomcat maven plugin 大家也可以自行百度,比较简单。
我这里简单介绍一下:
现在maven中添加tomcat plugin 如下:
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.2</version>
<configuration>
<!-- 项目访问路径 和端口号 -->
<path>/</path>
<port>8090</port>
<uriEncoding>UTF-8</uriEncoding><!-- 非必需项 -->
</configuration>
</plugin>第二步:配置启动项。至于为什么这么配,我这里不再过多介绍,官网上有详细介绍。

至此,SpringMVC xml纯xml配置方式完成,我们运行tomcat。启动成功后,我们访问:http://localhost:8090/my
这时候控制台打印如下图:

二、SpringMVC的注解配置方式
注解方式我们应该特别熟悉。网上基本都是这种,好多公司依然在用这种方式。配置环境不变。
第一步
我们新建一个类:叫AnnotationController
代码如下:
@RestController
@RequestMapping("/test")
public class AnnotationController {
@Autowired
private Date date;
@RequestMapping("/getUrl")
public String getUrl(String name) {
System.out.println("annotation controller run ...." + name + " time is " + date);
return "success";
}
}说明一下: @RestController 这个注解试spring 4.0版本添加的。相当于@ResponseBody 和 @Controller 如果使用4.0一下版本的 ,还是老老实实的写组合的吧。好多教程都还停留4.0一下。这里推荐高版本学习。
第二步
我们需要开启扫描。这时候就需要改变我们的application.xml了。修改后代码如下:
<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.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd">
<!--这两个bean是xml配置方式用的-->
<bean id="date" class="java.util.Date"/>
<bean name="/my" class="com.my.mvc.controller.XmlController">
<constructor-arg ref="date"/>
</bean>
<!--注解式配置-->
<!--开启扫描-->
<context:component-scan base-package="com.my.mvc*"/>
<!--开启SpringMvc注解模式-->
<mvc:annotation-driven/>
</beans>自此springMVC注解方式已经配置完成,这时候启动tomcat
访问:http://localhost:8090/test/getUrl?name=‘lilei’
我们可以看到控制台打印如图:

二、(重点)SpringMVC的javaConfig配置方式
javaConfig配置方式启动springMVC 博客中基本没有。
我们可以在maven仓库中看看Servlet3.0是什么时候发布。
如图:

好了不多说,下面这些介绍和Servlet3.0以上版本有关。涉及一些3.0的规范。
javaConfig 和 Servlet3.0规范一起可以不需要web.xml
和application.xml 全部使代码配置启动。当然这里比较难,需要有一些基础,比如了解javaConfig 了解内嵌式Tomcat和Servlet3.0 新规范中的一些方法。
下面正式开始吧:
第一步
先从pom.xml删除 tomcat plugin 。删除webapp 文件夹。删除recourse 文件夹
我们先在我刚才项目中configer 文件夹下创建 MyConfig.java文件。内容如下:
@Configuration
@ComponentScan("com.my.mvc")
public class MyConfig {
}说明: 这个类就是java config注解试配置。javaConfig 使用方式还需参考spring文档。
在springwebMvc官方文档给我们模拟了一份web3.0和java config配置springmvc的方式
如图:

我们新建一个类,把对应的代码copy 下来。
我把注释写到MyWebApplicationInitializer,java文件吧。
如下:
public class MyWebApplicationInitializer implements WebApplicationInitializer {
@Override
public void onStartup(ServletContext servletCxt) {
System.out.println("---------------servletCxt 开始启动-------------");
// 注解式启动spring容器。
AnnotationConfigWebApplicationContext ac = new AnnotationConfigWebApplicationContext();
//MyConfig.class 使我们项目的配置类。
ac.register(MyConfig.class);
//spring 初始化最关键的代码。需要了解源码。这里我还没有学明白
ac.refresh();
//下方的配置相等同于 之前的web.xml中配置的DispatcherServlet
// 创建然后注册一个DispatcherServlet
DispatcherServlet servlet = new DispatcherServlet(ac);
ServletRegistration.Dynamic registration = servletCxt.addServlet("app", servlet);
//设置启动优先级
registration.setLoadOnStartup(1);
//过滤器
registration.addMapping("/*");
}
}我们先打印一下System.out.println("---------------servletCxt 开始启动-------------"); 让我在后续Tomcat 启动的时候知道Spring环境已经加载。
第二步
这时候我们模仿Spring-boot 和Tomat启动类。
我们先建一个模仿Spring-boot 启动类,Application.java 代码如下
public class Application {
public static void run(){
}
}然后再建一个借鉴Tomcat启动类:BootStrap.java
代码如下:
public class BootStrap {
public static void main(String[] args) {
Application.run();
}
}添加一个内置的tomcat 内部的tomcat jar包我们已经在maven的pom.xml中添加过了。
这时候我们在 application 类中 创建tomcat
代码如下:
public class Application {
public static void run(){
//创建一个tomcat
Tomcat tomcat = new Tomcat();
tomcat.setPort(8088);
//项目所在目录
tomcat.addWebapp("/","D:\\my\\");
try {
tomcat.start();
tomcat.getServer().await();
} catch (LifecycleException e) {
e.printStackTrace();
}
}
}此时我们去启动我们的tomcat 这时候会发现如图:

tomcat 已经启动了。这个报错是因为没有jsp解析的jar 。下面我们在maven仓库中找到对应tomcat 的jar 如图:

这时候我们再来启动我们的man 方法
结果如下图:

这时候我们的tomcat 就成功启动了。
这时候我们再写一个Controller新建一个ConfigController.java
然后再代码如下:
@RestController
@RequestMapping("/config")
public class ConfigController {
@RequestMapping("/getUrl")
public String getUrl() {
System.out.println("config controller run ....");
return "success";
}
}然后启动访问 我们的controller 浏览器结果:

我们再看日志如下图:

至此我们的SpringMVC javaConfig和Servlet3.0就结合起来成为了零xml配置项目。可能有些同学比较疑问MyWebApplicationInitializer.java 文件命名什么都没做,怎么启动的时候就加载了呢。
这就是Servlet3.0的知识了。
MyWebApplicationInitializer implements WebApplicationInitializer接口。我们实现了这个接口怎么就调用了呢?
Servlet3.0 规范的作用。
我们在加载的jar 包中找到如图的jar包

规范规定只要项目中有META-INF问价夹下有javax.servlet.ServletContainerInitializer配置文件。在文件中配置的类,会被加载。

我们点进去进入类中。发现如图

@HandlesTypes(WebApplicationInitializer.class) 这个是servlet3.0的注解,规定只要加了这个注解,这个注解就会在初始化的时候调用WebApplicationInitializer 中的所有实现了WebApplicationInitializer 接口的onStartup方法。
所以我们的类 MyWebApplicationInitializer implements WebApplicationInitializer 这时候我们的onStartup 方法也就可以被调用。也就是我们DispatcherServlet 可以成功的初始化。这个是规范。
小结
好了,SpringMVC 的三种启动方式在这里我就介绍完了。其中有很多的不足之处,希望与大家共同进步吧。
文中还有一处小小的BUG 我现在也没有明白,如有知道可以在下方留言告知。我学明白后会及时的给修复。
















