在 Tomcat 上部署你的第一个 Servlet 应用

写在前面

Java Servlet 是 J2EE 规范中一项关于 Web 应用的规范。Tomcat 则是实现 Java Servlet 规范的一个开源项目。本文将一步步创建一个最简单的 Servlet 项目,并且部署到 Tomcat 上。

项目地址

git clone https://gitee.com/kendoziyu/code-servlet-parent

该目录下的 javac-servlet 表示的是本文的项目。

基于web.xml开发步骤

  1. 下载、安装 Tomcat。
  2. 编写一个继承 HTTPServlet 的 Java 类MyServlet。
  3. 将 Java 类文件编译成 Class 文件。
  4. 建立 Web 应用的目录结构,并配置 web.xml。
  5. 部署 Web 应用。
  6. 启动 Tomcat。
  7. 浏览器访问验证结果。
  8. 查看 Tomcat 日志。

1 下载、安装Tomcat

去Tomcat官网(Download Tomcat 9) 下载最新的Tomcat(需下载对应系统版本,请根据实际情况选择,本文以Windows系统为例)。

下载完成之后解压即可。

Windows 解压 zip 包得到 tomcat 目录效果图,展开查看

2 编写DemoServlet类

Servlet 并不是 JDK 中自带的,属于拓展包,因此需要额外下载 jar 包,这里是官方下载地址 Servlet3.1

编写一个DemoServlet类,其继承HttpServlet类,并复写其doGet()和doPost()方法。

package coderead.servlet;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;

/**
 * Java Servlet 示例1
 *
 * @author kendoziyu
 * @since 2020/10/21
 */
public class DemoServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("DemoServlet 在处理 get 请求...");
        PrintWriter out = resp.getWriter();
        resp.setContentType("text/html;charset=utf-8");
        out.println("<strong>doGet Demo Servlet!</strong><br>");
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("DemoServlet 在处理 post 请求...");
        PrintWriter out = resp.getWriter();
        resp.setContentType("text/html;charset=utf-8");
        out.println("<strong>doPost Demo Servlet!</strong><br>");
    }
}

我们可以查看一下 HttpServlet 的继承结构,因为选择 HttpServlet 实现类就不需要我们来实现 Servlet 接口了,毕竟那不是本文的重点。

3 编译DemoServlet

下图展示的是我的项目目录

3.1 命令行编译

接着要要在当前项目目录进行编译

展开查看 逐步解决javac编译中出现的错误

3.1.1 首先,尝试直接使用命令 javac 目标java文件路径

javac src\coderead\servlet\DemoServlet.java

出现了编码错误:

我们需要求助于javac -help 查看更多参数细节。

 -encoding <编码> 指定源文件使用的字符编码

3.1.2 接着,我们指定一下源文件的字符编码,重新编译

javac -encoding utf-8 src\coderead\servlet\DemoServlet.java

编译失败,查找不到 javax.servlet 下的文件,异常如下:


src\coderead\servlet\DemoServlet.java:3: 错误: 程序包javax.servlet不存在
import javax.servlet.ServletException;
                    ^
src\coderead\servlet\DemoServlet.java:4: 错误: 程序包javax.servlet.http不存在
import javax.servlet.http.HttpServlet;
                         ^
src\coderead\servlet\DemoServlet.java:5: 错误: 程序包javax.servlet.http不存在
import javax.servlet.http.HttpServletRequest;
                         ^
src\coderead\servlet\DemoServlet.java:6: 错误: 程序包javax.servlet.http不存在
import javax.servlet.http.HttpServletResponse;
                         ^
