【从无到有】IDEA + maven + java web + springMVC + Tomcat 项目搭建
阅读原文时间:2021年04月20日阅读:1

【本文适用读者】

1、不必太熟悉 IDEA 开发环境,用过或见过那么几次就行。(我们看图说话)

2、完全没有使用过 maven。

3、对 java web 有一定的了解。(知道 jsp、用 java 写后台就可以了)

4、完全没有接触过 springMVC。(建议还是应该先了解一下)

5、了解 Tomcat 的环境配置、启动等,如“service.bat install”、“net start tomcat9”、“startup.bat”。(其实不了解也没事)

6、喜欢看图者。(基本上每一步都有图)

7、最好懂点英文,如果一点也不懂也没关系。(我们看图说话)

【本文说明】

1、本文并不对 maven、java web、springMVC 做过多解释,更多知识请直接学习相关知识。

2、本文内容过多,可以选择跳读,但有可能导致上下文衔接不上,逻辑混乱看不懂。

3、同样由于本文内容过多,如有错误(包括但不限于错别字、行号、排版、图片等)欢迎在评论区指正,但是如果我的图片内容位置和你的不一样,说明我这篇文章过时了,IDEA 或 spring 更新了,这怪不着我。

4、本文于2018年12月26日首发表于CSDN博客,如后续有修改将补充在此处。

【本文参考文章】

IDEA用maven创建springMVC项目和配置(XML配置和Java配置)(修正版)

该文由 苍穹之跃 著于 2017年11月17日 17:03:05。因其文章代码段排版不够清晰,介绍不清晰,且有一些错误,遂发表本文。

【本文涉及软件】

1、Windows 操作系统

2、IntelliJ IDEA 

3、JDK(Java Development Kit)

4、Tomcat

【IDEA 版本】

IntelliJ IDEA 2018.3.2 (Ultimate Edition)
Build #IU-183.4886.37, built on December 17, 2018
Licensed to Rover12421 / Rover12421
Subscription is active until January 1, 2100
JRE: 1.8.0_152-release-1343-b26 amd64
JVM: OpenJDK 64-Bit Server VM by JetBrains s.r.o
Windows 10 10.0

【JDK 版本】

【Tomcat 版本】

【目录】

1、构建 maven 项目

2、配置 Tomcat

3、导入 springMVC

4、配置 springMVC 之 xml 配置

5、配置 springMVC 之 java 配置

6、示例

【构建 maven 项目】

1、打开 IDEA,新建项目,点击 “Create New Project”。

2、左侧选择 Maven,右侧勾选“Create from archetype”,在下方找到并选择“org.apache.maven.archetypes:maven-archetype-webapp”,点击 Next。

3、GroupId 类似于包名,公司地址等,可以随意填写,ArtifactId 最好和你的项目一名一样,Version 默认即可。

4、为了快一点创建,我们需要在这个页面添加一个属性值,点击图中所指处的“加号”。

5、Name 输入 archetypeCatalog,Value 输入 internal。

6、添加上之后如图所示,不要着急点击 Next。


7、因为 maven 的官方仓库在国外,用 maven 下载依赖包时会很慢,因此我们使用阿里镜像。打开上图中“User setting file”指向的路径下的“settings.xml”文件。

8、在第146行有一个 标签(如果没有则可能是因为版本不同,导致行号有变,请自行查找其位置)。在 标签中加入代码块:

    <mirror>
      <id>alimaven</id>
      <mirrorOf>central</mirrorOf>
      <name>aliyun maven</name>
      <url>http://maven.aliyun.com/nexus/content/repositories/central/</url>
    </mirror>

9、回到 IDEA 中,点击Next。在这个页面可以修改 Project location、Content root、Module file location,如果你不了解他们的区别和作用,填写同一个路径即可,一般大项目中,Project 里有 很多 Module 的情况下才可能会有需求修改这些路径,小项目一般一个 Module 就够了。

10、如果选择的文件夹不存在,会给你提示,点击 OK 即可。

