javaEE 初阶 — 第一个 servlet 程序

news/2024/5/1 13:01:00/文章来源:https://blog.csdn.net/m0_63033419/article/details/130022817

文章目录

  • Servlet 是什么
  • 第一个 Servlet 程序
    • 1 创建项目
    • 2 引入依赖
    • 3 创建目录结构
    • 4 代码编写
    • 5 打包程序
    • 6 部署
    • 7 验证
  • 如何使用 tomcat 插件打包及部署
    • 1 什么是插件
    • 2 插件的安装
    • 3 插件的使用
    • 4 可能会出现的问题

Servlet 是什么


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

网页是分为两大类的:

1、静态页面:页面的内容始终是固定不变的,静态页面就只是单纯的 html ,例如搜狗主页。

2、动态页面:页面内容随着输入参数的不同而改变,动态页面则是 html + 数据,例如搜狗结构页。

第一个 Servlet 程序


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


这里的操作一共分为 7 个步骤:

1、创建项目

2、引入依赖

3、创建目录结构

4、编写代码

5、打包程序

6、部署程序

7、验证

1 创建项目


选择 maven,不要选择左边的。



点击完成即可。


main 底下存放的是 业务代码java 目录底下存放的是 java 代码。
resources 里存放的是程序依赖的文件,此处再是不涉及。
test 目录下的 java 存放的是 测试代码,pom.xml 是 maven 项目的配置文件,后面会经常用到。




项目创建好以后,上面的代码是自带的。

2 引入依赖


搜索 https://mvnrepository.com/ 打开 maven 仓库。



需要先验证。

搜索 servlet 选择当前的圈出的。



点击进去,选择 3.1.0 版本。





选中当前的 maven,将上述的代码复制到 pom.xml 里,要复制到 dependencies 标签里。




为红色说明未下载完成。

3 创建目录结构


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


1、在 main 目录下创建一个 webapp 目录



选择 Directory,创建 webapp 目录。


2、在 webapp 下创建一个 WEB-INF 目录



选择 Directory,创建 WEB-INF 目录。


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



选择 File 创建文件。


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>


直接将上面的这段代码复制到 web.xml 文件中。



圈出的部分可能会是红色的,但是不一定是错误的,可以使用 alt + enter 使使。

4 代码编写


创建一个 HelloServlet 类。

import javax.servlet.http.HttpServlet;public class HelloWorld extends HttpServlet {}


HttpServletservlet api 里提供的现成的类,一般写 servlet 代码一般都是继承 HttpServlet


这个类需要重写 doGet 方法,如果是一个 Post 请求,那就是重写一个 doPost 请求。

public class HelloWorld extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//super.doGet(req, resp);}
}

@Override 表示的是方法重写
HttpServletRequest request 这个参数表示一个 http 请求。
HttpServletResponse response 这个参数表示一个 http 响应。


doGet 方法的效果就是 根据请求计算响应Tomcat 收到 get 请求就会触发 doGet 方法,Tomcat 就会构造好两个参数,
一个是 rep一个是 resp

rep 是 TCP socket 中读出来的字符串,按照 http 协议解析得到的对象。
resp 则只是一个 空的对象。

super.doGet(req, resp); 这儿条语句一定要注释掉。


编写业务代码,也就是我们的 hello world 。

// 这是一个注解
@WebServlet("/hello")
public class HelloServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//super.doGet(req, resp);System.out.println("Hello World"); // 这是控制台打印// 返回到客户端的打印// getWriter 会得到一个 Writer 对象resp.getWriter().write("Hello World");}
}


这里的注解类似于一个导购员,作用是针对一个类/方法,进行额外的 “解释说明”,
赋予这个类/方法额外的功能/含义。


需要注意的是,doGetTomcat 收到 GET 请求的时候就会调用。
具体要不要调用 doGet,还要看当前的 GET 请求的路径是什么,不同的路径可以触发不同的代码。
(关联到不同的类上)

