zoukankan      html  css  js  c++  java
  • 在 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 srccodereadservletDemoServlet.java

    出现了编码错误:

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

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

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

    javac -encoding utf-8 srccodereadservletDemoServlet.java

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

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

    我们再次求助 help:

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

    3.1.3 带上 classpath 再次执行命令:

    javac -encoding utf-8 -cp libjavax.servlet-api-3.1.0.jar srccodereadservletDemoServlet.java

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

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

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

    javac -encoding utf-8 -cp libjavax.servlet-api-3.1.0.jar -d build srccodereadservletDemoServlet.java
    

    但是还是一点小问题:

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

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

    javac -encoding utf-8 -cp libjavax.servlet-api-3.1.0.jar -d build srccodereadservletDemoServlet.java
    

    3.2 使用 IDEA 编译

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

    1. File -> Project Structure 打开窗口
    2. 在窗口左侧菜单中,找到 Libraries,并选中
    3. 点击 + ,弹出 New Project Library,选中 Java,弹出文件夹选择框
    4. 选择 javac-servletlib 所在的完整路径,点击 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 目录到 Tomcatwebapps 目录下:

    6 启动 Tomcat

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

    7 浏览器访问

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

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

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

    8 查看 Tomcat 日志

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

    参考博客

    Servlet与Tomcat运行示例

  • 相关阅读:
    AE二次开发,解决子窗体使用父窗体的AxControl控件
    ArcEngine二次开发中运行出现There is no Spatial Analyst license currently available or enabled.
    Js网站开发学习第一天
    Winform开发1
    MySql安装
    Windows ping加时间戳
    XML特性总结
    linux手册中函数名后小括号中数字的含义
    TCP通信
    swap交换分区概念
  • 原文地址:https://www.cnblogs.com/kendoziyu/p/deploy-first-servlet-app-into-tomcat.html
Copyright © 2011-2022 走看看