11、等待 IDEA 构建完毕项目,在右下角有一个提示,点击右边的选项“Enable Auto-Import”即可。

【配置 Tomcat】

1、首先,看一下目录结构,IDEA 默认构建的目录结构和文件如图所示。

2、我们手动创建一些文件夹,分别是

src/test

src/main/java

src/main/resources

src/main/webapp/WEB-INF/WebContent(为 SpringMVC 做准备)

文件夹名字不重要,能看懂就行。

3、检查 IDEA 是否自动识别了 Tomcat。按 Ctrl + Alt + S 打开 Settings(在菜单栏 File 中也可以找到打开),找到 Build, Execution, Deployment 里面的 Application Servers,看其右侧是否有配置 Tomcat ,路径是否正确,如果没有则参考第 4 - 5 步。如果有自动配置 Tomcat 则关闭 setting ,然后直接跳到第 6 步。

4、点击如图所示的“加号”,然后点击“Tomcat Server”。

5、如果没有自动识别路径,则手动选择路径,点击 OK 后即可添加上,然后点击 Apply、OK来关闭 setting。

6、点击右上角的 Add Configuration。

7、点击左上角的“加号”,选择“Tomcat Server”里面的“Local”。

8、可以给其换个名字,也可以不换。Open browser 一栏中,如果勾选 After launch 则在 IDEA 启动 Tomcat 后自动打开浏览器,打开的浏览器是右侧的浏览器,可以选择更换,URL一项就是访问的网址,将其在后面加上 Test,跟第10步相对应。

9、点击第二个标签“Deployment”,会发现里面是空的,我们需要添加一个,于是点击右边的“加号”,然后点击“Artifact”。

10、弹出窗口选择下面那个“Test:war exploded”。

11、修改下面的“Application context”为“/Test”与第8步相对应,然后点击右侧的那个“笔”

12、弹出窗口,我们先不急着修改,首先要知道这个窗口叫做“Project Structure”,在菜单栏 File 中可以找到打开。

13、点击左上角“Project”,然后在右侧可以修改 Project name(项目名)、Project compiler output(项目编译输出路径),默认即可,或根据实际情况(个人爱好)修改路径,不过默认就好。

14、点击左上角“Modules”,选择“Test”(注意,不是选择“Test”里面的“Web”),然后对右面文件夹进行标记。

15、将 java 文件夹标记为 Sources,resources 文件夹标记为 Resources,test 文件夹标记为 Tests。

16、点击“Web”,可以对 Web 资源的根目录进行编辑,不过默认就好。

17、点击左侧 Artifacts,选择 Test:war exploded,可以修改右侧的 Output directory,就是项目发布的位置,可以根据个人需求修改为 Tomcat 的路径,如“D:\Program Files\apache-tomcat-9.0.12\webapps\Test”或“D:\Program Files\apache-tomcat-9.0.12\wtpwebapps\Test”等,如果没有需求默认即可。下面红框圈起来的的部分默认就好,可以根据个人需求修改,其中的就是上面的 Output directory,下面的内容就是在 Output directory 中的内容、布局。

18、回到添加 Tomcat 配置界面,可以修改下面的“Application context”,这个是发布后访问的网址相关,修改这个会自动同步修改Server菜单里的启动后访问网址。点击  Apply、OK 关闭页面即可。

19、点击 OK 关闭上一步的页面后,IDEA在下方会自动弹出 Application Servers,点击其左侧第一个按钮启动 Tomcat。

20、控制台提示连接到服务了,Artifact deploy 成功,用时 568 毫秒。(为排版美观,图片就这么宽,请见谅,把控制台信息Copy 过来了,有需要的就看看)

Connected to server
[2018-12-27 10:42:37,296] Artifact Test:war exploded: Artifact is being deployed, please wait...
[2018-12-27 10:42:37,864] Artifact Test:war exploded: Artifact is deployed successfully
[2018-12-27 10:42:37,865] Artifact Test:war exploded: Deploy took 568 milliseconds