举一个例子,比如说,我到饭店吃饭,向老板点了一份蛋炒饭,我的要求是葱要多放。
此时就是 http://ip:port/蛋炒饭?葱=多放
老板再收到请求的时候就需要按照 “制作蛋炒饭” 的流程来做饭,也就是根据请求计算响应。


如果我点的是一个多放辣椒的炒面,那就是 http://ip:port/炒面?辣椒=多放
此时老板收到的请求之后,就是按照 “制作炒面” 的流程来制作饭,也就是根据请求计算响应。

这很明显是两个不同的流程,相当于是两个不同的类/方法。


一个 Servlet 程序中,可以有很多的 Servlet 类,每个 Servlet 都可以关联到不同的路径,也就是对应到不同的资源,因此多个 Servlet 就实现了不同的功能,但是一个 Servlet 类是不可以对应多个路径的。对应的,一个路径也不能对应多个 Servlet,路径 和 Servlet 类之间是一对一之间的关系

5 打包程序


程序编译好之后,会得到一些.class 文件,此时要把这文件打成 war 包。
war 是 tomcat 专属的用来描述 webapp 的程序,一个 war 就是一个 webapp。


1、点击右侧的 maven ,打开面板



2、选中此时的 Lifecyle 下的 package



可以直接双击运行。



也可以右键选中上面的 Run 运行。


3、成功之后就会显示 build success



如果打包错误了,就会产生一个报错。

打完之后再左侧的 target 目录里就包含了 所打的包,默认情况下打的是一个 jar


4、修改 jar 包 为 war 包

先在 pom.xml 文件中的 project 标签里加入一个 packaging 标签。
在这标签里写下指定的包是哪一种,我们打的是 war 包,此处就写的是 war 包。

 <packaging>war</packaging>


还需要有一个 build 标签,在 这个 build 标签里也要有一个 finalName 标签。
此处的 finalName 标签里写的就是包的名字。

<build><finalName>test01</finalName>
</build>




可以看到此时打的 war 包。


5、右键打开 war 包



打开之后,可以看到 target 目录下的 war 包。

6 部署


部署就是将之前的 war 文件 拷贝到 tomcat 的 webapps 目录即可,无论 tomcat 是不是在你的同一个电脑上,都是如此拷贝。

拷贝后,启动 tomcat。

如果 tomcat 正在运行,直接拷贝的时候 tomcat 也可以识别,但是在 windows 中可能存在 bug,
实际工作中,tomcat 基本都是在 linux 上运行的。




之后启动 tomcat 。



看到上面的即为启动成功。

7 验证


打开地址栏,输入 url ,测试写好的代码。



test01 是 第一级目路径,也叫做 context path / application path,这个目录就代表了一个 webapp,也就是一个网站。


/hello 是 第二级路径 也叫做 servlet path,如果这两个路径有一个出现了错误,就会出现 404






第一级路径对应的是 war 包名,第二级路径对应的是 注解 里的内容。





可以看到在服务器和客户端都打印出了 Hello World。


小结

在浏览器地址栏输入 url 之后,浏览器就构造了一个对应的 HTTP GET 请求,发给了 tomcat 。
tomcat 就根据第一级路径确定了具体的 webapp,根据第二级路径确定了是调用哪个类。
然后再通过 GET/POST 方法确定调用 HelloSevlet 类里的哪个方法,是 doGet、doPost,还是其他的方法。

如何使用 tomcat 插件打包及部署


打包部署 是可以使用 idea 的 tomcat 插件,把 tomcat 集成到 idea 中。
就可以省去手动打包和部署的过程,只需要按一下运行就会自动打包部署。

基于 tomcat 插件自动打包部署,适用于开发阶段,频繁修改代码,频繁验证的场景。
手动打包部署,适用于上线阶段,发布程序时使用。

1 什么是插件


插件就是对现有的功能进行的拓展,很多程序都是有插件功能的。



就比如上图中的 m4,射击是它的一个功能,但是说如果目标距离过远导致没有办法很容易的命中,
此时就可以装上一个瞄准镜,此时的瞄准镜就是一个插件,作用就是添加一个远距离瞄准的功能。

