Servlet(一):实现一个Servlet程序和使用Smart Tomcat部署Servlet程序

Servlet

  • 一、Servlet是什么
  • 二、实现一个Servlet程序
    • 2.1 创建项目
    • 2.2 引入依赖
    • 2.3 创建目录
    • 2.4 编写代码
    • 2.5 打包程序
    • 2.6 部署程序
    • 2.7 验证程序
  • 三、使用Smart Tomcat部署Servlet程序
    • 3.1 安装Smart Tomcat插件
    • 3.2 配置Smart Tomcat插件并启动

一、Servlet是什么

Servlet是一种实现动态页面的技术, 是一组 Tomcat 提供给程序猿的 API, 帮助程序猿简单高效的开发一个 web app(网站)

构建动态页面的技术有很多,每种语言都有一些相关的库/框架来做这件事
Servlet就是Tomcat这个HTTP服务器提供给Java的 一组API

【Servlet主要的工作】

  • 允许程序猿注册一个类, 在 Tomcat 收到某个特定的 HTTP 请求的时候, 执行这个类中的一些代码.
  • 帮助程序猿解析 HTTP 请求, 把 HTTP 请求从一个字符串解析成一个 HttpRequest 对象.
  • 帮助程序猿构造 HTTP 响应. 程序猿只要给指定的 HttpResponse 对象填写一些属性字段, Servlet 就会自动的安装 HTTP 协议的方式构造出一个 HTTP 响应字符串, 并通过 Socket 写回给客户端.

通俗来讲,Servlet是一组通过Tomcat提供的API,让我们自己写的代码和Tomcat配合起来,从而更简单的实现一个web app

二、实现一个Servlet程序

2.1 创建项目

使用 IDEA 创建一个 Maven 项目

  • 菜单 -> 文件 -> 新建项目 -> MavenServlet(一):实现一个Servlet程序和使用Smart Tomcat部署Servlet程序_第1张图片
  • 选择项目要存放的目录
    Servlet(一):实现一个Servlet程序和使用Smart Tomcat部署Servlet程序_第2张图片

【说明】:

  • Maven是一个"构建工具",针对代码进行依赖管理、编译、打包、验证、部署等功能。我们之前写的代码,在IDEA中直接点击"运行"就可以运行了,这是因为之前写的代码都比较简单,也不需要将代码打包部署给别人来用
  • 但如果是一个复杂的项目,依赖了很多的第三方库,同时自身还有很多的模块,模块之间也存在依赖关系,此时编译运行就没那么简单了,Maven可以视为是针对复杂项目进行管理的一个解决方案
  • maven自身支持的功能有很多,我们下面主要使用两个功能:管理依赖和打包
  • 管理依赖:如果在项目中想使用某个第三方库,就可以使用maven把这个库下载下来并导入到项目中
  • 打包:把我们的代码编译好,将.class文件打包成压缩包
  • maven项目的目录结构
    Servlet(一):实现一个Servlet程序和使用Smart Tomcat部署Servlet程序_第3张图片

2.2 引入依赖

Maven 项目创建完毕后, 会自动生成一个 pom.xml 文件.
我们需要在 pom.xml 中引入 Servlet API 依赖的 jar 包.

  • 在中央仓库 https://mvnrepository.com/ 中搜索 “servlet”
    Servlet(一):实现一个Servlet程序和使用Smart Tomcat部署Servlet程序_第4张图片
  • 选择版本. 一般我们使用 3.1.0 版本
    在这里插入图片描述

此处的Servlet 的版本要和 Tomcat 匹配.因为我使用 Tomcat 8.5, 那么就需要使用 Servlet 3.1.0

  • 把中央仓库中提供的 xml 复制到项目的 pom.xml 中
    Servlet(一):实现一个Servlet程序和使用Smart Tomcat部署Servlet程序_第5张图片
  • 在pom.xml中创建一个dependencies标签,将中央仓库中提供的 xml 复制到这对标签中
    Servlet(一):实现一个Servlet程序和使用Smart Tomcat部署Servlet程序_第6张图片
  • < dependencies > 标签内部放置项目依赖的 jar 包. maven 会自动下载依赖到本地
  • 首次引入依赖的jar包,需要刷新下载
    Servlet(一):实现一个Servlet程序和使用Smart Tomcat部署Servlet程序_第7张图片