25、如果在第 8 步配置过启动 Tomcat 后打开浏览器,则现在已经自动弹出了浏览器并打开了第 8 步的 URL。否则需要手动打开浏览器,输入网址 URL。

【导入 springMVC】

1、打开这个 pom.xml 文件

2、找到 标签

3、在 标签中增加  标签,具体代码如下:

        <!-- jstl -->
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>4.0.1</version>
        </dependency>
        <dependency>
            <groupId>javax.servlet.jsp</groupId>
            <artifactId>javax.servlet.jsp-api</artifactId>
            <version>2.3.3</version>
        </dependency>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>jstl</artifactId>
            <version>1.2</version>
        </dependency>

        <!--springframework-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-web</artifactId>
            <version>5.1.3.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>5.1.3.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>5.1.3.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jdbc</artifactId>
            <version>5.1.3.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>commons-io</groupId>
            <artifactId>commons-io</artifactId>
            <version>2.6</version>
        </dependency>
        <dependency>
            <groupId>commons-fileupload</groupId>
            <artifactId>commons-fileupload</artifactId>
            <version>1.3.3</version>
        </dependency>

4、关于版本号,个人习惯用最新的,查询最新版本号的方式有很多,我就不列举了。

5、添加框架支持:右键单击我们的项目文件夹 Test,点击“Add Framework Support…”。

6、勾选 Spring MVC,点击 OK 关闭页面。如果你的“Add Framework Support”并没有 Spring,不要慌,请看第 7 - 8 步。如果成功勾选上 Spring,请直接看第 9 步。

7、如果你的“Add Framework Support”是如下图所示,并没有 Spring MVC,不要慌,先关了它。

8、打开 Project Structure,点击左侧 Modules,选择 Spring,点击上面的“减号”,点击 Apply、OK 关闭页面,回到第6步。

9、成功添加框架支持后,会发现多出现了两个文件,“applicationContext.xml”和“dispatcher-servlet”。

【配置 springMVC 之 xml 配置】

1、打开 web.xml 文件。

2、由于 IDEA 用 maven 创建的 web.xml 文件版本比较低,可以先重新创建一个 Project,选择 Java Enterprise 里面的 Web Application,然后将其中的 web.xml 中的内容复制过来。

3、然后根据下面的代码对应补全。(主要就是创建一个中央的控制器,想了解各参数意义,请学习 SpringMVC 相关课程,代码中注释取自本文参考文章)

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">
    <display-name>Archetype Created Web Application</display-name>

    <!--welcome pages-->
    <welcome-file-list>
        <welcome-file>index</welcome-file>
    </welcome-file-list>

    <!--把applicationContext.xml加入到配置文件中-->
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/applicationContext.xml</param-value>
    </context-param>
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>

    <!--配置springmvc DispatcherServlet-->
    <servlet>
        <servlet-name>springMVC</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <!--配置dispatcher.xml作为mvc的配置文件-->
            <param-name>contextConfigLocation</param-name>
            <param-value>/WEB-INF/dispatcher-servlet.xml</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
        <async-supported>true</async-supported>
    </servlet>
    <servlet-mapping>
        <servlet-name>springMVC</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>
</web-app>

4、打开并编辑“dispatcher-servlet.xml”文件,记住下面代码中的最后一行的“base-package”的值,后面会用到。(想了解各参数意义,请学习 SpringMVC 相关课程,代码中注释取自本文参考文章)