如果没有添加瞄准镜这个插件,它也是可以开火射击的,只是对于远距离目标就没有那么精准了。
相当于是没有了插件后,功能比以前更少了。


如果此时在夜间看不见目标,就可以在添加上一个夜视仪,这个插件就保证了夜间也可以命中目标。
夜视仪就是另外的一个插件,另外的一个功能。

2 插件的安装


1、打开左上角的 File 选择点击 Settings


2、点击 Plugins



在点击后出现的页面中,



Marketplace 表示的是插件市场,要在这里搜索下载插件。
Installed 页面表示的是已经装好了的插件。


3、搜索 smart tomcat



smart tomcat 就是我们要下载的插件,点击 Install 开始下载。
下载完成之后,重启 idea 即可。

3 插件的使用


首次使用 smart tomcat 的时候,需要配置一下,当然之后就不需要配置了。

1、新增一个运行配置

单击右上角的 Add Configuration…





在出现的页面中,点击圈出的部分。


2、在出现的页面中选择 smart tomcat





点击后出现的页面就是上图中的页面,我们只需要配置绿色圈出的部分,这部分默认即可。


3、设置一下 tomcat 所在的路径

第一次配置好了,以后就不需要再配置了。


4、运行 tomcat



点击右上角的 三角形 运行。



运行后发现报错了,此时报的错误是 地址已被占用。



可以发现此时的使用的端口是 8080。


此时就可以打开 cmd ,键入 netstat -ano | findstr 8080



此时就可以看到 16620 这个进程占用了 8080 这个 端口。


打开 任务资源管理器



可以看到 16620 这个进程就是我们的 tomcat 对应到的 java 进程,因此,关掉 tomcat 即可。


关掉之后,就可以发现此时 8080 不再被占用了。





可以发现此时,就运行成功了。


此时还需要再验证一下,在地址栏输入 http://127.0.0.1:8080/test01/hello



smart tomcat 的工作原理

smart tomcat 不是自动把 war 包拷贝了,也就是 webapps 里是不变的,
而是通过另一种方式来启动的 tomcat 的。

tomcat 支持启动时显示指定一个特定的 webapp 目录,相当于是让 tomcat 加载单个 webapp 运行。
idea 直接调用 tomcat 让 tomcat 加载当前项目中的目录。这个过程中其实并没有打 war 包,也没有拷贝,也没有解压缩。

4 可能会出现的问题


1、404

导致 404 出现的原因,可能是路径写错了。也有可能是 webapp 没有被正确部署
例如,web.xml 文件里的内容写错了、文件名写错了、文件路径写错了、文件位置错了…


此时就是一个 404 错误。



2、405

如果出现了 405,可能是浏览器发了一个 GET 请求,但是此时的代码里是没写 doGet 方法的。



如果 super.doGet(req, resp); 这条语句没有注释掉,也会报 405。



3、500

出现 500 ,本质上就是代码抛出异常了,抛出 500 的时候日志会明确的告诉你异常调用栈,
会告诉你哪一行代码出问题了。

String s = null;
System.out.println(s.length());


此时的代码肯定会报一个 空指针异常



可以看到在报 500 的同时,也报出了空指针异常,而且连出现问题的代码行数也报出来了。



4、出现空白页面

出现空白页面,是因为代码里没写 resp.getWriter().write() 这条语句。



5、出现无法访问网站

这表明 tomcat 未启动,此时就需要检查 tomcat 是否启动了,如果没启动,那就启动。





在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

elasticsearch MySQL 数据同步。

elasticsearch & MySQL 数据同步。 文章目录elasticsearch & MySQL 数据同步。3. 数据同步。3.1. 思路分析。3.1.1. 同步调用。3.1.2. 异步通知。3.1.3. 监听 binlog。3.1.4. 选择。3.2. 实现数据同步。3.2.1. 思路。3.2.2. 导入 demo。3.2.3. 声明交换机、队列。1&…

