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


    一、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 项目

    • 菜单 -> 文件 -> 新建项目 -> Maven在这里插入图片描述
    • 选择项目要存放的目录
      在这里插入图片描述

    【说明】:

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

    2.2 引入依赖

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

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

    • 把中央仓库中提供的 xml 复制到项目的 pom.xml 中
      在这里插入图片描述
    • 在pom.xml中创建一个dependencies标签,将中央仓库中提供的 xml 复制到这对标签中
      在这里插入图片描述
    • < dependencies > 标签内部放置项目依赖的 jar 包. maven 会自动下载依赖到本地
    • 首次引入依赖的jar包,需要刷新下载
      在这里插入图片描述

    2.3 创建目录

    • 创建webapp目录
      在 main 目录下, 和 java 目录并列, 创建一个 webapp 目录
      在这里插入图片描述
    • 创建web.xml
      然后在 webapp 目录内部创建一个 WEB-INF 目录, 并创建一个 web.xml 文件
      在这里插入图片描述
    • 编写 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>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    这里面的内容我们不需过多关注,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");
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 创建一个类 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 即可进行打包.
    在这里插入图片描述

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

    双击package,就会把package前面的几步都执行
    打包成功,控制台会出现如下字样
    在这里插入图片描述
    打包成功后, 可以看到在 target 目录下, 生成了一个 jar 包.
    在这里插入图片描述
    这样的 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
    在这里插入图片描述

    【修改配置文件,打包出一个war包】
    在这里插入图片描述
    重新使用 maven 打包, 可以看到生成的新的 war 包的结果.
    在这里插入图片描述

    2.6 部署程序

    把 war 包拷贝到 Tomcat 的 webapps 目录下.
    在这里插入图片描述
    启动 Tomcat , Tomcat 就会自动把 war 包解压缩.
    在这里插入图片描述
    在这里插入图片描述

    2.7 验证程序

    此时通过浏览器访问 http://127.0.0.1:8080/hello_servlet/hello
    在这里插入图片描述
    【Content Path与 Servlet Path】

    URL 中的 PATH 分成两个部分,其中hello_servlet是Content Path,hello为Servlet Path
    Content Path由部署在webapps目录下的war包名决定的
    在这里插入图片描述
    Servlet Path是代码注解中的写的路径
    在这里插入图片描述

    【补充】:

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

    三、使用Smart Tomcat部署Servlet程序

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

    3.1 安装Smart Tomcat插件

    菜单 -> 文件 -> Settings,安装完毕之后, 会提示 “重启 IDEA”
    在这里插入图片描述

    3.2 配置Smart Tomcat插件并启动

    (1)点击右上角的 “Add Configuration”
    在这里插入图片描述

    (2)选择左侧的Smart Tomcat
    在这里插入图片描述
    (3)
    在这里插入图片描述
    (4)点击绿色的三角号, IDEA 就会自动进行编译, 部署, 并启动 Tomcat

    在这里插入图片描述

    在这里插入图片描述
    (5)访问页面

    在这里插入图片描述
    【注意】

    使用 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 代码中抛出异常导致的.
    在这里插入图片描述
    在这里插入图片描述
    在页面上已经有具体的异常调用栈.
    无法访问此网站:一般是 Tomcat 启动失败了
    Servlet Path写错可能导致Tomcat启动失败
    在这里插入图片描述>在这里插入图片描述

  • 相关阅读:
    我的idea安装的几个插件
    数据库事务
    探索Java面向对象编程的奇妙世界(四)
    【附源码】Python计算机毕业设计网上宠物商店系统
    TienChin 渠道管理-配置字典常量
    服务器远程桌面无法连接
    【Linux】GDB保姆级调试指南(什么是GDB?GDB如何使用?)
    DAY17-深度学习100例-卷积神经网络(CNN)识别眼睛状态
    用Flask构建一个AI翻译服务
    “一人企业”核心是需要一个”独一无二“的核心技能,然后把它产品化
  • 原文地址:https://blog.csdn.net/m0_60631323/article/details/127576149