2.3 创建目录

  • 创建webapp目录
    在 main 目录下, 和 java 目录并列, 创建一个 webapp 目录
    Servlet(一):实现一个Servlet程序和使用Smart Tomcat部署Servlet程序_第8张图片
  • 创建web.xml
    然后在 webapp 目录内部创建一个 WEB-INF 目录, 并创建一个 web.xml 文件
    Servlet(一):实现一个Servlet程序和使用Smart Tomcat部署Servlet程序_第9张图片
  • 编写 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>

这里面的内容我们不需过多关注,Tomcat 找到这个文件才能正确处理 webapp 中的动态资源.

2.4 编写代码

在 java 目录中创建一个类 HelloServlet, 代码如下:

import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet("/hello")
public class HelloServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("hello");
        resp.getWriter().write("hello");
    }
}
  • 创建一个类 HelloServlet , 继承自 HttpServlet
    HttpServlet来自于通过pom.xml,基于maven从中央仓库下载的jar包中

  • 在这个类上方加上 @WebServlet(“/hello”) 注解, 表示 Tomcat 收到的请求中, 路径为 /hello的请求才会调用 HelloServlet 这个类的代码. (这个路径未包含 Context Path)

  • 重写 doGet 方法. doGet 的参数有两个, 分别表示收到的 HTTP 请求 和要构造的 HTTP 响应. 这个方法会在 Tomcat 收到 GET 请求时触发

  • HttpServletRequest 表示 HTTP 请求. Tomcat 按照 HTTP 请求的格式把 字符串 格式的请求转成了一个 HttpServletRequest 对象. 后续想获取请求中的信息(方法, url, header, body 等) 都是通过这个对象来获取.

  • HttpServletResponse 表示 HTTP 响应. 代码中把响应对象构造好(构造响应的状态码, header, body 等)

  • resp.getWriter() 会获取到一个流对象, 通过这个流对象就可以写入一些数据, 写入的数据会被构造成一个 HTTP 响应的 body 部分, Tomcat 会把整个响应转成字符串, 通过 socket 写回给浏览器.

  • 我们的代码不是通过main方法作为入口,main方法已经被包含在Tomcat中了,我们写的代码会在合适的时机被Tomcat调用起来,我们写的代码只是Tomcat程序的一小部分逻辑

  • 能被Tomcat调用的类需要满足3个条件,创建的类需要继承自HttpServlet,这个类需要使用@WebServlet关联上一个HTTP路径,这个类需要实现doXXX方法

  • 配置路由:根据请求的路径,找到对应的类,在调用对应的doXXX方法的过程

2.5 打包程序

使用 maven 进行打包. 打开 maven 窗口 (一般在 IDEA 右侧就可以看到 Maven 窗口, 如果看不到的话, 可以通过 菜单 -> View -> Tool Window -> Maven 打开)
然后展开 Lifecycle , 双击 package 即可进行打包.
Servlet(一):实现一个Servlet程序和使用Smart Tomcat部署Servlet程序_第10张图片

补充:Lifecycle,生命周期的意思,一个Maven项目的生命周期分为下面这些阶段,分别为clean(清除上次编译生成的临时文件),validate(验证当前项目的合法性),compile(进行编译,.java->.class),package(打包),verify(进一步的确认),install(往目标上进行安装),site(部署到中央仓库)

双击package,就会把package前面的几步都执行
打包成功,控制台会出现如下字样
Servlet(一):实现一个Servlet程序和使用Smart Tomcat部署Servlet程序_第11张图片
打包成功后, 可以看到在 target 目录下, 生成了一个 jar 包.
Servlet(一):实现一个Servlet程序和使用Smart Tomcat部署Servlet程序_第12张图片
这样的 jar 包并不是我们需要的, Tomcat 需要识别的是另外一种 war 包格式.
另外这个 jar 包的名字太复杂了, 我们也希望这个名字能更简单一点.
【war 包和 jar 包的区别】

jar就是普通的java程序打包的结果,里面包含一些.class文件
war包时java web 的程序,里面除了包含.class文件之外,还会包含HTML,CSS,JavaScript,图片以及其他的jar包,打包成war包格式才能被Tomcat识别

【jar包名字的由来】

hello_servlet-1.0-SNAPSHOT.jar
Servlet(一):实现一个Servlet程序和使用Smart Tomcat部署Servlet程序_第13张图片

【修改配置文件,打包出一个war包】
Servlet(一):实现一个Servlet程序和使用Smart Tomcat部署Servlet程序_第14张图片
重新使用 maven 打包, 可以看到生成的新的 war 包的结果.
Servlet(一):实现一个Servlet程序和使用Smart Tomcat部署Servlet程序_第15张图片

