Servlet 的初步学习

news2024/12/23 18:30:54

image-20231213183204440

前言

咱们最核心的目标是基于tomcat编程, 做出网站来 ~~ 基于tomcat进行网站后端的开发.
网站后端, http服务器,肯定是需要针对http 协议进行一系列操作的.
幸运的是, tomcat,已经把这些http相关的底层操作,封装好了只需要调用tomcat给咱们提供的api即可

Servlet 是什么

Servlet 就是Tomcat给java提供的原生的进行web开发的api

Servlet 是一种实现动态页面的技术. 是一组 Tomcat 提供给程序猿的 API, 帮助程序猿简单高效的开发一
个 web app.

未来咱们可能还要接触一些框架(Spring全家桶)Spring MVC也是进行web开发的api
(这组api也是基于servlet的,相当于对servlet的封装).企业中已经几乎不会使用servlet,学习它的原因是这个东西是未来学习的框架的基础

网页分成两类:
静态页面: 页面内容始终是固定不变的,比如百度主页
image-20231213174707298

动态页面: 页面内容随着输入参数的不同而改变,比如搜索结果页
image-20231213175104360
静态页面就只是单纯的html,动态页面,则是html+ 数据

第一个 Servlet 程序

先写个 hello world

预期写个 servlet 程序,部署到tomcat上,通过浏览器访问,得到hello world 字符串

让我们学习编程以来的最难的 hello world 编写
有以下步骤:
1.创建项目 2.引入依赖 3.创建目录结构
4.编写代码 5.打包程序 6.部署程序
7.验证

1.创建项目

此处要创建一个maven项目了.

maven是个"工程管理"工具,它的作用有

  • 规范目录结构
  • 管理依赖(处理好使用的第三方库)
  • 构建
  • 打包
  • 测试

注: 目前主要就是使用管理依赖和打包功能

开始创建项目

image-20231210204951844

如果你首次使用maven,项目创建好了之后,会在下面读条,从中央仓库加载一些maven的依赖.

  1. 需要联网

  2. maven 仓库在国外,网络不一定稳定,这里的读条可能会比较久.(长的可能要读1个小时)[(只是第一次使用会这样,读完之后,后面就好了,如果报错失败没事,过两天再试试~

怎么修改成国内镜像?

(不建议改成国内镜像,后面如果你要学spring还得改回来,国内镜像很多东西没有,比官方的源缺东西!!!)

将maven源改为国内阿里云镜像的超链接,点击即可跳转


maven不是个独立的程序吗, 为什么不需要单独下载安装嘛?

maven是独立的程序,但是不需要单独下载安装.IDEA已经自带了(天生的,不需要安装任何额外的插件)

maven项目的目录结构

image-20231211085055581

src: 存放源代码

  • main: 业务代码
    • java: 放java代码
    • resource:
    • 放程序依赖的文件(配置文件,数据文件,图片,图标,声音…)
  • test
    • java: 测试代码
  • pom.xml: maven项目总的配置文件,后面经常用到.

image-20231211085632046

2.引入依赖

引入servlet 对应的jar包

从中央仓库下载jar包

https://mvnrepository.com/

官网链接

如果页面一直显示在加载中,可以使用加速器Watt Toolkit(steam++),它在Windows自带的Microsoft Store就有.

image-20231211105218911

image-20231211105443022

正式开始下载

image-20231211123857525

image-20231211124223310

image-20231211193756434

上述复制粘贴的被称为该依赖在maven仓库的坐标.

image-20231211225309737

3.创建目录

虽然maven已经帮我们自动的创建了一些目录,但是还不够.此处是需要使用maven开发一个 web程序,还需要别的目录

1)在main目录下(和java, resources并列),创建一个webapp目录

image-20231212085520013

2)在webapp下创建WEB-INF目录

image-20231212092040192

3)再在WEB-INF目录下创建一个web.xml 文件

在这里插入图片描述

image-20231212093422397

注: 此处的目录名字和结构,都不能错.

4)给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>

image-20231212104250463

web.xml的作用

当前写的servlet程序和以往写的别的代码相比,有一个非常大的区别:就是没有main方法.

main方法可以视为是汽车的发动机,有发动机,汽车才能跑,如果现在有辆车,没有发动机,能不能有办法跑???
答案是有办法的!挂个车头,让车头拽着它跑就行了.比如地铁,一节一节的,每一节车厢,自己没有发动机,车头才有.

