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包就下载过过来了。如下图:

SpringMVC中使用cxf 开发客户端 springmvc config_java


版本方面:

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

SpringMVC中使用cxf 开发客户端 springmvc config_tomcat_02


感兴趣的小伙伴们可以自行查阅新功能。我这里用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 文件,**先什么都不写。**一会用到再配置。

如图:

SpringMVC中使用cxf 开发客户端 springmvc config_java_03


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中使用cxf 开发客户端 springmvc config_maven_04


至此,SpringMVC xml纯xml配置方式完成,我们运行tomcat。启动成功后,我们访问:http://localhost:8090/my

这时候控制台打印如下图:

SpringMVC中使用cxf 开发客户端 springmvc config_tomcat_05

二、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中使用cxf 开发客户端 springmvc config_tomcat_06

二、(重点)SpringMVC的javaConfig配置方式

javaConfig配置方式启动springMVC 博客中基本没有。

我们可以在maven仓库中看看Servlet3.0是什么时候发布。

如图:

SpringMVC中使用cxf 开发客户端 springmvc config_spring boot_07


好了不多说,下面这些介绍和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的方式

如图:

SpringMVC中使用cxf 开发客户端 springmvc config_tomcat_08


我们新建一个类,把对应的代码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 这时候会发现如图:

SpringMVC中使用cxf 开发客户端 springmvc config_java_09


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

SpringMVC中使用cxf 开发客户端 springmvc config_java_10


这时候我们再来启动我们的man 方法

结果如下图:

SpringMVC中使用cxf 开发客户端 springmvc config_spring_11


这时候我们的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中使用cxf 开发客户端 springmvc config_tomcat_12


我们再看日志如下图:

SpringMVC中使用cxf 开发客户端 springmvc config_tomcat_13


至此我们的SpringMVC javaConfig和Servlet3.0就结合起来成为了零xml配置项目。可能有些同学比较疑问MyWebApplicationInitializer.java 文件命名什么都没做,怎么启动的时候就加载了呢。

这就是Servlet3.0的知识了。

MyWebApplicationInitializer implements WebApplicationInitializer接口。我们实现了这个接口怎么就调用了呢?

Servlet3.0 规范的作用。

我们在加载的jar 包中找到如图的jar包

SpringMVC中使用cxf 开发客户端 springmvc config_spring boot_14


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

SpringMVC中使用cxf 开发客户端 springmvc config_spring_15


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

SpringMVC中使用cxf 开发客户端 springmvc config_spring_16


@HandlesTypes(WebApplicationInitializer.class) 这个是servlet3.0的注解,规定只要加了这个注解,这个注解就会在初始化的时候调用WebApplicationInitializer 中的所有实现了WebApplicationInitializer 接口的onStartup方法。

所以我们的类 MyWebApplicationInitializer implements WebApplicationInitializer 这时候我们的onStartup 方法也就可以被调用。也就是我们DispatcherServlet 可以成功的初始化。这个是规范。

小结

好了,SpringMVC 的三种启动方式在这里我就介绍完了。其中有很多的不足之处,希望与大家共同进步吧。
文中还有一处小小的BUG 我现在也没有明白,如有知道可以在下方留言告知。我学明白后会及时的给修复。