第一个 Servlet 程序

news2024/10/4 22:33:16

1. 创建项目

使用 IDEA 创建一个 Maven 项目.

1.1、File -> New Project

Name:javaservlet2

Location:选择要存放的路径

Language:Java

Build system:Maven

点击Create按钮

1.2、Pom.xml引入依赖

依赖包来源:

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

Servlet 的版本要和 Tomcat 匹配,如果我们使用 Tomcat 8.5, 那么就需要使用 Servlet 3.1.0,可以在 这个网址(https://tomcat.apache.org/whichversion.html)查询版本对应关系。

1.3、选中javaservlet2,右键选择Module

Name:servlet01

Location:存放路径(默认)

Language:Java(默认)

Build system:Maven(默认)

点击Create按钮

2、创建目录

 2.1、创建目录webapp

在 main 目录下, 和 java 目录并列, 创建一个 webapp 目录

 src 表示源代码所在的目录。

  • main/java 表示源代码的根目录. 后续创建 .java 文件就放到这个目录中。
  • main/resources 表示项目的一些资源文件所在的目录。
  • webapp 目录就是未来部署到 Tomcat 中的一个重要的目录. 当前我们可以往 webapp 中放一些静态资源, 比如 html , css 等。

在这个目录中还有一个重要的文件 web.xml. Tomcat 找到这个文件才能正确处理 webapp 中的动态资源

2.2、创建目录WEB-INF和文件web.xml

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

2.3、编写 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>

3、 java 目录创建一个类 HelloServlet

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

1、@WebServlet(“/hello”) 注解, 表示 Tomcat 收到的请求中, 路径为 /hello的请求才会调用 HelloServlet 这个类的代码

2、重写 doGet 方法。 doGet 的参数有两个, 分别表示收到的 HTTP 请求 和要构造的 HTTP 响应。 这个方法会在 Tomcat 收到 GET 请求时触发。一个服务器的工作流程,就可以分成三个典型的步骤:

1.接收请求并解析.

2.根据请求计算响应

3.构造响应数据,并返回给客户端

1和3这两步, tomcat 已经帮我们做好了;2这步就是咱们程序猿自己要实现的逻辑。也就是doGet要实现的内容

3、HttpServletRequest 表示 HTTP 请求. Tomcat 按照 HTTP 请求的格式把 字符串 格式的请求转成了一个 HttpServletRequest 对象. 后续想获取请求中的信息(方法, url, header, body 等) 都是通过这个对象来获取。

4、HttpServletResponse 表示 HTTP 响应. 代码中把响应对象构造好(构造响应的状态码, header,body 等)

5、resp.getWriter() 会获取到一个流对象, 通过这个流对象就可以写入一些数据, 写入的数据会被构造成一个 HTTP 响应的 body 部分, Tomcat 会把整个响应转成字符串, 通过 socket 写回给浏览器

6、通过Tomcat调用主要满足三个条件:

a) 创建的类需要继承自 HttpServlet

b) 这个类需要使用 @WebServlet 注解关联上一个 HTTP 的路径

c) 这个类需要实现 doXXX 方法。

4、打包成war包

4.1、Pom.xml引用

    <packaging>war</packaging>
    <build>
        <finalName>HelloServlet</finalName>
    </build>

4.2、Maven点击package

 5、把war包放入Tomcat运行并访问

把war放入tomcat的webapps目录中,启动tomcat,访问

6、在Idea中运行

6.1、tomcat安装,步骤:File-->setting,点击install

 6.2、通过Tomcat运行

6.2.1、点击右上角的 “Add Configuration”打开页面后,点击+,选择Smart Tomcat

6.2.2、输入Name,配置Tomcat server的Configure

 Tomcat Server添加本地的Tomcat

 

 应用后展示如下:

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

Context Path:默认是项目目录,运行时不可用。需要改成:build的finalName目录,例如:/HelloServlet

这里特别重要,特别重要,特别重要。

2.3、应用后,通过tomcat执行

参考:

https://blog.csdn.net/weixin_42571453/article/details/127602980

https://blog.csdn.net/weixin_46913665/article/details/124850210

https://blog.csdn.net/wkh18891843165/article/details/116672710