<?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">

    <!--启用spring的一些annotation -->
    <context:annotation-config/>

    <!-- 配置注解驱动 可以将request参数与绑定到controller参数上 -->
    <mvc:annotation-driven/>

    <!--静态资源映射-->
    <!--本项目把静态资源放在了webapp的WebContent目录下,资源映射如下-->
    <mvc:resources mapping="/css/**" location="/WEB-INF/WebContent/css/"/>
    <mvc:resources mapping="/js/**" location="/WEB-INF/WebContent/js/"/>
    <mvc:resources mapping="/images/**" location="/WEB-INF/WebContent/images/"/>

    <!-- 对模型视图名称的解析,即在模型视图名称添加前后缀(如果最后一个还是表示文件夹,则最后的斜杠不要漏了) 使用JSP-->
    <!-- 默认的视图解析器 在上边的解析错误时使用 (默认使用html)- -->
    <bean id="defaultViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
        <property name="prefix" value="/WEB-INF/WebContent/"/><!--设置JSP文件的目录位置-->
        <property name="suffix" value=".jsp"/>
        <property name="exposeContextBeansAsAttributes" value="true"/>
    </bean>

    <!-- 自动扫描装配 -->
    <context:component-scan base-package="com.example.controller"/>
</beans>

5、打开并编辑“applicationContext.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"
       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">
    <context:component-scan base-package="cn.example"/>
</beans>

【配置 springMVC 之 java 配置】

1、在 java 文件夹中新建一个包“cn.example.config”。

2、在 config 中新建三个文件。

(1)WebXml.java,代替 web.xml。

(2)DispatcherServletXml.java,代替 dispatcher-servle.xml。

(3)ApplicationContextXml.java,代替 applicationContext.xml。

3、编辑 WebXml.java 文件。(代码中注释的目的是说明该方法替换了哪些 xml 标签,内容取自本文参考文章)

package cn.example.config;

import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;

public class WebXml extends AbstractAnnotationConfigDispatcherServletInitializer {
    /*
        <!--把applicationContext.xml加入到配置文件中-->
        <context-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>/WEB-INF/applicationContext.xml</param-value>
        </context-param>
        <listener>
            <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
        </listener>
      */
    @Override
    protected Class<?>[] getRootConfigClasses() {
        return new Class<?>[] {ApplicationContextXml.class};
    }

    /*
        <!--配置springmvc DispatcherServlet-->
        <servlet>
            <servlet-name>springMVC</servlet-name>
            <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
            <init-param>
                <!--配置dispatcher.xml作为mvc的配置文件-->
                <param-name>contextConfigLocation</param-name>
                <param-value>/WEB-INF/dispatcher-servlet.xml</param-value>
            </init-param>
            <load-on-startup>1</load-on-startup>
            <async-supported>true</async-supported>
        </servlet>
     */
    @Override
    protected Class<?>[] getServletConfigClasses() {
        return new Class<?>[] {DispatcherServletXml.class};
    }

    /*
        <servlet-mapping>
            <servlet-name>springMVC</servlet-name>
            <url-pattern>/</url-pattern>
        </servlet-mapping>
     */
    @Override
    protected String[] getServletMappings() {
        return new String[] {"/"};
    }
}

4、编辑 DispatcherServletXml.java 文件。(代码中注释的目的是说明该方法替换了哪些 xml 标签,内容取自本文参考文章)

package cn.example.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.ViewResolver;
import org.springframework.web.servlet.config.annotation.*;
import org.springframework.web.servlet.view.InternalResourceViewResolver;

@Configuration
@EnableWebMvc
/*
    <!-- 自动扫描装配 -->
    <context:component-scan base-package="cn.example.controller"/>
*/
@ComponentScan("cn.example.controller")
public class DispatcherServletXml implements WebMvcConfigurer {
    /*
        <!-- 对模型视图名称的解析,即在模型视图名称添加前后缀(如果最后一个还是表示文件夹,则最后的斜杠不要漏了) 使用JSP-->
        <!-- 默认的视图解析器 在上边的解析错误时使用 (默认使用html)- -->
        <bean id="defaultViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
            <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
            <property name="prefix" value="/WEB-INF/WebContent/"/><!--设置JSP文件的目录位置-->
            <property name="suffix" value=".jsp"/>
            <property name="exposeContextBeansAsAttributes" value="true"/>
        </bean>
     */
    @Bean
    public ViewResolver viewResolver() {
        InternalResourceViewResolver resolver = new InternalResourceViewResolver();
        resolver.setViewClass(org.springframework.web.servlet.view.JstlView.class);
        resolver.setPrefix("/WEB-INF/WebContent/");
        resolver.setSuffix(".jsp");
        resolver.setExposeContextBeansAsAttributes(true);
        return resolver;
    }