咱们写的servlet程序就是车厢,tomcat就是车头!
把咱们写好的servlet程序扔到webapps目录下就相当于把车厢给挂到车头后面了.

tomcat 如何识别 webapps目录下,哪些是需要拉着跑的车厢?哪些是普通的不需要拉着跑的目录呢?
就是靠目录下有个WEB-INF/web.xml.此时tomcat就把我们写的代码加载并运行起来了.

4.编写代码

image-20231213111027790

public class HelloServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 父类里的这个方法只是返回了一个错误页面,需要注释掉
        // super.doGet(req, resp);
        //这个是在服务器的控制台里打印.
        System.out.println("hello world");
        //要想把 hello world返回到客户端,需要使用下面的代码.
        //getWriter会得到一个 Writer 对象.
        resp.getWriter().write("hello world");
        // 此处的writer对象是从属于resp对象的,此时进行的write操作其实是往resp的 body部分进行写入
        // 等resp对象整个构造好了,tomcat 会统一的转成HTTP响应的格式,再写socket.
    }
}

HttpServlet: servlet api里提供的现成的类写servlet 代码一般都是继承这个HttpServlet的.
HttpServletRequest req: 这个参数表示一个HTTP请求.
HttpServletResponse resp: 这个参数表示一个HTTP响应,一个空的对象.

doGet: 写的这个doGet方法,不需要我们自己手动调用,而是交给Tomcat来调用.
Tomcat收到 get请求,就会触发doGet方法,此时Tomcat会构造好两个参数reqresp.
req: 从TCP socket中读出来的字符串,按照HTTP协议解析得到的一个对象,这个对象里的属性和HTTP请求报文格式相对应的!
resp: 就需要我们在doGet根据请求req,结合我们自己的业务逻辑构造出一个resp对象来.

字符流: ReaderWriter,Writer
字节流: lnputStream,OutputStream

resp.getWriter().write("hello world");

此处的writer对象是从属于resp对象的,此时进行的write操作其实是往resp的 body部分进行写入,等resp对象整个构造好了, tomcat会统一的转成HTTP响应的格式,再写socket.
流对象,不一定非得是写入网卡,也不一定非得是写入硬盘,也可以写到内存缓冲区里(关键是看你代码实现的细节).

@WebServlet("/hello")

注解是 Java 中的特殊的类, Java专门定义了一种"语法糖"来实现注解.
注解的作用,针对一个类/方法,进行额外的“解释说明",赋予这个类/方法额外的功能/含义.

此处这个@WebServlet注解的作用是把当前的类,和一个HTTP请求的路径送联起来.