https://blog.csdn.net/slivelight/article/details/120081124

https://blog.csdn.net/m0_60631323/article/details/127576149

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

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

相关文章

【Hive实战】探索Hive 2.X以及更早版本的MetaStore

探索Hive 2.X以及更早版本的MetaStore 文章目录 探索Hive 2.X以及更早版本的MetaStore概述配置元数据服务和元数据存储库基础配置参数其他配置参数默认配置配置元服务数据库使用内嵌模式的Derby库使用远程数据存储库 配置元数据服务本地/内嵌服务配置远程服务配置 元数据服务配…

Java Collection源码分析(JDk corretto 11)

文章目录 Collection 系列源码分析 (JDK Amazon corretto 11)Collection接口Iterable接口 子接口 QueueQueue的子接口 Deque双端队列 子接口ListArrayList 实现类序列化与反序列化(后续解决)获取Calss对象的方式 主要有三种&#xff1a;Arrays工具类System类 LinkedList实现类t…

kotlin的let,with,run,apply,also,异同区别

kotlin的let&#xff0c;with&#xff0c;run&#xff0c;apply&#xff0c;also&#xff0c;异同区别 例如&#xff1a; class Person(var name: String, var age: Int) {fun eat() {println("吃饭")}fun work(hour: Int): Int {println("$name $age 工作 $ho…

【论文写作】如何写引言?应该思考什么问题?总体架构!!!

结构 大多数的科技论文都聚焦于简单地说明&#xff0c;做了什么&#xff0c;发现了什么&#xff1f;虽然这个可以帮助你写出一篇研究型论文当中的核心的东西&#xff08;方法论和结果&#xff09;&#xff0c;但是不能完全把引言的部分完成。在这篇文章当中&#xff0c;将展示…

【Python】Python学习笔记(三)条件语句

条件语句 Python中的条件语句与c/cpp基本无异。 if语句 基本结构见以下代码。 Python使用缩进控制if/else语句之间的嵌套关系。 #判断两数是否相等。a int(input(a:)) b int(input(b:))if a b:print(Same) else:print(No Same)elif 代替了cpp中“else if”的写法&#…

数据结构(顺序结构、链式结构、索引结构、散列结构)

文章目录 1.概述2.数据间逻辑关系3.数据的存储结构&#xff08;或物理结构&#xff09;3.1顺序结构3.2链式结构3.3索引结构3.4散列结构 4.运算结构 1.概述 数据结构&#xff0c;就是一种程序设计优化的方法论&#xff0c;研究数据的逻辑结构和物理结构以及它们之间相互关系&am…

STM32 DMA详解

1.DMA简介 DMA (Direct Memory Access) 直接存储器存取 DMA 可以提供外设和存储器或者存储器和存储器之间的高速数据传输&#xff0c;无须CPU干预&#xff0c;节省了CPU的资源( 比如想把Flash里的一批数据转运到SRAM里&#xff0c;需要软件触发&#xff0c;使用软件触发之后&a…

NAT网络地址转换技术入门到详解

本文目录 1、NAT简介1.1、SNAT 和IP伪装(Masquerade)1.2、DNAT1.3、Full NAT (也称为Full Cone NAT)1.4、PAT (也称为NAPT) 2、如何通过iptables将一台多网卡的主机配置成NAT路由器3、汇总 本文会从NAT的简介入手&#xff0c;详解NAT技术本身&#xff0c;通过本文&#xff0c;你…

巧用千寻位置GNSS软件| 电力线勘测如何实现?

正如大家所知&#xff0c;电力线勘测是在做电力线路设计之前对设计线路沿途自然环境进行勘察测量&#xff0c;最后把手簿测量数据在电脑端经过转换输出为电力软件专用格式数据的专用功能。 那么在千寻位置GNSS软件中该如何操作完成电力线的勘察测量呢&#xff1f; 点击【测量】…

市场岗位都在通缩,Framework开发就业环境怎么样?

随着 Android 设备的普及和应用领域的不断扩大&#xff0c;Android Framework 开发需求量将会持续增长&#xff0c;并且会越来越多地向行业、企业级应用和系统优化等方向发展。以下是一些 Android Framework 开发相关的应用场景&#xff1a; 特定垂直领域的智能设备&#xff1…

