【本文适用读者】
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行有一个 <mirrors> 标签(如果没有则可能是因为版本不同,导致行号有变,请自行查找其位置)。在 <mirrors> 标签中加入代码块:
<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 root>就是上面的 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、找到 <dependencies> 标签
3、在 <dependencies> 标签中增加 <dependency> 标签,具体代码如下:
<!-- 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"错误)。