锋盈数科-知识库 Logo
首页
软件开发
计算机基础
Hello Halo
新手必读
关于本知识库
登录 →
锋盈数科-知识库 Logo
首页 软件开发 计算机基础 Hello Halo 新手必读 关于本知识库
登录
  1. 首页
  2. 软件开发
  3. ServletAPI详解(一)

ServletAPI详解(一)

0
  • 软件开发
  • 发布于 2024-09-19
  • 0 次阅读
黄健
黄健

目录

1.Tomcat简介

2.Servlet 是什么?

3.编写Servlet 程序步骤

1.创建一个Maven项目

2.引入依赖

3.创建目录

4.编写代码

5.打包程序

6.部署程序

7.验证程序

4.使用SmartTomcat插件部署



1.Tomcat简介

Tomcat是一个开源的,基于java实现的被广泛使用的web服务器.web服务器是一个应用程序,对HTTP协议进行封装,使得程序员不必直接对协议进行操作,让web开发更简洁高效

官网:https://tomcat.apache.org

我们这里下载的是Tomcat 8,下载完直接解压就可使用.卸载只需删除目录

我们来看一下Tomcat的目录

启动tomcat:bin\startup.bat

控制台显示的日志默认是乱码的,是因为控制台默认字符集是GBC,而Tomcat中默认是UTF8的

更改配置后就不乱码了

更改后保存

关闭tomcat

1.直接点X:强制关闭(无法保留数据)

2.bin\shutdown.bat:正常关闭

3.Ctrl+C:正常关闭

基本使用
1.修改启动端口号:conf/server.xml

默认端口是8080,如果修改成80,将来访问tomcat则可省略端口号,HTTP协议默认端口号为80

2.启动tomcat可能出现的问题

端口号冲突:Address already in use:bind

找到对应的程序并关闭

启动框闪退:检查JAVA_HOME环境变量是否正确配置了

使用tomcat部署项目:下文有详细介绍

2.Servlet 是什么?

Servlet 是什么是一种实现动态页面的技术,是一组Tomcat提供给程序员的 API ,使得开发一个webapp简单高效

它是一个接口,将来我们需要定义Servlet类实现Servlet接口,并由Web服务器运行Servlet.

静态页面:内容始终固定的页面,即使用户不同/时间不同/输入参数不同,页面还是不会发生改变,除非页面的源代码被修改后,页面才会发生改变,只有静态页面效果显然是不科学的

动态页面:随着用户不同/时间不同/输入参数不同,页面内容会随之发生变化的页面

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

3.编写Servlet 程序步骤

1.创建一个Maven项目

2.引入依赖

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

  1. 在中央仓库 https://mvnrepository.com/中搜索 “servlet”, 一般第一个结果就是

点击进去选择3.1.0版本,版本要和 Tomcat匹配

2.复制这里的依赖

可以查看版本对应关系:https://tomcat.apache.org/whichversion.html

3.把中央仓库的xml复制到xml中

注意写在

<dependencies></dependencies>标签之间


要在ieda中配置好Maven的路径

3.创建目录

项目创建好之后,IDEA会自动生成一些目录


src表示源代码所在目录

main/java表示源代码的根目录,后续创建的.java文件也放在这个目录

main/resources表示项目的一些资源文件所在目录

test/java表示测试代码根目录

我们还需要创建一些其他目录

在main目录下创建webapp目录

在webapp目录下创建WEB-INF目录,并创建一个web.xml文件

在.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>

webapp目录是要部署到Tomcat中的一个重要目录,我们可以在目录下放一些静态资源,html,css等,在这个目录中还有一个重要的文件 web.xml. Tomcat 找到这个文件才能正确处理 webapp 中的动态资源

IDEA中开发中的MavenWeb项目的项目结构

4.编写代码

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

@WebServlet("/hello")
public class HelloWorld extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("hello world");
        resp.getWriter().write("hello world");
    }
}

先创建一个类HelloWorld类继承自HttpServlet


在这个类上方加上注解:@WebServlet(“/hello”)

表示 Tomcat 收到的请求中, 路径为 /hello 的请求才会调用 HelloWorld 这个类的代码. (这个路径未包含 Context Path)


重写 doGet 方法. doGet 的参数有两个, req表示收到的 HTTP 请求,resp表示构造的 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调用的类满足三个条件:

1.继承自HttpServlet

2.@WebServlet 注解关联上一个 HTTP 的路径

3.实现doXXX方法

5.打包程序

打包成功

相当于把 artifactId 和 version 拼接起来了

我们看到这是一个jar包.jar 包并不是我们需要的, Tomcat 需要识别的是另外一种 war 包格式. 另外这个 jar 包的名字太复杂了, 可以设置简单一些

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

打war包