ChatGLM-6B论文代码笔记

ChatGLM-6B 文章目录ChatGLM-6B前言一、原理1.1 优势1.2 实验1.3 特点&#xff1a;1.4 相关知识点二、实验2.1 环境基础2.2 构建环境2.3 安装依赖2.4 运行2.5 数据2.6 构建前端页面3 总结前言 Github&#xff1a;https://github.com/THUDM/ChatGLM-6B 参考链接&#xff1a; ht…

GPSS【实践 01】Developing a Greenplum Streaming Server Client 自定义GPSS客户端开发实例

自定义GPSS客户端开发流程1.GPSS是什么2.架构3.组件下载安装4.自定义客户端4.1 GPSS Batch Data API Service Definition4.2 Setting up a Java Development Environment4.3 Generating the Batch Data API Client Classes4.4 Coding the GPSS Batch Data Client4.4.1 Connect …

精准关键词获取-行业搜索词分析

SEO关键词的收集通常可以通过以下几种方法&#xff1a; 根据市场价值、搜索词竞争性和企业实际产品特征进行筛选&#xff1a;确定您的关键词列表之前&#xff0c;建议先进行市场分析&#xff0c;了解您的竞争对手、行业状况和目标受众等信息&#xff0c;以更好的了解所需的特定…

为何ChatGPT如此擅长编造故事?

“幻觉”——人工智能中的一个偏见性术语 AI聊天机器人(如OpenAI的ChatGPT)依赖于一种称为“大型语言模型”(LLM)的人工智能来生成它们的响应。LLM是一种计算机程序&#xff0c;经过数百万文本源的训练&#xff0c;可以阅读并生成“自然语言”文本语言&#xff0c;就像人类自然…

HTTP协议概述 | 简析HTTP请求流程 | HTTP8种请求方法

目录 &#x1f30f; HTTP的简单介绍 何为HTTP HTTP1.0与HTTP1.1 &#x1f30f; HTTP的请求方法 1、OPTIONS 2、HEAD 3、GET 4、POST 5、PUT 6、DELETE 7、TRACE 8、CONNECT &#x1f30f; HTTP的工作原理 &#x1f30f; HTTP请求/响应的步骤 1、客户端连接到Web…

【Linux】用户命令(创建,修改,切换,删除,密码)

目录 1.创建 查看用户信息 查看id 2.修改 修改用户名 修改用户uid 操作前&#xff1a; 操作后 修改组名 操作前&#xff1a; 操作后: 修改组id 操作前&#xff1a; 操作后&#xff1a; 操作前&#xff1a; 操作后: 3.切换用户 4.删除 操作前&#xff1a; 操作…

LeetCode:376. 摆动序列——说什么贪心和动规~

&#x1f34e;道阻且长&#xff0c;行则将至。&#x1f353; &#x1f33b;算法&#xff0c;不如说它是一种思考方式&#x1f340;算法专栏&#xff1a; &#x1f449;&#x1f3fb;123 一、&#x1f331;376. 摆动序列 题目描述&#xff1a;如果连续数字之间的差严格地在正数和…

php7类型约束,严格模式

在PHP7之前&#xff0c;函数和类方法不需要声明变量类型 &#xff0c;任何数据都可以被传递和返回&#xff0c;导致几乎大部分的调用操作都要判断返回的数据类型是否合格。 为了解决这个问题&#xff0c;PHP7引入了类型声明。 目前有两类变量可以声明类型&#xff1a; 形参&a…

拼多多运营中需要采集淘宝天猫京东平台商品详情页面数据上架拼多多店铺,如何使用技术封装接口实现

业务背景&#xff1a;电商平台趋势&#xff0c;平台化。大家可以看到大的电商都开始有自己的平台&#xff0c;其实这个道理很清楚&#xff0c;就是因为这是充分利用自己的流量、自己的商品和服务大效益化的一个过程&#xff0c;因为有平台&#xff0c;可以利用全社会的资源弥补…

RPC调用框架简单介绍