doGet在``Tomcat收到GET请求的时候就会调用,这个说法其实并不准确!!!具体要不要调用doGet`,还得看当前GET请求的路径是什么.
不同的路径可以触发不同的代码(关联到不同的类上).

例子: 我去餐馆吃饭

早上我发起请求:老板,来份油泼面.
http://ip:port/油泼面?辣椒=少放
老板收到请求之后,就需要按照"制作油泼面"的流程来做饭(根据请求计算响应)

中午我来发起请求:老板,来个蛋炒饭.
http://ip:port/蛋炒饭?葱=多放
老板收到请求之后,就需要按照"制作蛋炒饭”的流程来做这份饭

晚上我来发起请求:老板,来份抄手.
http://ip:port/抄手?辣椒=微辣
老板收到请求之后,就需要按照"制作抄手”的流程来做这份饭

上述三个不同的流程,相当于是三个不同的类/方法

一个Servlet程序中,可以有很多的Servlet类.每个Servlet类都可以关联到不同的路径(对应到不同的资源)
因此此处的多个Servlet就实现了不同的功能.

5.打包程序

把程序编译好(得到一些.class文件),再把这些.class打成压缩包.
jar就是一种.class 构成的压缩包,不过此处要打的是war包.
jar只是一个普通的java程序, war则是tomcat专属的用来描述webapp的程序,可以认为-个war就是一个webapp.

借助maven直接一点击即可

image-20231213121341958

微调 pom.xml

image-20231213123942412

再次打包

image-20231213124618253

打包的作用; 开发环境(自己写代码的电脑)和运行环境(另外一个服务器)很可能不是一个环境!!
直接使用IDEA的三角号运行是本地运行,而不是在另一个服务器上运行.

6.部署

把刚才打包好的war拷贝到tomcat的 webapps目录中即可!
注: 无论tomcat是在你同一个电脑上还是不同电脑上,都是这样拷贝.

image-20231213161559034

启动tomcat

image-20231213161839922

image-20231213162204877

7.验证

打开浏览器,输入url,访问写好的这个代码.
URL: http://127.0.0.1:8080/hello_servlet/hello

这个url的路径的写法
image-20231213163639609

image-20231213164803853

务必保证这两级路径都是正确的!!!稍微错一点,就很容易出现404.

小结:

刚才在浏览器地址栏中输入url之后,浏览器就构造了一个对应的HTTP GET请求,发给了tomcat.
tomcat就根据第一级路径,确定了具体的 webapp.根据第二级路径,确定了是调用哪个类.
再然后通过GET/POST方法确定调用HelloServlet的哪个方法(doGet, doPost…)
此时Tomcat 就执行对应的代码,完成对应工作.

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

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

相关文章

ReLU(Rectified Linear Unit)和Sigmoid激活函数

ReLU&#xff08;Rectified Linear Unit&#xff09;和Sigmoid都是神经网络中常用的激活函数。 特点&#xff1a; ReLU是一种简单而有效的激活函数。它对于正数部分直接返回输入&#xff0c;对于负数部分返回零。这种非线性转换有助于网络学习更复杂的表示。ReLU在许多深度学习…

1.【Multisim仿真】数电模电学习,仿真软件的初步使用

学习计划路径&#xff1a; >Multisim电路仿真软件熟练掌握 >数字电路基础课程 >逻辑电路设计与应用 >熟练掌握存储器、脉冲波形发生器、D/A和A/D转换器原理 >基本元器件熟练掌握 >晶体管放大电路及负反馈放大电路 >集成运算放大器设计 >电压变电流电路…

Unity_ET框架项目-斗地主_启动运行流程

unity_ET框架项目-斗地主_启动运行流程 项目源码地址&#xff1a; Viagi/LandlordsCore: ET斗地主Demohttps://github.com/Viagi/LandlordsCore下载项目到本地。 启动运行步骤&#xff1a; 下载目录如下&#xff1a; 1. VS&#xff08;我用是2022版VisualStudio&#xff09…

C++共享和保护——(2)生存期

归纳编程学习的感悟&#xff0c; 记录奋斗路上的点滴&#xff0c; 希望能帮到一样刻苦的你&#xff01; 如有不足欢迎指正&#xff01; 共同学习交流&#xff01; &#x1f30e;欢迎各位→点赞 &#x1f44d; 收藏⭐ 留言​&#x1f4dd; 生命如同寓言&#xff0c;其价值不在于…

Leetcode—709.转换成小写字母【简单】

2023每日刷题&#xff08;五十八&#xff09; Leetcode—709.转换成小写字母 实现代码 char* toLowerCase(char* s) {int len strlen(s);for(int i 0; i < len; i) {if(s[i] > A && s[i] < Z) {s[i] tolower(s[i]);}}return s; }运行结果 之后我会持续更…

IO零拷贝

在介绍零拷贝之前我们先看看传统的 Java 网络 IO 编程是怎样的。 下面代码展示了一个典型的 Java 网络程序。 File file new File("index.jsp");RandomAccessFile rdf new RandomAccessFile(file, "rw");byte[] arr new byte[(int) file.length()];rdf…

遗留系统现代化:7步入门数字化转型

遗留系统对企业来说可能是一把双刃剑。虽然它们曾经对企业很有帮助&#xff0c;但随着时间的推移&#xff0c;这些应用程序、系统和架构变得过时&#xff0c;最终会限制企业发展。 为了实现保持竞争优势所需的扩展、业务敏捷性和数字化转型&#xff0c;越来越多企业意识到需要…

【初阶C++】入门(超详解)

C入门 前言1. C关键字(C98)2. 命名空间2.1 命名空间定义2.2 命名空间使用2.3嵌套命名空间 3. C输入&输出4. 缺省参数4.1 缺省参数概念4.2 缺省参数分类 5. 函数重载5.1 函数重载概念5.2 C支持函数重载的原理--名字修饰(name Mangling) 6. 引用6.1 引用概念6.2 引用特性6.3 …

C/C++ 表达式求值(含多位数)

个人主页&#xff1a;仍有未知等待探索_C语言疑难,数据结构,算法-CSDN博客 专题分栏&#xff1a;算法_仍有未知等待探索的博客-CSDN博客 目录 一、前言 二、解析 分析 最后直接上代码&#xff01; 一、前言 表达式求值是一个比较基础的代码关于栈的使用。在写的时候充分锻炼…

mybatis动态SQL-trim

1、建库建表 create database mybatis-example; use mybatis-example; create table emp (empNo varchar(40),empName varchar(100),sal int,deptno varchar(10) ); insert into emp values(e001,张三,8000,d001); insert into emp values(e002,李四,9000,d001); insert into…

Dueling DQN 跑 Pendulum-v1

gym-0.26.1 Pendulum-v1 Dueling DQN 因为还是DQN,所以我们沿用double DQN,然后把 Qnet 换成 VAnet。 其他的不变&#xff0c;详情参考前一篇文章。 class VA(nn.Module):"""只有一层隐藏层的A网络和V网络"""def __init__(self, state_dim, hidd…

配电房电力智能运维系统

配电房电力智能运维系统是一种采用先进的信息技术手段&#xff0c;对配电房的电力设备进行实时监控、数据分析和管理的系统。它能够提高电力设备的安全性和效率&#xff0c;降低运维成本&#xff0c;为用户提供更加优质、高效的电力服务。 该系统依托智能运维工具-电易云&#…

Tomcat头上有个叉叉

问题原因&#xff1a; 这是因为它就是个空的tomcat,并没有导入项目运行 解决方案&#xff1a; war模式&#xff1a;发布模式&#xff0c;正式发布时用&#xff0c;将WEB工程以war包的形式上传到服务器 war exploded模式&#xff1a;开发时用&#xff0c;将WEB工程的文件夹直接…

Python 自动化之修理PDF文件(二)

PDF文件_合并与拆分PDF文档Pro版本 文章目录 PDF文件_合并与拆分PDF文档Pro版本前言一、要做成什么样子二、主要用到的函数三、基本思路1.引入库2.创建用户输入模块3.确定主框架 四、文档合并代码模块1.用户输入和函数调用2.引导用户输入文档信息3.合并文档内容4.命名新文档生成…

大数据机器学习深度解读DBSCAN聚类算法:技术与实战全解析

大数据机器学习深度解读DBSCAN聚类算法&#xff1a;技术与实战全解析 一、简介 在机器学习的众多子领域中&#xff0c;聚类算法一直占据着不可忽视的地位。它们无需预先标注的数据&#xff0c;就能将数据集分组&#xff0c;组内元素相似度高&#xff0c;组间差异大。这种无监…

Springboot日志篇

一、概述 1.1简介 市场上存在非常多的日志框架。 JUL(java.util.logging),JCL(ApacheCommons Logging),Log4j,Log4j2,Logback、SLF4j、jboss-logging等。 Spring Booti在框架内容部使用JCL,spring-boot-starter--logging采用了slf4jlogback的形式&#xff0c;Spring Boot也能自…

算法笔记—链表、队列和栈

链表、队列和栈 1. 链表1.1 单链表反转1.2 双链表反转1.3 合并两个有序链表1.4 链表相加1.5 划分链表 2. 队列和栈2.1 循环队列2.2 栈实现队列2.3 队列实现栈2.4 最小栈2.2 双端队列 1. 链表 1.1 单链表反转 力扣 反转链表 // 反转单链表public ListNode reverseList(ListNod…

达索系统SOLIDWORKS 2024 Visualize新功能

SOLIDWORKS Visualize&#xff08;原名为 Bunkspeed&#xff09;是一整套独立的软件工具&#xff0c;Visualize模块主要是用于对SOLIDWORKS设计出的产品图进行渲染、做动画&#xff0c;方便用户更好的展示、宣传产品&#xff1b;以最快速、最轻松的方式创建专业的照片级图像、动…

〖大前端 - 基础入门三大核心之JS篇(53)〗- 构造函数与类

说明&#xff1a;该文属于 大前端全栈架构白宝书专栏&#xff0c;目前阶段免费&#xff0c;如需要项目实战或者是体系化资源&#xff0c;文末名片加V&#xff01;作者&#xff1a;哈哥撩编程&#xff0c;十余年工作经验, 从事过全栈研发、产品经理等工作&#xff0c;目前在公司…

【论文阅读笔记】M3Care: Learning with Missing Modalities in Multimodal Healthcare Data

本文介绍了一种名为“MCare”的模型&#xff0c;旨在处理多模态医疗保健数据中的缺失模态问题。这个模型是端到端的&#xff0c;能够补偿病人缺失模态的信息&#xff0c;以执行临床分析。MCare不是生成原始缺失数据&#xff0c;而是在潜在空间中估计缺失模态的任务相关信息&…