【Servlet】实现Servlet程序

news2024/12/29 9:46:11

文章目录

  • 1. 最朴素方式
    • 1. 创建项目
    • 2. 引入依赖
    • 3. 创建目录
    • 4. 编写代码
    • 5. 打包程序
    • 6. 部署程序
    • 7. 验证程序
  • 2. 更方便方式
    • 1. 安装Smart TomCat插件
    • 2. 启动

1. 最朴素方式

1. 创建项目

选择Maven项目
在这里插入图片描述

2. 引入依赖

Maven项目创建完后会生成一个pom.xml文件,我们可以在这个文件中引入我们需要的Servlet API依赖的 jar 包。
pom
引入步骤:

  1. 我们可以在中央仓库 中搜servlet:
    servlet

  2. 点击servlet,选择版本,一般要和Tomcat版本对应,我们下面使用tomcat为8.5,那么servlet就要选择3.1.0:
    可以在tomcat查看对应版本。
    对应
    版本

  3. 把maven提供的xml复制到pom.xml中:
    添加到dependencies标签中,这个表情中可以引入多个依赖。
    有时依赖可能未加载上,我们可以点击右上角的m来再次加载。
    xml
    pom
    加载

3. 创建目录

当项目创建后,idea会自动生成一些目录,分别具有不同的含义。
目录
当然这些是不够的,我们还需要创建一些目录:
在main目录下创建webapp目录,webapp目录下创建WEB-INF,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>

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

4. 编写代码

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

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

代码解析

  1. 创建一个类 HelloServlet , 继承自 HttpServlet;
  2. 在这个类上方加上 @WebServlet(“/hello”) 注解, 表示 Tomcat 收到的请求中, 路径为 /hello的请求才会调用 HelloServlet 这个类的代码. (这个路径未包含 Context Path);
  3. 重写 doGet 方法. doGet 的参数有两个, 分别表示收到的 HTTP 请求 和要构造的 HTTP 响应. 这个方法会在 Tomcat 收到 GET 请求时触发;
  4. HttpServletRequest 表示 HTTP 请求. Tomcat 按照 HTTP 请求的格式把 字符串 格式的请求转成了一个 HttpServletRequest 对象. 后续想获取请求中的信息(方法, url, header, body 等) 都是通过这个对象来获取;
  5. HttpServletResponse 表示 HTTP 响应. 代码中把响应对象构造好(构造响应的状态码, header, body 等);
  6. resp.getWriter() 会获取到一个流对象, 通过这个流对象就可以写入一些数据, 写入的数据会被构造成一个 HTTP 响应的 body 部分, Tomcat 会把整个响应转成字符串, 通过 socket 写回给浏览器。

总结

  1. 我们的代码不是通过 main 方法作为入口了. main 方法已经被包含在 Tomcat 里, 我们写的代码会被 Tomcat 在合适的时机调用起来;
  2. 但是也需要满足三个条件:
  • 创建的类需要继承自 HttpServlet;
  • 这个类需要使用 @WebServlet 注解关联上一个 HTTP 的路径;
  • 这个类需要实现 doXXX 方法。

5. 打包程序

使用 maven 进行打包. 打开 maven 窗口 (一般在 IDEA 右侧就可以看到 Maven 窗口, 如果看不到的话, 可以通过 菜单 -> View -> Tool Window -> Maven 打开) 然后展开 Lifecycle , 双击 package 即可进行打包。
打包
打包成功,是一个jar包:
打包成功
jar
但是,TomCat需要的是一个war包,而我们却是jar包,所以需要在pom.xml中加入下面标签:

	<packaging>war</packaging>

还有这个jar包的名字比较的浮夸,可以添加下面标签,使它变得低调:

    <build>
        <finalName>ServletHelloWorld</finalName>
    </build>

再次打包,就得到我们需要得war包:
war

6. 部署程序

把 war 包拷贝到 Tomcat 的 webapps 目录下:
拷贝
启动TomCat:
启动

7. 验证程序