    @Override
    public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
        configurer.enable();
    }

    // 静态资源配置
    /*
        <mvc:resources mapping="css/**" location="/WEB-INF/WebContent/css/"/>
        <mvc:resources mapping="/js/**" location="/WEB-INF/WebContent/js/"/>
        <mvc:resources mapping="/images/**" location="/WEB-INF/WebContent/images/"/>
     */
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/css/**").addResourceLocations("/WEB-INF/WebContent/css/");
        registry.addResourceHandler("/js/**").addResourceLocations("/WEB-INF/WebContent/js/");
        registry.addResourceHandler("/images/**").addResourceLocations("/WEB-INF/WebContent/images/");
    }
}

5、编辑 ApplicationContextXml.java 文件。(代码中注释的目的是说明该方法替换了哪些 xml 标签)

package cn.example.config;

import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.FilterType;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;

@Configuration
/*
    <context:component-scan base-package="cn.example"/>
*/
@ComponentScan(basePackages = {"cn.example"},
        excludeFilters = {
                @ComponentScan.Filter(type = FilterType.ANNOTATION, value = EnableWebMvc.class)
        })
public class ApplicationContextXml {
}

【示例】

1、在 java 文件夹中新建 Package。

2、输入“cn.example.controller”。

3、在“cn.example.controller”中新建一个 Java Class文件,文件名随意取,但最好有点标志,如“IndexController”。

4、编辑“IndexController.java”,代码如下。其中有两个方法,方法名不重要,重要的是注解中的value,代表访问的网址,return 的值则是在“WebContent/WEB-INF/WebContent/”文件夹中,加上“.jsp”后缀找到的文件(“dispatcher-servlet.xml”文件中 id="defaultViewResolver" 的 bean 中配置的)。注解中的 method 可以根据需求修改,这里可以删掉。

package cn.example.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

@Controller
public class IndexController {

    @RequestMapping(value = "/", method = RequestMethod.GET)
    public String index() {
        return "index";
    }

    @RequestMapping(value = "/index", method = RequestMethod.GET)
    public String indexPage() {
        return "index";
    }
}

5、我们在 WebContent 文件夹中根据需要新建几个文件夹 css、js、images,再新建一个 jsp 文件,取名“index.jsp”。在 css 文件夹中新建一个 css 文件“index.css”。

6、编辑 index.css 文件。

p{
    font-size: 100px;
    color: red;
}

7、编辑 index.jsp 文件,其中 href 中用的是 jstl 标签,因此需要在顶部加入 taglib 标签引入 jstl。

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
    <title>Title</title>
    <link rel="stylesheet" type="text/css" href="<c:url value='/css/index.css'/>" />
</head>
<body>
<p>Hello World</p>
</body>
</html>

经测试,这么写也完全 OK。

<link rel="stylesheet" type="text/css" href="css/index.css" />

8、启动 Tomcat。

9、运行成功。

【注意事项】

1、我们新建 maven 项目时直接在 webapp 文件夹中创建了一个 index.jsp,当我们在 webapp/WEB-INF/WebContent 中创建index.jsp 时,记得把它自动创建的 index.jsp 删去。(按道理说,不删的话也不会有事,但是实际运行中却加载到了那个自动创建的 index.jsp 页面中,不明觉厉)

2、在从 xml 切换到 Java Config 的过程中,记得打开 Project Structure,将 Module 中的 Spring 的 xml 配置删去。并且在项目路径中,将对应的 xml 文件删去(反正不能在WEB-INF里面了,不然会报"check whether you have multiple ContextLoader* definitions in your web.xml"错误)