写最好的Nacos Server稳定版(nacos-server-2.1.1)在Centos、Docker和Windows上安装部署(单机、集群)教程

写最好的Nacos Server稳定版&#xff08;nacos-server-2.1.1&#xff09;在Centos、Docker和Windows上安装部署&#xff08;单机、集群&#xff09;教程 一、前言二、Nacos Server在 Centos7 安装部署&#xff08;单机模式&#xff09;2.1 下载 nacos-server-2.1.1 安装包2.1.1…

Matplotlib绘图库的高级使用

Matplotlib绘图库的高级使用 Matplotlib的三层结构容器层辅助显示层图像层 Matplotlib的绘图配置设置画布属性绘图保存自定义x与y刻度解决中文显示异常网格显示多次plot绘图标记显示图例多个坐标系显示 Matplotlib的三层结构 Matplotlib从层次结构上分&#xff0c;可以分为三层…

在线安装QT5.15.2+VS2019-16.11.26

在线安装QT5.15.2VS2019-16.11.26 一、安装QT5 官方下载&#xff1a; https://download.qt.io/archive/online_installers/4.5/ 选择【qt-unified-windows-x64-4.5.2-online.exe】 登录账户 需要提前注册&#xff0c;过程省略。 安装位置&#xff08;自定义&#xff09; …

GitHub Repo

GitHub Repo 之前笔记写了 git 和 gitup&#xff08;pullpush&#xff09;&#xff0c;这里记一下 giehub repo 二三事。 权限 我不是很确定 github 的企业版是什么样的&#xff0c;不过我们用的是 gitlab 的企业版&#xff0c;这个是需要通过 vpn 才能连接的&#xff0c;如…

【C语言】基础语法6:字符串和字符处理

上一篇&#xff1a;数组和指针 下一篇&#xff1a;文件操作 ❤️‍&#x1f525;前情提要❤️‍&#x1f525;   欢迎来到C语言基本语法教程   在本专栏结束后会将所有内容整理成思维导图&#xff08;结束换链接&#xff09;并免费提供给大家学习&#xff0c;希望大家纠错…

redis7 安装 与 启动

文章目录 1. redis 的 概述2. redis 的 安装3. redis 的启动4. redis 的卸载 1. redis 的 概述 redis : 是 远程 词典服务器 &#xff0c;是 一个基于内存的 键值型 Nosql 数据库. 官方解释 : Remote Dictionary Server(远程字典服务)是完全开源的&#xff0c;使用ANSIC语言编写…

QMS-云质说质量 - 6 中小企业常用的结构化问题解决方法有哪些?

云质QMS原创 转载请注明来源 作者&#xff1a;王洪石 引言 爱因斯坦如何解决问题 面对问题时&#xff0c;有的人可能很盲目地开始行动&#xff0c;干到一定程度&#xff0c;却突然发现自己所做的是无用功。 有人问过科学巨匠爱因斯坦&#xff0c;如果给他一个关系到他生命的问…

R基础函数概览(一)

rep 函数形式&#xff1a;rep(x, time , length , each ,) 参数说明&#xff1a; x&#xff1a;代表的是你要进行复制的对象&#xff0c;可以是一个向量或者是一个因子。 times&#xff1a;代表的是复制的次数&#xff0c;只能为正数。负数以及NA值都会为错误值。复制是指的…

[oeasy]python0139_尝试捕获异常_ try_except_traceback

尝试捕获异常 回忆上次内容 变量相加 整型数字变量可以相加字符串变量也可以拼接 但是 字符串 和 整型数字整型数字 和 字符串不能相加 怎么办&#xff1f; 转格式int(“1”)str(2) 可是 如果输入的苹果数量是 字符串"abc" int(“abc”)会发生什么&#xff1f;&…

通信算法之149:EVM测量

1.星座图 h scatterplot(sqrt(sps)*txSig(sps*span1:end-sps*span),sps,offset); hold on scatterplot(rxSigFilt(span1:end-span),n,offset,bx,h) scatterplot(dataMod,n,offset,r,h) legend(Transmit Signal,Received Signal,Ideal,location,best) 2. 眼图 Eye Diagram D…