在 pom.xml 中新增一个 packing 标签, 表示打包的方式是打一个 war 包

在 pom.xml 中再新增一个 build 标签, 内置一个 finalName 标签, 表示打出的 war 包的名字是 HWorld

<packaging>war</packaging>
    <build>
        <finalName>
            ServletHelloWorld
        </finalName>
    </build>

完整的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>ServletHelloWorld</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
    </properties>
    <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>
    <packaging>war</packaging>
    <build>
        <finalName>
            ServletHelloWorld
        </finalName>
    </build>
</project>

重新打包可生成war包

6.部署程序

把war包拷贝到Tomcat的webapps目录下,启动Tomcat就会解压缩war包

看到这个日志说明 Tomcat 已经正确识别了 ServletHelloWorld 这个 webapp.

有的控制台这些日志信息是乱码的,是因为控制台默认字符集是GBC,而Tomcat中默认是UTF8的

更改配置后就不乱码了

更改后保存

7.验证程序

注意: URL 中的 PATH 分成两个部分, 其中 ServletHelloWorld 为 Context Path, hello 为 Servlet Path

4.使用SmartTomcat插件部署

手动拷贝 war 包到 Tomcat 的过程比较麻烦. 我们使用 IDEA 中的 Smart Tomcat 插件完成这个工作

插件就是针对程序的一些特定的场景,做出一些特定功能的扩展

安装Smart Tomcat

安装完成后会提示重启IDEA

配置Smart Tomcat插件

ContextPath默认填写的是项目名称,会影响到后续的访问页面

点击绿色的三角号, IDEA 就会自动进行编译, 部署, 启动 Tomcat 的过程,此时 Tomcat 日志就会输出在 IDEA 的控制台中

然后访问页面

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


原文链接: https://blog.csdn.net/chenchenchencl/article/details/129776100

标签: #软件开发 1171
相关文章

万字:支付“核心系统”详解 2024-11-02 15:33

专栏作者:隐墨星辰 \| 主编:陈天宇宙 这篇文章也尝试化繁为简,探寻支付系统的本质,讲清楚在线支付系统最核心的一些概念和设计理念。 虽然支付行业已经过了风头最劲的时光,但跨境支付仍然在蓬勃发展,每年依然有很多新人进入这个行业,这篇文章尝试为这些刚入行的新人提供一点帮助。 文章只介绍一些支付行业十几

资深支付架构师视角:实战从问题定义到代码落地的完整套路 2024-11-02 15:33

前言 今天从一个实际案例入手,介绍站在架构师的角度,如何识别并定义问题,提炼需求,技术方案选型,再到详细设计,最后利用AI的能力协助写出核心的代码,验证与调优。 解决问题存在一定的模式,也可以称之为框架,总结出自己的思考和解题框架,以后再碰到同类型的问题就可以如庖丁解牛一样容易。 很多年前,我写代码

Spring 实现 3 种异步接口 2024-10-18 09:07

大家好,我是苏三~ 如何处理比较耗时的接口? 这题我熟,直接上异步接口,使用 Callable、WebAsyncTask 和 DeferredResult、CompletableFuture等均可实现。 但这些方法有局限性,处理结果仅返回单个值。在某些场景下,如果需要接口异步处理的同时,还持续不断地

重学SpringBoot3-集成Redis(五)之布隆过滤器 2024-10-08 11:24

更多SpringBoot3内容请关注我的专栏:《SpringBoot3》 期待您的点赞👍收藏⭐评论✍ 重学SpringBoot3-集成Redis(五)之布隆过滤器 1. 什么是布隆过滤器? * 基本概念 适用场景 2. 使用 Redis 实现布隆过滤器 * 项目依赖 Redis 配置

设计模式第16讲——迭代器模式(Iterator) 2024-10-08 11:24

一、什么是迭代器模式 迭代器模式是一种行为型设计模式,它提供了一种统一的方式来访问集合对象中的元素,而不是暴露集合内部的表示方式。简单地说,就是将遍历集合的责任封装到一个单独的对象中,我们可以按照特定的方式访问集合中的元素。 二、角色组成 抽象迭代器(Iterator):定义了遍历聚合对象所需的方法

vue2路由和vue3路由区别及原理 2024-10-08 11:24

一、Vue2 与 Vue3 路由的区别 1. 创建路由实例方式的不同 Vue 2 中,通过 Vue.use() 注册路由插件,并通过 new VueRouter() 来创建路由实例。 import Vue from 'vue';import VueRouter from 'vue-router';i

目录

IT 外包服务商

  • 意见投递
  • zyf6619

软件开发应用

主菜单

  • 首页
  • 软件开发
  • 计算机基础
  • Hello Halo
  • 新手必读
  • 关于本知识库
Copyright © 2024 your company All Rights Reserved. Powered by Halo.