src\coderead\servlet\DemoServlet.java:16: 错误: 找不到符号
public class DemoServlet extends HttpServlet {
                                 ^
  符号: 类 HttpServlet
src\coderead\servlet\DemoServlet.java:19: 错误: 找不到符号
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
                         ^
  符号:   类 HttpServletRequest
  位置: 类 DemoServlet
src\coderead\servlet\DemoServlet.java:19: 错误: 找不到符号
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
                                                 ^
  符号:   类 HttpServletResponse
  位置: 类 DemoServlet
src\coderead\servlet\DemoServlet.java:19: 错误: 找不到符号
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
                                                                                  ^
  符号:   类 ServletException
  位置: 类 DemoServlet
src\coderead\servlet\DemoServlet.java:27: 错误: 找不到符号
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
                          ^
  符号:   类 HttpServletRequest
  位置: 类 DemoServlet
src\coderead\servlet\DemoServlet.java:27: 错误: 找不到符号
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
                                                  ^
  符号:   类 HttpServletResponse
  位置: 类 DemoServlet
src\coderead\servlet\DemoServlet.java:27: 错误: 找不到符号
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
                                                                                   ^
  符号:   类 ServletException
  位置: 类 DemoServlet
src\coderead\servlet\DemoServlet.java:18: 错误: 方法不会覆盖或实现超类型的方法
    @Override
    ^
src\coderead\servlet\DemoServlet.java:26: 错误: 方法不会覆盖或实现超类型的方法
    @Override
    ^
13 个错误

我们再次求助 help:

 -classpath <路径>   指定查找用户类文件和注释处理程序的位置
 -cp <路径>          指定查找用户类文件和注释处理程序的位置

3.1.3 带上 classpath 再次执行命令:

javac -encoding utf-8 -cp lib\javax.servlet-api-3.1.0.jar src\coderead\servlet\DemoServlet.java

但是输出文件 DemoServlet.class 和源文件 DemoServlet.java 在同一文件夹下又有些不妥,于是我们希望指定输出目录

 -d <目录>  指定放置生成的类文件的位置

3.1.4 指定输出目录为 build 后,再次执行命令

javac -encoding utf-8 -cp lib\javax.servlet-api-3.1.0.jar -d build src\coderead\servlet\DemoServlet.java

但是还是一点小问题:

我们自己在项目根目录下 创建一下 build 目录 就好了

然后,我们执行以下命令,即可对 DemoServlet 进行编译:

javac -encoding utf-8 -cp lib\javax.servlet-api-3.1.0.jar -d build src\coderead\servlet\DemoServlet.java

3.2 使用 IDEA 编译

首先需要引入 lib 包,步骤如下:

  1. File -> Project Structure 打开窗口
  2. 在窗口左侧菜单中,找到 Libraries,并选中
  3. 点击 + ,弹出 New Project Library,选中 Java,弹出文件夹选择框
  4. 选择 javac-servlet\lib 所在的完整路径,点击 Ok

这种情况下,只要点击
Build -> Build Project 就能自动编译生成 .class 文件了,输出文件默认在根目录 out 文件夹的子文件夹下面可以找到。

4 建立 Web 应用目录

我们选择再项目根目录下创建 DemoWebapp 目录,按照惯例,目录结构如下:

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"
         metadata-complete="true">

    <description> Servlet Example. </description>
    <display-name> DemoServlet Example </display-name>
    <request-character-encoding>UTF-8</request-character-encoding>

    <servlet>
        <servlet-name>demoServlet</servlet-name>
        <servlet-class>coderead.servlet.DemoServlet</servlet-class>
    </servlet>

    <servlet-mapping>
        <servlet-name>demoServlet</servlet-name>
        <url-pattern>/demo</url-pattern>
    </servlet-mapping>

</web-app>

5 部署 DemoWebapp

拷贝上一步完成的 DemoWebapp 目录到 Tomcat\webapps\ 目录下:

6 启动 Tomcat

找到 Tomcat 安装目录下的 bin 目录,如果是 Windows 系统,执行 startup.bat;如果是 Linux 系统,则执行 startup.sh

7 浏览器访问

在浏览器里访问这个 URL: http://localhost:8080/DemoWebapp/demo

  • DemoWebapp 表示 tomcat\webapps</span> 下的文件夹名称
  • demo 表示 web.xml 文件配置的映射地址:<servlet-mapping><url-pattern> 对应的路径

同样,post方式调用也会得到相类似的结果!

8 查看 Tomcat 日志

在 Linux 系统下,我们可以看下 tomcat/logs/catalina.out 文件,使用以下命令查看相应的日志。
在 Windows 系统下,刚才 startup.bat 会调起一个工作台窗口,这个工作台输出一些日志:

参考博客

Servlet与Tomcat运行示例

posted @ 2020-10-21 14:03  极客子羽  阅读(1448)  评论(0编辑  收藏  举报