一.Thrift Apache Doris目前使用的RPC调度框架。Thrift是一款基于CS&#xff08;client -server&#xff09;架构的RPC通信框架&#xff0c;开发人员可以根据定义Thrift的IDL(interface decription language)文件来定义数据结构和服务接口&#xff0c;灵活性高&#xff0c;支持…

项目5:实现数据字典的上传下载

项目5&#xff1a;实现数据字典的上传下载 1.什么是数据字典&#xff1f;如何设计&#xff1f; 2.业务流程逻辑 3.数据库表的设计 4.实现上传下载逻辑&#xff08;前端&#xff09; 5.实现上传逻辑&#xff08;后端&#xff09; 6.实现下载依赖&#xff08;后端&#xff…

代码随想录Day49

今天继续学习动规解决完全背包问题。 322.零钱兑换 给你一个整数数组 coins &#xff0c;表示不同面额的硬币&#xff1b;以及一个整数 amount &#xff0c;表示总金额。 计算并返回可以凑成总金额所需的最少的硬币个数 。如果没有任何一种硬币组合能组成总金额&#xff0c;…

vuex中的 mapState, mapMutations

vuex中的 mapState&#xff0c; mapMutations Start 今天使用vuex的过程中&#xff0c;遇到 mapState&#xff0c; mapMutations 这么两个函数&#xff0c;今天学习一下这两个函数。 本文介绍的vuex基于 vuex3.0 1. 官方文档说明 1.1 mapState 官方解释 点击这里&#xff1…

【JUC进阶】详解synchronized锁升级

文章目录1. synchronized概述2. synchronized 的实现原理2.1 Java对象组成2.2 Monitor2.3 从字节码角度看synchronized3. 锁升级3.1 偏向锁3.2 轻量级锁1. synchronized概述 synchronized是一个悲观锁&#xff0c;可以实现线程同步&#xff0c;在多线程的环境下&#xff0c;需…

DIN35电压电流转频率单位脉冲输出信号变换器集电极开路隔离变送器

主要特性 将直流电压或电流信号转换成单位脉冲信号。 精度等级&#xff1a;0.1 级、0.2 级。产品出厂前已检验校正&#xff0c;用户可以直接使用。 国际标准信号输入:0-5V/0-10V/1-5V 等电压信号,0-10mA/0-20mA/4-20mA 等电流信号。 输出标准信号&#xff1a;0-5KHz/0-…

Flink CDC 在京东的探索与实践

摘要&#xff1a;本文整理自京东资深技术专家韩飞&#xff0c;在 Flink Forward Asia 2022 数据集成专场的分享。本篇内容主要分为四个部分&#xff1a; 京东自研 CDC 介绍京东场景的 Flink CDC 优化业务案例未来规划点击查看直播回放和演讲 PPT 一、京东自研 CDC 介绍 京东自研…

小白学Pytorch系列- -torch.distributions API Distributions (1)

小白学Pytorch系列- -torch.distributions API Distributions (1) 分布包包含可参数化的概率分布和抽样函数。这允许构造用于优化的随机计算图和随机梯度估计器。这个包通常遵循TensorFlow分发包的设计。 不可能通过随机样本直接反向传播。但是&#xff0c;有两种主要方法可以…

tomcat中出现RFC7230和RFC3986问题解析

问题截图 问题分析 出现上述问题&#xff0c;是因为各版本tomcat中对特殊字符和请求路径中携带中文参数而产生的错误提示。 解决办法 1、调整tomcat版本 tomcat 7.0.76之前的版本不会出现类似问题 2、tomcat9之前&#xff0c;修改tomcat目录底下的/conf/catalina.properti…

chapter-5 数据库设计

以下课程来源于MOOC学习—原课程请见&#xff1a;数据库原理与应用 考研复习 引言 设计的时候: 我们为什么不能设计成R&#xff08;学号&#xff0c;课程号&#xff0c;姓名&#xff0c;所咋系&#xff0c;系主任&#xff0c;成绩&#xff09;&#xff1f; 因为存在数据冗余…