2.6 部署程序

把 war 包拷贝到 Tomcat 的 webapps 目录下.
Servlet(一):实现一个Servlet程序和使用Smart Tomcat部署Servlet程序_第16张图片
启动 Tomcat , Tomcat 就会自动把 war 包解压缩.
在这里插入图片描述
Servlet(一):实现一个Servlet程序和使用Smart Tomcat部署Servlet程序_第17张图片

2.7 验证程序

此时通过浏览器访问 http://127.0.0.1:8080/hello_servlet/hello
Servlet(一):实现一个Servlet程序和使用Smart Tomcat部署Servlet程序_第18张图片
【Content Path与 Servlet Path】

URL 中的 PATH 分成两个部分,其中hello_servlet是Content Path,hello为Servlet Path
Content Path由部署在webapps目录下的war包名决定的
Servlet(一):实现一个Servlet程序和使用Smart Tomcat部署Servlet程序_第19张图片
Servlet Path是代码注解中的写的路径
Servlet(一):实现一个Servlet程序和使用Smart Tomcat部署Servlet程序_第20张图片

【补充】:

每次修改代码后,都需要重新打包部署,这是因为 Servlet程序的开发环境和运行环境是不同的
开发环境:是写代码的环境,项目目录
运行环境:执行程序的环境,Tomcat的目录
直接修改代码,只是针对开发环境做出了调整,务必要重新打包部署

三、使用Smart Tomcat部署Servlet程序

手动拷贝 war 包到 Tomcat 的过程比较麻烦. 我们还有更方便的办法.
此处我们使用 IDEA 中的 Smart Tomcat 插件完成这个工作.
插件就是对程序的一些特定场景, 做出一些特定的功能的扩展

3.1 安装Smart Tomcat插件

菜单 -> 文件 -> Settings,安装完毕之后, 会提示 “重启 IDEA”
Servlet(一):实现一个Servlet程序和使用Smart Tomcat部署Servlet程序_第21张图片

3.2 配置Smart Tomcat插件并启动

(1)点击右上角的 “Add Configuration”
Servlet(一):实现一个Servlet程序和使用Smart Tomcat部署Servlet程序_第22张图片

(2)选择左侧的Smart Tomcat
Servlet(一):实现一个Servlet程序和使用Smart Tomcat部署Servlet程序_第23张图片
(3)
Servlet(一):实现一个Servlet程序和使用Smart Tomcat部署Servlet程序_第24张图片
(4)点击绿色的三角号, IDEA 就会自动进行编译, 部署, 并启动 Tomcat

Servlet(一):实现一个Servlet程序和使用Smart Tomcat部署Servlet程序_第25张图片

Servlet(一):实现一个Servlet程序和使用Smart Tomcat部署Servlet程序_第26张图片
(5)访问页面

Servlet(一):实现一个Servlet程序和使用Smart Tomcat部署Servlet程序_第27张图片
【注意】

使用 Smart Tomcat 部署的时候, 我们发现 Tomcat 的 webapps 内部并没有被拷贝一个 war 包, 也没有看到解压缩的内容.
Smart Tomcat 相当于是在 Tomcat 启动的时候直接引用了项目中的 webapp 和 target目录.

【常见的出错信息】

404: 表示用户访问的资源不存在. 大概率是 URL 的路径写的不正确。可能少写了Content Path或Servlet Path 或Servlet Path写错 或 web.xml写错或没写
405: 表示对应的 HTTP 请求方法没有实现.通过浏览器发送get请求给服务器,但如果对应的服务器端没有实现doGet方法,会返回405,post请求也类似
500:往往是 Servlet 代码中抛出异常导致的.
Servlet(一):实现一个Servlet程序和使用Smart Tomcat部署Servlet程序_第28张图片
Servlet(一):实现一个Servlet程序和使用Smart Tomcat部署Servlet程序_第29张图片
在页面上已经有具体的异常调用栈.
无法访问此网站:一般是 Tomcat 启动失败了
Servlet Path写错可能导致Tomcat启动失败
Servlet(一):实现一个Servlet程序和使用Smart Tomcat部署Servlet程序_第30张图片>Servlet(一):实现一个Servlet程序和使用Smart Tomcat部署Servlet程序_第31张图片

你可能感兴趣的:(servlet,tomcat,java)