以往使用SpringMVC的时候都是通过在Resource目录下面新建一个web.xml文件用来完成Servlet的配置,往DispatcherServlet中添加一个WebApplication的配置文件,完成DispatcherServlet的配置,还可以配置一些请求的拦截,加载顺序等,其实外面也可以不使用web.xml,通过实现WebApplicationInitializer接口或者继承AbstractAnnotationConfigDispatcherServletInitializer 类(tomcat容器在启动的时候会自动搜索实现WebApplicationInitializer 接口或者继承AbstractAnnotationConfigDispatcherServletInitializer 类的类来初始化DispatcherServlet,相当于web.xml的功能也就是为什么能替换web.xml原因),这样的纯JAVA配置方式配置springmvc。

首先通过idea 新建一个maven项目,可以通过Module SDK 选择依赖的JDK版本,点击next下一步

java mvc 如何命名 java实现mvc_spring

接着填写项目的所属的组织,点击next下一步

java mvc 如何命名 java实现mvc_xml_02

接着点击finish完成整个项目的创建

java mvc 如何命名 java实现mvc_tomcat_03

项目创建号后在pom.xml文件中添加需要的依赖配置

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.terry</groupId>
    <artifactId>SSM</artifactId>
    <version>1.0-SNAPSHOT</version>
    <dependencies>
        <!-- spring-webmvc -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>5.3.5</version>
        </dependency>
        <!-- spring-core -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-core</artifactId>
            <version>5.3.5</version>
        </dependency>
        <!-- spring-context -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>5.3.5</version>
        </dependency>
    </dependencies>
</project>

注意除了上面的依赖外,还需要在项目中额外新增一个servlet-api.jar的依赖包,如下图点击右边的+,选择JARs or direction添加tomcat安装目录下的lib包里面的servlet-api.jar

java mvc 如何命名 java实现mvc_xml_04

添加依赖后如下图所示

java mvc 如何命名 java实现mvc_springmvc_05

在file-Project Structure -facets目录下点击+号选择Web 新建一个Web对象

java mvc 如何命名 java实现mvc_java mvc 如何命名_06


新建Web对象后,在后边的name可以修改这个对象的名字,Deployment Descriptions下面可以配置web.xml的路径,但是我们是基于java配置的没有web.xml,所以我们把这个删除,点击右边的-符号删除这个配置,然后在下面的Web Resource Directions下面修改resource的路径,修改为指定我们项目下的resources包,路径配置为"/",最后点击下面的fix生成一个artifact对象。

java mvc 如何命名 java实现mvc_spring_07

新建号artifacts项目后在右边的Available Elements下面选择需要打包成artifacts的项目,点击右键选择put into output root,然后选择下面的apply和ok完成artifacts的配置

java mvc 如何命名 java实现mvc_xml_08

接下来配置tomcat,在下面选择 edit configurations 进入配置

java mvc 如何命名 java实现mvc_spring_09

点击+号,选择tomcat server->local 进入tomcat的配置页面

java mvc 如何命名 java实现mvc_springmvc_10

在配置页面中点击configure配置下载好的tomcat(下载tomcat这里就不赘述了),可以在Name上面修改这个tomcat的名字,在 Http port修改tomcat的端口号

java mvc 如何命名 java实现mvc_xml_11

tomcat的基本信息配置好后,点击Deployment添加artifacts项目,artifacts项目在上面已经配置好了,点击右边的+号选择Artifact然后选择配置好的artifacts项目。

java mvc 如何命名 java实现mvc_springmvc_12

选择好artifacts项目后会出现在如下图中,可以在Application context这里修改应用的访问目录,点击apply,Ok完成tomcat的配置。

java mvc 如何命名 java实现mvc_xml_13

完成上面的一些准备工作后,接着就是通过JAVA的配置来实现一个DispatcherServlet完成springmvc的功能,
通过实现 WebApplicationInitializer 接口,重写 onStartup 方法。

public class MyWebApplicationInitializer implements WebApplicationInitializer {
    public void onStartup(ServletContext servletContext) throws ServletException {
        // 加载Web application的配置
        AnnotationConfigWebApplicationContext annotationConfigApplicationContext = new AnnotationConfigWebApplicationContext();
        annotationConfigApplicationContext.register(WebMVCConfig.class);
        // 配置servlet
        DispatcherServlet dispatcherServlet = new DispatcherServlet(annotationConfigApplicationContext);
        ServletRegistration.Dynamic app = servletContext.addServlet("app", dispatcherServlet);
        app.addMapping("/");
        app.setLoadOnStartup(1);
    }

通过继承 AbstractAnnotationConfigDispatcherServletInitializer 类,重写需要的方法。

public class MyWebApplicationInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
    @Override
    protected Class<?>[] getRootConfigClasses() {
        return null;
    }
    @Override
    protected Class<?>[] getServletConfigClasses() {
        return new Class[]{WebMVCConfig.class};
    }
    @Override
    protected String[] getServletMappings() {
        return new String[]{"/"};
    }
}

基于注解的web.xml配置如下:

<web-app>
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:app-context.xml</param-value>
    </context-param>
    <servlet>
        <servlet-name>app</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value></param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>app</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>
</web-app>

WebMVCConfig类的配置信息,@EnableWebMvc启动mvc,@ComponenScan扫描指定包下面的类。

@Configuration
@EnableWebMvc
@ComponentScan(value = "com.terry.common")
public class WebMVCConfig {
}

最后就是新建一个controller类,用于测试整个springmvc是否搭建成功,如果中文出现乱码,可以使用produces = “application/json;charset=utf-8” 来解决乱码。

@RestController
public class TestController {
    @GetMapping(value = "/ces", produces = "application/json;charset=utf-8")
    public String hello() {
        return "测试";
    }
}

在页面输入 地址可以看到返回了controller类hello方法的字符串"测试"

java mvc 如何命名 java实现mvc_java mvc 如何命名_14

感觉基于JAVA配置的方式比基于XML方式的配置要简便一些,没有那么多繁琐的约束,但是XML也有其独有的优势,没有绝对的那个好,那个坏的说法,主要看个人喜欢用那个。