在浏览器输入: http://127.0.0.1:8080/ServletHelloWorld/hello
浏览器
注意:
URL 中的 PATH 分成两个部分, 其中 HelloServlet 为 Context Path, hello 为 Servlet Path;
在这里插入图片描述

2. 更方便方式

上面的方式是比较麻烦的,而且每次修改代码都需要重新打war包,所以引入更加简单的方式:插件

1. 安装Smart TomCat插件

  1. File->Settings
    在这里插入图片描述
  2. Plugins->Marketplace->搜索smart TomCat,安装即可。在这里插入图片描述

2. 启动

正常启动,选择就ok。
1

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1123426.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

rancher2.6.4配置管理k8s,docker安装

docker快速安装rancher并管理当前k8s集群。 1、拉镜像 docker pull rancher/rancher:v2.6.4 2、启动rancher 启动很慢 --privileged必须拥有root权限&#xff0c;并挂载卷 docker run --privileged -d --restartunless-stopped -p 80:80 -p 443:443 -v /usr/local/docker_vo…

rocketmq集群部署DLedger Controller

目录 rockermq集群部署DLedger Controller到官网下载rockermq集群模式&#xff1a;3切片主从建目录配置Nameserver先修改内存 启动NameServer停止NameServer配置Broker启动Broker启动管制台直接docker 启动即可&#xff0c;修改 -e 后面 nameserver 参数即可端口列表导入 rocke…

h5插件_h5页面嵌入客户端调试

当h5页面嵌入客户端之后&#xff0c;若是遇到问题无法调试&#xff0c;比如点击按钮无反应 —> 但是开发却看不到控制台、看不到接口返回值… 此时可以使用调试工具来查看… edura 引入1 <script src"https://cdn.jsdelivr.net/npm/eruda"></script&g…

向某文件中逐秒追加带序号输入当前时间 fgets fputs fprintf sprintf

//向某文件中逐秒追加带序号输入当前时间 #include<stdio.h> #include<stdlib.h> #include<time.h> #include<string.h> #include <unistd.h> int main(int argc, char const *argv[]) { time_t tv; // time(&tv);//法1:获取秒数 …

2023面试经典 Redis未授权漏洞与组合拳

文前漫谈 之前面试里碰见过&#xff0c;属于面试经典了&#xff0c;有空了了解一下 2015年的洞了&#xff0c;从以前乌云一个师傅的文章那了解到 Redis 有关的漏洞具有明显的时间分段性&#xff0c;在15年11月之前&#xff0c;主要是未授权导致的数据泄露&#xff0c;获得一些…

自增还是UUID,数据库主键的类型该如何选择?

一、自增(auto_increment)和UUID优缺点 自增 &#xff08;auto_increment&#xff09;的优点: 1.字段长度较uuid小很多&#xff0c;可以是bigint甚至是int类型&#xff0c;这对检索的性能会有所影响。 2.在写的方面&#xff0c;因为是自增的&#xff0c;所以主键是趋势自增的&…

小游戏外包开发流程及费用

小游戏的开发流程和费用会因项目的规模、复杂性和所选技术平台而有所不同。以下是一般的小游戏开发流程和可能的费用因素&#xff0c;希望对大家有所帮助。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&#xff0c;欢迎交流合作。 开发流程&#xff1a; 概念和…

Android Studio Gradle中没有Task任务,没有Assemble任务,不能方便导出aar包

Gradle中&#xff0c;没有Assemble任务 1. 在编译aar包或者编译module的时候&#xff0c;没有release包&#xff0c;我们一般都是通过assemble进行编译。 如果在Gradle中找不到task。 可以通过设置File->setting -->Experimental→取消勾选“Do not build Gradle task …

TransactionScope的使用

TransactionScope的使用 简介1. 命名空间2.创建事务范围3.嵌套事务4.事务提交和回滚5.支持分布式事务6.配置选项7.资源管理器8.分布式事务协调器 应用1.未设置分布式事务2.设置分布式事务 简介 TransactionScope 是 .NET Framework 和 .NET Core 中的一个类&#xff0c;用于简化…

Java数组—精讲篇

