一 . 创建项目
1 . 创建一个 maven 项目
2 . 创建好 maven 项目的目录结构
3 . 观察 maven 的控制面板
二 . 引入依赖
4 .Maven 项目创建完毕后, 会自动生成一个 pom.xml 文件. 我们需要在 pom.xml 中引入 Servlet API 依赖的 jar 包 , 需要在maven 的中央仓库去下载。
maven中央仓库:下载地址!
此处我们一般选择 3. 1 版本的进行下载 (注意这里的版本要匹配jdk8;tomcat8.5,servlet3.1)
复制下面这段代码到 idea 中的 pom.xml 中
首先需要在 pom.xml 中创建 标签对 ,然后将复制好的Servlet坐标依赖进行粘贴进标签对中 , 该标签对中也可存放多个依赖 。
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<!-- servlet 版本和 tomcat 版本有对应关系,切记 -->
<version>3.1.0</version>
<!-- 这个意思是我们只在开发阶段需要这个依赖,部署到 tomcat 上时就不需要了 -->
<scope>provided</scope>
</dependency>
首次使用 maven 时 ,可能会爆红 ,需要手动刷新进行导入
此时我们 maven 项目的相关依赖已经成功导入
附 : 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>org.example</groupId>
<artifactId>demo_project</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
</dependencies>
</project>
三 . 创建目录
创建maven 项目的时候虽然已经自动创建了一些目录,但是使用maven开发web项目还需要借助一个目录即 webapp目录 。
1 . 在 main 目录下单独创建一个webapp 目录
2 . 在webapp中创建WEB-INF目录 , 并在下边新建一个 web.xml
3 . 给 web.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>
</web-app>
导入指定代码之后,可能会出现代码爆红的现象,但是此处的爆红并不会影响后续的操作
四 . 编写代码
在 java 目录下方创建一个 helloservlet 类, 并使该类继承自 HttpServlet 类,并重写相关的方法
这些方法是 Servlet api 中HttpServlet 提供的针对不同的响应和请求使用的 , 当 tomcat 收到了 get 请求就会调用此处的doGet( ) 方法 。
- doGet()
doGet 的参数有两个, 分别表示收到的 HTTP 请求 和要构造的 HTTP 响应. 这个方法会在Tomcat收到GET请求时触发 .
- req 是 tomcat 针对请求 ,已经解析好,构造好了的
- resp则是一个空的对象(无属性的对象)
重写doGet() 方法
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("hello");
resp.getWriter().write("hello");
}
-
resp.getWriter()会获取到一个流对象,获取到的对象会可以使用 write() 方法写入一些数据,写入的数据就会被构造成一个 http 响应的 body 部分 ,tomcat 就会将响应转化为字符串然后返回给浏览器 。
-
添加注解
注解是一中语法糖 , 通常的作用是针对某一个类/方法 ,进行额外的解释说明,赋予这个类/方法一种额外的功能/ 含义 , 此处的注解是当前的类和 http 请求的路径关联起来,路径与 servlet 类之间是一对一的关系 。
五 . 打包程序
常见的 .class 构成的压缩包使用的是 .jar 包,但是此处我们需要使用.war包,一种 tomcat 专属的用来描述 webapp 的程序 , 一个war 包就是一个 webapp , 默认情况下 maven 打的是 jar 包, 所以需要向 pom.xml 中添加以下配置程序:
<packaging>war</packaging>
<build>
<finalName>hello</finalName>
// 此处的 finalName 指的是打包后的名字,如果为空则默认使用artifactId+version来作为打包后的名称
</build>
配置程序修改完成之后,需要使用 package 进行打包 。
双击 package , 当出现 BUILD SUCCESS 时打包完成 。
六 . 部署
把 war 包拷贝到 Tomcat 的 webapps 目录下
找到tomcat 目录下的startup.bat启动tomcat
显示如下字样则启动成功
七 . 验证程序
在浏览器中输入相对应的地址
http://127.0.0.1:8080/hello/helloservlet
这里的第一个 hello 指的是 context-path 第二个 helloservlet 指的是 Servlet path , 下图当中上方指的是 servlet path 下方指的是 context path
上述七个步骤是针对一个新的项目来设计的, 当项目创建好了之后,后续只需要修改代码,前三个步骤就可以省略了;从4-7即可;重新部署的时候,不一定需要重启tomcat;
刚才在浏览器输入 url 之后 ,浏览器就构造了一个 对应的 http GET请求,发给了tomcat , tomcat就根据第一级路径确定了具体的 webapp ,根据第二季路径就确定了具体调用的是哪一个类 。
八 . smart tomcat使用
有没有什么能够解决掉打包部署的方法呢?当然
使用 idea 的插件可以省略掉5 . 6 步骤 , 下面我们介绍一下 idea 当中的插件 smart tomcat 的用法 。
step1、打开idea,file->settings->plugin;在搜索栏搜索smart tomcat;
step2、第一次使用需要配置一下 , 设置一下相关的参数
设置完毕之后 , apply 后 ok 即可 。
点击导航栏中的 三角按钮 , 即可开始运行 , 这里的smart tomcat 是通过另一种方式来启动 tomcat 的 ,部署的程序效果与打包后再部署相同
idea 直接调用 tomcat ,让 tomcat 加载当前项目中的目录,这个过程没有打 war 包,也没有拷贝,更没有解压缩 。
上述的两种部署,其实是 tomcat 的两种运行方式 ,
- 如果是直接拷贝 war 包进行部署 ,context path 就是war包名
- 如果是使用 smart tomcat 方式进行部署,则一级路径 context path是可以进行配置的,默认情况下就是项目名。
九 . 错误分析
-
出现 404
- 路径错误
检查 url 中的 content-path , servlet-path 等相关路径 。
-
webapp 没有被正确部署
web.xml 内容错了 , 文件名错了, 文件路径错了等
- 出现 405
比如浏览器发送了一个 get 请求 , 但是代码中没有重写 doGet() 方法 , 并且super.doGet()没有删除的情况下就会出现 405
-
出现500 ,代码抛出异常了
-
出现空白页面 : 没有写resp.getWriter().write;
-
出现无法访问此网站 , tomcat 没有启动