一、环境介绍
idea版本: IntelliJ IDEA 2019.3.3 x64
jdk版本:如果不知道自己装了什么版本,可以使用cmd窗口输入 java -version 命令就可以看到对应的版本号
java version "1.8.0_121"
Java(TM) SE Runtime Environment (build 1.8.0_121-b13)
Java HotSpot(TM) 64-Bit Server VM (build 25.121-b13, mixed mode)
是否联网:是 也可以在不联网的环境下使用,我这里联网主要使用了idea的工程创建功能,在工程创建中需要联网下载最新的 spring MVC 包;
操作系统:Windows10 64位
tomcat版本:apache-tomcat-9.0.1-windows-x64
注:这里我简单说一下tomcat版本和java版本的关系,在查找关系的时候一定要看tomcat官网,现在网上的资料真的是~,【嗯嗯 不吐槽,专心写】,之前通过网上查看资料有博主说tomcat9支持jdk8之前的所有版本,但是我在建立工程的时候会报一些协议不匹配的问题,其实就是jdk版本和tomcat版本不匹配,高级版本的tomcat实现的协议本版也比较高,查看tomcat和jdk版本的关系的官网地址:http://tomcat.apache.org/whichversion.html,对应关系内容如下,协议实现的具体解释还是去官网查看, 强烈推荐优先使用官网查资料,不然有些信息在你第一次获取的时候就是错的,这样很伤,有的问题非常难找。
Servlet Spec | JSP Spec | EL Spec | WebSocket Spec | Authentication (JASIC) Spec | Apache Tomcat Version | Latest Released Version | Supported Java Versions |
---|---|---|---|---|---|---|---|
5.0 | 3.0 | 4.0 | 2.0 | 2.0 | 10.0.x | 10.0.0-M4 (alpha) | 8 and later |
4.0 | 2.3 | 3.0 | 1.1 | 1.1 | 9.0.x | 9.0.34 | 8 and later |
3.1 | 2.3 | 3.0 | 1.1 | 1.1 | 8.5.x | 8.5.54 | 7 and later |
3.1 | 2.3 | 3.0 | 1.1 | N/A | 8.0.x (superseded) | 8.0.53 (superseded) | 7 and later |
3.0 | 2.2 | 2.2 | 1.1 | N/A | 7.0.x | 7.0.103 | 6 and later (7 and later for WebSocket) |
2.5 | 2.1 | 2.1 | N/A | N/A | 6.0.x (archived) | 6.0.53 (archived) | 5 and later |
2.4 | 2.0 | N/A | N/A | N/A | 5.5.x (archived) | 5.5.36 (archived) | 1.4 and later |
2.3 | 1.2 | N/A | N/A | N/A | 4.1.x (archived) | 4.1.40 (archived) | 1.3 and later |
2.2 | 1.1 | N/A | N/A | N/A | 3.3.x (archived) | 3.3.2 (archived) | 1.1 and later |
二、工程创建过程
使用过程我尽量写的详细一点,以免漏掉坑没有说明白:
使用idea,File—》new—》project,会出现如下界面:
我选择使用idea自带的创建工具创建工程,这个自带的工具创建过程需要联网,从网上下载包,网络不好的情况下包可能会下载不成功,像上图中选择spring—》勾选spring MVC,点击下一步,给自己的工程起一个名字选择保存路径,我使用的名字是myfirstMVC;
点击Finish就会出现从网上下载包,准备工程界面,我的网速还行,下载过程持续2分钟左右,如果不能联网或者下载失败的朋友,下篇我会介绍离线环境下建立工程。
工程建立完成之后,如下图,我这个是测试后的,可能会有点不一样,不过没关系:
在src下建立control包,在control下新建一个测试用的controler类,我的名字用IndexController内容如下:
package control;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@Controller
public class IndexController {
@RequestMapping("/index")
public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception{
ModelAndView model=new ModelAndView("index");
model.addObject("message","这是第一个SpringMVC网页");
return model;
}
}
在WEB-INF目录下新建一个page目录,保存静态资源,在page目录下面新建一个jsp文件,命名为index.jsp,
jsp文件内容如下:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>SpringMVC</title>
</head>
<body>
<h1>测试</h1>
<h1>${message}</h1>
</body>
</html>
然后配置servlet,在web.xml中添加配置:
<?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">
<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>
<listener>
<listener-class>com.sun.xml.ws.transport.http.servlet.WSServletContextListener</listener-class>
</listener>
<servlet>
<servlet-name>dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet>
<description>JAX-WS endpoint</description>
<display-name>WSServlet</display-name>
<servlet-name>WSServlet</servlet-name>
<servlet-class>com.sun.xml.ws.transport.http.servlet.WSServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet>
<!-- 两个HelloMVC必须一样,随意自己取名-->
<servlet-name>HelloMVC</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<url-pattern>*.form</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>WSServlet</servlet-name>
<url-pattern>/services/*</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>HelloMVC</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
上面的配置中增加了下面两个配置,这两个配置是成对的,
<servlet>
<!-- 两个HelloMVC必须一样,随意自己取名-->
<servlet-name>HelloMVC</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>HelloMVC</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
然后再WEB-INF下建立一个HelloMVC-servlet.xml文件,对应servlet配置,
文件内容如下:
<?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="control"/>
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!-- /WEB-INF/page/意为页面的路径,.jsp为页面格式-->
<property name="prefix" value="/WEB-INF/page/"/>
<property name="suffix" value=".jsp"/>
</bean>
</beans>
文件按写完了目录结构如下:
下面就是关键啦,开始调试、部署:
应该是先配置工程的project structure,这里我先不配,再下面我会介绍project structure常用项的功能
点下面的配置,进行调试运行相关配置:
再界面中点击左边的加号,新建一个tomcat:
然后在下面的界面中,配置运行环境
1先配置tomcat容器根目录
2配置端口号
3部署配置
第3步部署配置如下,context使用根目录就行:
好啦配置tomcat结束,咱们先启动看看,能不能起来。肯定是不行的啦,报错如下:
[2020-04-25 11:27:35,567] Artifact untitled:war exploded: Artifact is being deployed, please wait...
25-Apr-2020 11:27:36.715 严重 [RMI TCP Connection(3)-127.0.0.1] org.apache.catalina.core.StandardContext.startInternal One or more listeners failed to start. Full details will be found in the appropriate container log file
25-Apr-2020 11:27:36.721 严重 [RMI TCP Connection(3)-127.0.0.1] org.apache.catalina.core.StandardContext.startInternal Context [] startup failed due to previous errors
[2020-04-25 11:27:36,778] Artifact untitled:war exploded: Error during artifact deployment. See server log for details.
25-Apr-2020 11:27:45.300 信息 [ContainerBackgroundProcessor[StandardEngine[Catalina]]] org.apache.catalina.startup.HostConfig.deployDirectory Deploying web application directory [F:\apache-tomcat-9.0.1\webapps\manager]
25-Apr-2020 11:27:45.502 信息 [ContainerBackgroundProcessor[StandardEngine[Catalina]]] org.apache.catalina.startup.HostConfig.deployDirectory Deployment of web application directory [F:\apache-tomcat-9.0.1\webapps\manager] has finished in [201] ms
基本意思已经很明显了,就是再部署的时候出现问题,外部容器没能找到你部署的东西,这个是怎么回事,简单来说就是spring MVC没有内置容器,需要借助外部容器才能运行起来,然而刚才咱们的配置并不能使外部容器也就是tomcat9找到对应的文件,或者类库,所以要通过部署配置让外部容器知道你的项目结构和内容,这个配置也就是idea的project structure配置下面我介绍下这个配置的配置方法和作用;
重点来啦:project structure配置
点击idea右上角的project structure
出现如下界面
上图的project功能标签如下:
1主要配置本机的jdk版本,
2主要配置和jdk对应的project language level
3是你的工程编译输出目录 这个和部署调试没有关系!!!!素所以无所谓,你自己找个目录就行了
module标签主要配置和组件相关的编译路径,一个工程可以有好多module,可以为不同的module配置编译数据路径
这个地方source使用默认配置就行,
path可以使用和主工程相同的目录,也可以为单个module配置输出路径
dependencies这个主要用于添加module的依赖项,在工程中一般会添加tomcat的lib目录,就是这个F:\apache-tomcat-9.0.1\lib目录,然后就是添加工程的其他依赖类包,这里我建议使用maven管理类包资源,这样非常方便,有兴趣的朋友可以在网上找找资源看一下,我这里应为是演示,所以就不配置了
下一项是libiaries这个也是添加外部依赖包用的
facets这个个可以配置工程的servlet配置文件
下一个就是和调试部署最相关的东西了artifacts
这个界面在最开始的时候可能是空的,点击+号,可以添加,这里我们使用Exploded中的From Modules,有的朋友可能没有From Modules ,这个是因为在第二个界面中没有建立Modules,建完就好了
建立完成之后,我们看界面上,界面分为3个区
1就是工程部署目录
2是部署目录中包含哪些内容,
3是可以在部署目录中添加的依赖
1区工程部署目录,这个部署目录不一定是tomcat的webapps目录,也可以是自己的目录,在使用idea调试时这个也是可以的,我使用了工程默认的web目录
2区部署目录中包含的内容,这个很关键啊!!!!!!!!!一般的时候新建artifacts在WEB-INF下只有classes目录,这里我们需要建立一个lib文件夹,像上面那样,这个必须有,这个目录下面放的东西就是我们的外部依赖包
3区中部署的工程中可用依赖项,我们在2区选中lib,在这个区中双击,就可以将依赖包含到工程部署目录中。
配置完成图如下:
下面我们启动下看看。
好啦,可以访问和调试了!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
输出信息正常: