【JavaEE】Servlet

news2025/7/20 12:06:21

努力经营当下,直至未来明朗!

文章目录

  • 【Servlet】1.0
    • Servlet概述
    • 写一个Servlet程序
      • 1. 创建项目
      • 2. 引入Servlet依赖
      • 3. 创建目录结构
      • 4. 编写代码
      • 5. 打包程序
      • 6. 部署程序
      • 7. 验证程序
  • 【Servlet 2.0】
  • 访问出错
  • 【小结】


追求想要的一定很酷!

【Servlet】1.0

Servlet概述

  1. Servlet就是Tomcat给程序员提供的进行二次开发的API。学会这些API就可以比较方便地写出一个网站的后端程序了。
  2. 动态页面 VS 静态页面
    1)静态页面:页面的内容是固定的(以文件的形式静静地躺在你的硬盘的指定目录中)。
    无论是啥时候、啥人来进行访问,得到的页面效果都是一样的。

【静态页面就直接将文件拷贝到webapps中就行】

2)动态页面:不是一个真实的硬盘文件,而是通过代码在内存中构造出来的一个“虚拟的资源”。可以根据访问时间、访问的人以及访问时带有的参数不同构造不同的页面。

【动态页面就需要基于Servlet API进行代码实现了】


写一个Servlet程序

写一个 Servlet程序(7个步骤)

1. 创建项目

需要创建一个maven项目(在idea中 new project-> Maven)
1
创建好之后的目录结构:
2
① src是用来存放源代码的。其中main是存放业务代码,test是存放测试代码。
② 其中java中都是存放代码,而resources是存放代码中依赖的资源。
③ pom.xml 是项目于中的“阵眼”,也就是全局配置文件,这里写了很多关于项目的相关配置属性。

【maven是一个构建工具(build),包括但不限于编译、打包、部署…】

  1. 之前咱们写的代码都是直接在idea中点击自动编译运行的,针对一些简单的程序是ok的,但是如果是一些更复杂的模块并且相互依赖,此时直接点击编译运行是不太方便的。
  2. 所以maven构建工具就是为了解决针对复杂姐相互依赖的程序问题,使我们在开发比较复杂的项目的时候也可以比较方便的进行编译和打包操作。
  3. 咱们使用maven主要就是借助maven进行编译、打包、管理依赖等
  4. 在java中,类似于maven的构建工具其实是比较多的,如ant、gradle等

2. 引入Servlet依赖

  1. Servlet是Tomcat提供的,不是java标准库自带的,所以要想使用就需要额外下载安装并引入到项目中。
  2. Maven的一个核心功能就是能够自动管理依赖,会把咱们使用的库里依赖的东西自动从中央仓库下载下来。

maven下载的jar包会被放到“本地仓库”这样的特殊目录中:C:\Users\lenovo\.m2\repository\javax

  1. 首先下载Servlet API:
    ① 打开中央仓库(中央仓库)并搜索servlet,选择第一个:
    (或者:直接链接:Servlet)

3

② 点击之后选择3.1.0版本(servlet3.1.0 和Tomcat8.5 和jdk8是配套的)

③此时不是下载jar包,而是复制maven中的这段代码:
5
④ 复制完成后粘贴到pom.xml中:
(需要重新创建dependencies标签,可以包含多个dependency!!)
6

【idea会自动根据所写的内容从中央仓库下载依赖,在该依赖下载好之前都是标红的;
在下载过程中,会在idea右下角有个进度条;如果等了一久之后还是标红,就进行手动刷新:右边maven 】
7(首次使用maven可能会加载较久。
如果加载中出现报错的情况,一半是网络问题,另一半是pom.xml中写错了)

8pom.xml文件名红了不是报错,而是开启了git仓库,这个pom.xml没有提交就会标红

① 如果出现版本不匹配等其他问题可以上网查查方案
② 出现警告建议升级,可以不用管,还是建议不用升级

3. 创建目录结构

  1. 虽然maven已经给我们创建出了一些目录结构,但是还不够,我们需要搞的是一个符合Tomcat的目录结构。

  2. 方法:main右键 -> new Directory -> 创建webapp(注意:没有s!) -> 在webapp下new Directory -> 创建WEB-INF -> 又在WEB-INF下new File -> web.xml (位置、名字、层次 必须严格一致!)
    9

  3. 然后web.xml中必须要写点东西,但是写的内容不必去背,直接复制粘贴就行,内容是固定的,也不必进行修改!这里的内容还不能没有,Tomcat会识别该内容!

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

10
① 这里的叫做schema文件,描述了你的xml中都允许写哪些节点,节点之间的层级关系哪些属性是合法的,其作用是:验证+补全。
② 这里标红只影响到idea对于web.xml的验证和补全功能(但是咱们不用就可以不管,如果实在看着难受,就alter+enter进行解决)

4. 编写代码

  1. 方法:main -> java -> 右键 -> new java class (把代码放到java目录下,当然也可以创建包package)
    11

  2. 继承的类来自于通过maven下载的servlet的jar包;如果标红,要么是之前下载有问题,要么是没有正确导包。
    13

15

① doGet方法是HttpServlet父类中已经包含的方法,此处是需要override重写该方法。
② doGet表示当前Tomcat在收到某些请求的时候会调用这个doGet方法。
③ 参数req、resp一个是请求、一个是响应;此处doGet的工作就是“根据请求计算响应”(业务逻辑)
④ req对象:这是Tomcat把HTTP请求报文解析成一个对象了。
⑤ resp对象:则是Tomcat构造的一个空的对象(resp相当于一个“输出型参数”)
⑥ doGet就是要根据req里的一些数据+业务逻辑构造生成一个完整的resp对象;Tomcat进一步把resp对象转成一个HTTP响应报文。

  1. 典型的服务器要做三件事:】
    ① 读取请求并解析
    ② 根据请求计算响应(业务逻辑)
    ③ 把响应结果返回给客户端

  2. 举栗子:

注:文件名、路径名之类的尽量不要使用中文,尽量不要带空格、特殊符号等

注意自动生成的这个调用父类方法的super代码一定要注释or删除!!!

@WebServlet(“/helloS”): 会针对某些GET请求生效(主要是看具体的请求)。
此处写下的“/helloS”的意思就是:GET请求并且url里面路径是/helloS的请求才会生效!!
Tomcat可以让你关联很多的路径,可以给请求中的不同类关联上不同的类,也就是执行了不同的doGet方法。

(其实这里的/helloS是一个“虚拟的资源”,硬盘上的目录中是没有这个文件的;浏览器访问该路径的资源时,就通过servlet代码直接进行逻辑业务的返回)

16

当前写的servlet代码中没有main方法,但是Tomcat中是有main方法的,所以只要将servlet放到Tomcat上就可以跑起来,即:将写好的代码挂到Tomcat上:打包+部署

5. 打包程序

  1. 直接使用maven进行打包:Maven -> servlet -> Lifecycle -> package(双击 or 右键build)

打包就是:先把缺失的依赖给下载好,然后编译所有的.java文件得到一堆.class文件,再把这些.class文件给打到一个压缩包中。(打包中最主要的就是.class文件
17
双击后看到 build success就是打包成功!
18
成功的包在左侧target下:
19

  1. 虽然我们打出了jar包,但是Tomcat不认,Tomcat要求的压缩格式是war包

【最主要的区别: war包是会将整个webapp目录都给打进去的,包括web.xml,以及未来放的一些静态的html、css…】

此时就需要修改一下pom.xml:

在这里插入图片描述

① packaging是决定打出的是jar包还是war包。
② build、finalName是所打出的包的名字(此处是war包的名字)

设置好后重新打包package(这里一直在报错!)

20
可能是版本不匹配问题,最好还是按照上述所说的版本进行!!然后问题解决。
注: 一定要把之前的版本配置进行删除,如jdk不匹配就删除原来的jdk,并删除原来的环境配置,然后重新配置。

6. 部署程序

  1. 把war包拷贝到Tomcat的webapps目录下!!
    找到war包所在路径:war包 ->右键 -> Open In ->Explorer(文件资源管理器)
  2. 拷贝之后重新启动Tomcat!启动Tomcat后就会加载war包,加载操作也就是把这个war包解压缩成目录了

21
(想要重新打包就先clean,再package)

7. 验证程序

  1. 通过浏览器构造一个http请求来访问咱们的Tomcat服务器。
    在浏览器地址栏输入:127.0.0.1:8080/第一级路径/名称(WebServlet内容)
  2. Tomcat服务器解析请求:
    1)获取到url中的第一级路径,也就是webapps下的一个目录,确定一个webapp。该路径就称为:Context Path / Application Path
    2)Tomcat找到第一级路径的目录之后就会去加载里面的类,尤其是重点去识别出 @WebServlet注解修饰的类 。此时就会取出url中的第二级路径,在@WebServlet注解中找到符合名字的类并创建实例(实例只会创建一次,如果之前已经创建过了,那就直接复用上次的实例)。第二级路径也称为 Servlet Path
    3)再解析出HTTP请求的方法“GET”,取出GET之后就可以根据HTTP方法来调用对应的servlet中的方法。

如:GET请求就调用doGet方法、POST请求就调用doPost方法、PUT请求就调用doPut方法、DELETE请求就调用doDelete方法…

同时Tomcat还会构造出HttpServletRequest对象和HttpServletResponse对象。

注:如果发现在地址栏输入地址之后页面没有反应,可能就是在cmd中选中了一段文本,选中文本后cmd就会进入阻塞状态;此时就需要取消选中状态(多按两下回车)【如果之后使用linux就不涉及该问题】

  1. 为什么知道这里是GET请求,因为构造GET请求有以下几种方式:
    ① 直接在浏览器地址栏输入url
    ② html中的a、link、img、script等
    ③ form
    ④ ajax
    ⑤ 第三方工具(postman等)

这里就是直接在浏览器地址栏输入url,所以此时就是GET请求

  1. 那么,如何构造POST请求:
    ① form
    ② ajax
    ③ 第三方工具

  2. 如何构造PUT请求?
    ① ajax
    ② 第三方工具

  3. Tomcat中的main方法,主要做的就是针对webapps中的webapp进行加载,也就是将 配置+ .class 加载到内存中;后面收到请求的时候,先匹配Context Path(webapp),再匹配Servlet Path(类),最后再匹配方法(类中带有@WebServlet的方法doXXX)。以上都是由Tomcat内部的源码实现的。

【其实和jdbc差不多,都是固定套路,多练习!!】


【Servlet 2.0】

  1. 写一个Servlet程序的步骤:
    ① 创建maven项目
    ② 引入Servlet依赖
    ③ 创建目录
    ④ 编写代码
    ⑤ 打包
    ⑥ 部署
    ⑦ 验证程序

  2. 能否简化以上步骤?
    ①②③虽然也有优化的空间,但是没必要,因为这些都是一次性的操作O(1)
    ④肯定不能优化!!
    ⑤⑥ 这俩操作是O(N)的:每次代码作出微调,哪怕只改一行代码都需要重新部署。
    所以:针对⑤⑥进行“一键式”打包和部署。
    ⑦ 也不太好优化

  3. 【针对⑤⑥进行“一键式”打包和部署:】
    如果使用的是IDEA专业版,内置了Tomcat插件;
    如果是使用IDEA社区版,可以使用第三方的Smart Tomcat插件来完成

Smart Tomcat支持社区版和专业版;这个插件使用比较方便,甚至比IDEA专业版的内置还方便

  1. 插件pluging:直接安装IDEA只是包含了一些最核心的功能,插件就相当于是对IDEA功能的扩充。
  2. 安装Smart Tomcat插件:
    File -> settings -> plugings -> 搜索tomcat(一定要在Marketplace底下) -> Smart Tomcat -> install
    30

补:如果在IDEA上搜不到,直接去官网下载:
smart tomcat
点击get进行下载,会得到一个jar包,把该jar包直接拖拽到IDEA中就行

【注:tomcat server的配置比smart tomcat麻烦很多,不建议使用】

  1. 如何使用 Smart Tomcat?
    右上角add configuration -> 点击+ -> 向下找到Smart Tomcat -> 然后进行配置:name随便起,Tomcat Server(配置一次,后面自动记住),Context Path【浏览器url访问时的第一级路径,表示webapp的。之前说该Context Path是和目录名一样(和war包一样);但是Smart Tomcat是另一种运行tomcat的方式,没有真的去拷贝war包,所以在这儿就需要手动去配置该路径了】 -> 然后右上角就多出了一个小猫图标,即:生成了一个运行配置 -> 点击这里的运行按钮就可以一键式完成打包部署了。(就是让IDEA直接调用tomcat,并且加载咱们写的servlet程序)
    Context Path 名字可以随便写,但是后面在浏览器进行访问时一定要匹配!!
    35

36
(Tomcat Server)

37
如果显示startup in …ms 就是成功的!(不是红色就是失败,Tomcat的日志本来就是红色的)

之后就可以在该状态下进行浏览器访问了127.0.0.1:8080/xxx/xxx

  1. 如果点击运行之后失败Address already in use + 套接字,原因:端口已经被控制台启动的Tomcat给绑定了,此时smart tomcat调用的tomcat就会绑定端口失败了。
    解决方法:关闭控制台的tomcat。

tomcat绑定了8080和8005两个端口号,一个是业务端口,一个是管理端口。

  1. 如果显示的内容是乱码,可以打开settings -> 搜索encoding -> console中Project Encoding改为utf8试试,如果不行就改为其他试试。

  2. 【注:一个程序是可以绑定多个端口号的,一个端口号只能被一个程序绑定!!(类似于手机号和人)】

  3. 【Tomcat是每个项目配置一次!】

  4. Tomcat运行方式有很多种:
    ① 直接在startup这里运行,手动拷贝war包过去
    ② Smart Tomcat的方式:直接通过java代码,调用tomcat的jar包运行则不需要拷贝war包,调用的时候指定tomcat加载哪个webapp就行(但是只能加载一个!)。该方法在webapps下不会有war包,也不会在浏览器访问127.0.0.1:8080时有欢迎页面(因为没有加载webapps目录下的东西。因为该方式不打war包,所以finalName就失效了!)

【只看不动手 100%学不会!!多动手!】


访问出错

  1. 如果出现404,一般就是以下两种原因:
    ① 路径写错了
    ② webapp没有被tomcat正确加载:web.xml是tomcat加载war包的一个重要依据。

具体原因:

① 少写了 Context Path
② 少写了 Servlet Path
③ Servlet Path 写的和 URL 不匹配
④ web.xml 写错了

Context Path分两种情况来看:

① 如果是使用startup.bat方式启动tomcat,此时的Context Path就是webapps下的webapp目录名(war包)
② 如果是使用Smart Tomcat方式启动tomcat,此时Context Path就是配置Smart Tomcat的时候手动填写的。

① Smart Tomcat只是用于调试/开发阶段,写代码的时候开着IDEA、开着Smart Tomcat,一边写代码一边验证。
② 等把网站写完真正上线部署则是要放到云服务器的tomcat中(打war包),不是自己电脑的tomcat。

  1. 出现405的原因:
    ① 请求的方法服务器没有实现:如GET请求,但是服务器没有写doGet方法。
    ② 虽然方法对应,但是忘记注释/删除 super.doxxx了。

【补充:cmd上查看某个端口是否被占用(在管理员下运行):netstat -ano | findstr 端口号

  1. 出现500的原因(超常见):服务器代码抛异常!
    (出现异常则去读异常信息!)
    50

  2. 出现“空白页面”:响应数据的操作可能没有构造,如没有 resp.getWriter.write(“…”);方法

  3. 出现“无法访问此网站”:tomcat没有启动 or ip/端口写错了。

注:每次修改代码都要重新启动tomcat!/重新打包


【小结】

  1. 写一个Servlet程序的七个步骤 要熟练掌握!
  2. 理解:浏览器发的请求是怎么和自己写的代码建立联系的。
    ① 匹配Context Path ② 匹配Servlet Path ③ 匹配HTTP方法(doXXX)
  3. 使用tomcat “一键式”打包和部署
  4. 常见访问出错原因

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

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

相关文章

docker rootless安装

rootless 简介 rootless模式允许以非root用户身份运行Docker守护程序和容器&#xff0c;以减轻守护程序和容器运行时中的潜在漏洞。只要满足先决条件&#xff0c;即使在Docker守护程序安装期间&#xff0c;无根模式也不需要root特权。无根模式是Docker Engine v19.03中引入的一…

【俄罗斯方块】单机游戏-微信小程序项目开发入门

这是一个仿俄罗斯方块小游戏的微信小程序&#xff0c;只需要写一小段代码就实现出来了&#xff0c;有兴趣的同学完全可以自己动手开发&#xff0c;来看看实现过程是怎样的呢&#xff0c;边写边做&#xff0c;一起来回忆小时候玩过的经典俄罗斯方块游戏吧。 文章目录创建小程序页…

certbot生成证书,配置nginx,利用脚本自动续期

踩了大量坑&#xff0c;做下记录。以下适用于博主本人&#xff0c;但是未必会适用于所有人 单域名与泛域名证书生成 sudo certbot certonly --standalone --email 邮箱 -d 域名# 单域名certbot certonly --preferred-challenges dns --manual -d *.baidu.com(修改这里) --ser…

【檀越剑指大厂—Springboot】Springboot高阶

一.整体介绍 1.什么是 Springboot? Springboot 是一个全新的框架&#xff0c;简化 Spring 的初始搭建和开发过程&#xff0c;使用了特定的方式来进行配置&#xff0c;让开发人员不再需要定义样板化的配置。此框架不需要配置 xml&#xff0c;依赖于 maven 这样的构建系统。 …

嵌入式分享合集125

一、多层板PCB设计中电源平面相对地平面要进行内缩&#xff1f; 有一些人绘制的PCB&#xff0c;在GND层和电源层会进行一定程度的内缩设计&#xff0c;那么大家有没有想过为什么要内缩呢。 需要搞清楚这个问题&#xff0c;我们需要来先了解一个知识点&#xff0c;那就是“20H”…

matlab 功率谱分析

谱分析介绍 谱分析是一种用于研究函数的数学方法。在数学中&#xff0c;谱分析的基本概念是将函数分解成不同的频率成分&#xff0c;以便更好地理解其行为。这些频率成分可以表示为正弦或余弦函数的级数和&#xff0c;称为谱线。 谱分析常用于信号处理、音频信息处理和图像处…

Windows系统增强优化工具

计算机系统优化的作用很多&#xff0c;它可以清理WINDOWS临时文件夹中的临时文件&#xff0c;释放硬盘空间&#xff1b;可以清理注册表里的垃圾文件&#xff0c;减少系统错误的产生&#xff1b;它还能加快开机速度&#xff0c;阻止一些程序开机自动执行&#xff1b;还可以加快上…

数据也能开口说话?这次汇报,老板疯狂给我点赞

年底了&#xff0c;大家的工作汇报进行得怎么样了&#xff1f; 是不是少不了各种数据&#xff1f;饼图、柱形图、条形图、折线图、散点图有没有充斥在你的 PPT 中&#xff1f; 我们出版社的数据统计一般截止到 12 月中下旬&#xff0c;所以前两天&#xff0c;我已经做完了年终…

白话说Java虚拟机原理系列【第三章】:类加载器详解

文章目录jvm.dllBootstrapLoader&#xff1a;装载系统类ExtClassLoader&#xff1a;装载扩展类AppClassLoader&#xff1a;装载自定义类双亲委派模型类加载器加载类的方式类加载器特性类加载器加载字节码到JVM的过程自定义/第三方类加载器类加载器加载字节码到哪&#xff1f;Cl…

浅谈冯诺依曼体系,操作系统和进程概念

文章目录浅谈冯诺依曼体系结构和操作系统冯诺依曼体系结构冯诺依曼体系结构图操作系统进程task_struct内容分类进程内核数据结构&#xff08;task_struct)进程对应的磁盘代码查看进程ps 列出系统中运行的进程ps ajx 查看系统中所有运行的进程ps ajx | grep 程序名 &#xff1a;…

【Linux操作系统】——在Ubuntu20.04上安装MySQL数据库

在Ubuntu上安装MySQL MySQL是一个开源数据库管理系统&#xff0c;通常作为流行的LAMP&#xff08;Linux&#xff0c;Apache&#xff0c;MySQL&#xff0c;PHP / Python / Perl&#xff09;堆栈的一部分安装。它使用关系数据库和SQL&#xff08;结构化查询语言&#xff09;来管…

类美团外卖、骑手、类快递取餐柜、整合菜品供应商、前厅、后厨、配送、智能厨电设备的智慧餐饮业务

一种商业模型之类美团外卖、骑手、类快递取餐柜、整合前厅、后厨、智能厨电设备智慧餐饮业务架构 涉及到&#xff1a; 0、基础数据管理 1、菜谱创错 2、菜谱编译 3、菜谱商业化 4、厨电管理 5、后厨管理 6、前厅管理 …

【Call for papers】SIGKDD-2023(CCF-A/数据挖掘/2023年2月2日截稿)

29TH ACM SIGKDD CONFERENCE ON KNOWLEDGE DISCOVERY AND DATA MINING. 文章目录1.会议信息2.时间节点3.论文主题1.会议信息 会议介绍&#xff1a; 29TH ACM SIGKDD CONFERENCE ON KNOWLEDGE DISCOVERY AND DATA MINING. 会议全称&#xff1a; ACM Knowledge Discovery and D…

为什么 APISIX Ingress 是比 Traefik 更好的选择?

本文可以为正在选型 Kubernetes Ingress Controller 产品的用户提供一些帮助。 作者张晋涛&#xff0c;API7.ai 云原生专家&#xff0c;Apache APISIX Committer、Kubernetes Ingress Nginx Reviewer Apache APISIX Ingress Apache APISIX Ingress 是一个使用 Apache APISIX 作…

FrameLayout布局案例

框架布局-FrameLayout 1.FrameLayout简介 1.简介&#xff1a;白话&#xff0c;墙角堆砌东西 就是开辟一个巨大的空间控件的位置不能够指定&#xff0c;默认就是左上角后面对挡住前面的2.属性 属性名称 对应方法 说明 android:foreground setForeground(Drawable) 设置绘制…

【408篇】C语言笔记-第十四章( 二叉树的建树和遍历考研真题实战)

文章目录第一节&#xff1a;冒泡排序1. 排序2. 冒泡排序第二节&#xff1a;冒泡排序实战1. 步骤2. 代码3. 时间复杂度与空间复杂度第三节&#xff1a;快速排序原理与实战1. 基本思想2. 快速排序实战3. 时间复杂度与空间复杂度第四节&#xff1a;插入排序原理及实战1. 插入排序原…

HSF 实现原理

HSF 实现原理 提供服务的流程 - server启动时候向ConfigServer注册 - client启动时候向ConfigServer请求list - client缓存list&#xff0c;发现不可用的server&#xff0c;从缓存中remove - ConfigServer通过心跳包维护可用server的list - list有更新的时候&#xff0c;…

单片机——LED

0. 单片机编程的一般步骤 目标分析&#xff1a;点亮开发板上的LED灯 电路原理图分析&#xff1a;相关器件的工作原理 数据手册分析&#xff1a;IO端口控制 代码编写、编译 下载与调试 1. LED简介 Led&#xff1a;即发光二极管&#xff0c;具有单向导通性&#xff0c;一般…

验证码、通知短信API常见使用问题

如今短信应用于我们生活工作的方方面面&#xff0c;注册或者登录一个应用可以用短信验证码快速登录&#xff0c;支付可以使用短信验证码&#xff1b;商家搞促销活动可以发送通知短信给客户&#xff0c;会员到期了商家可以发送告警短信给会员用户…可见验证码短信API和通知短信A…

JavaFX爱好者看过来,这款工具值得拥有

前言 各位CSDN的博友们&#xff0c;随着各地政策的放开&#xff0c;大伙现在是在水深火热当中呢&#xff1f;还是天选打工人-安然无羊。在这里&#xff0c;希望阳了的朋友&#xff0c;赶紧恢复健康&#xff0c;早日康复。希望没有阳的朋友们&#xff0c;继续坚持&#xff0c;万…