Java数组—精讲篇 先进行专栏介绍 二维数组定义格式初始化静态初始化动态初始化 举例声明并初始化一个3行4列的整型二维数组访问二维数组元素访问二维数组array中第2行第3列的元素 遍历二维数组遍历二维数组array并打印每个元素的值强调 应用举例总结 程序展示二维数组元素打乱…

ThingsBoard的版本控制整合gitee

1、注册gitee账号,创建自己的空间,并且创建一个用于存储ThingsBoard相关的仓库 2、进入ThingsBoard的租户层,然后找到版本控制,进行配置 输入gitee的仓库地址 仓库URL:指定你的gitee的参考地址 仓库分支:master 身份验证:密码、访问令牌 用户名:登录账号 密码/访问令…

【LeetCode刷题】1两数之和

为找工作&#xff0c;我的代码都是用的JAVA&#xff0c;慢慢学习中。 LeetCode刷题Day1 两数之和 给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请你在该数组中找出 和为目标值 target 的那 两个 整数&#xff0c;并返回它们的数组下标。 你可以假设每种输入…

【干货】Java函数式编程公式大全,收藏学习!

函数操作是现代编程领域中的核心概念之一&#xff0c;它以类似 Excel 表格的方式进行数据处理和计算。它的特点是使用公式和函数来描述数据之间的关系和计算逻辑&#xff1b;它允许我们以更高效、更有组织的方式管理和处理数据。 在函数式编程中&#xff0c;数据被组织成表格的…

UDP网络通信反复发收

package UDP2;import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; import java.util.Scanner;/* * 完成UDP 通信快速入门 实现发1收1*/ public class Client {public static void main(String[] args) throws Exception{// …

统信操作系统UOS上安装arm64版nginx

原文链接&#xff1a;统信操作系统UOS上安装arm64版nginx hello&#xff0c;大家好啊&#xff0c;今天给大家带来一篇在统信桌面操作系统UOS上安装arm64版nginx的文章&#xff0c;本篇文章主要是给大家提供一种下载离线nginx软件包的方法&#xff0c;拿到软件包可以去不能链接互…

Qt耗时操作添加动画等待加载效果

Qt耗时操作添加动画等待加载效果_qt 等待动画-CSDN博客本例模拟耗时请求实现动画等待加载效果&#xff0c;采用QtConcurrent::run实现异步耗时操作&#xff0c;通过QFutureWatcher异步监测耗时操作结果的返回值做相应的动画演示。_qt 等待动画https://blog.csdn.net/qq_3666686…

解决AndroidStudio Gradle只有testDebugUnitTest

问题复现&#xff1a; 问题解决&#xff1a; 1:点击Task list not built... 2:取消勾选Configure all Gradle tasks during Gradle Sync... 大功告成&#xff0c;现在去看看Gradle&#xff0c;屏蔽的都显示出来了。

CUDA学习笔记(九)Dynamic Parallelism

本篇博文转载于https://www.cnblogs.com/1024incn/tag/CUDA/&#xff0c;仅用于学习。 Dynamic Parallelism 到目前为止&#xff0c;所有kernel都是在host端调用&#xff0c;CUDA Dynamic Parallelism允许GPU kernel在device端创建调用。Dynamic Parallelism使递归更容易实现…

信钰证券:长江电力180亿市值,招商证券、摩根大通等浮盈超一成

本周A股限售股解禁规划环比有所上升。 Wind数据核算闪现&#xff0c;除去新上市公司&#xff0c;本周共有64家公司限售股解禁&#xff0c;解禁数量51.52亿股&#xff0c;以最新收盘价核算&#xff08;下同&#xff09;&#xff0c;解禁市值776.21亿元。 本周解禁市值跨越10亿…

C++二分算法的应用:寻找峰值原理、源码及测试用例

说明 此文是课程https://edu.csdn.net/course/detail/38771 的讲义。 源码下载&#xff1a;https://download.csdn.net/download/he_zhidan/88458478 题目 长度为n的数组nums&#xff0c;请返回任意一峰值的索引。符合以下条件之一i便是峰值的索引。 n等于1 i等于0 n>…