Servlet(写一个Hello Worldt)【一】

文章目录

  • 一、Servlet 目的 ----- 实现动态页面
  • 二、编写一个 Servlet 的Hello World
    • 2.1 创建项目
    • 2.2 处理文件夹
    • 2.3 引入依赖
    • 2.4 手动创建一些必要的目录/文件
    • 2.5 编写代码
    • 2.6 打包程序
    • 2.7 部署
    • 2.8 验证程序是否能正常工作

一、Servlet 目的 ----- 实现动态页面

静态页面 VS 动态页面:静态页面日渐稀少,目前以动态页面为主

  • 静态页面:不论处于什么情况下,展示的页面始终不变
  • 动态页面
    • 从用户面来看,页面的内容会随着用户输入参数的不同而发生改变
    • 从服务器角度来,服务器根据请求,进行一系列运算,动态生成了一个页面

二、编写一个 Servlet 的Hello World

2.1 创建项目

  1. Build system:构建工具,这里选择Maven
    • Maven:Java 中一个常用的“构建工具”。
      一个程序在编写过程中,往往要涉及第三方库的依赖和要对这个写好的程序进行打包部署。而Maven可以帮助我们更加方便的进行依赖管理和打包。
    • IntelliJ:IDEA 默认的构建工具
    • Gradile:主要是安卓里面会用到
      在这里插入图片描述

2.2 处理文件夹

创建出来的项目,一般会自动生成一些文件夹

  • src:源文件
    • main:业务代码
      • java:java 代码。里面自动创建的包,如org、example可以删了,后期手动添加。
      • resources:放一些依赖的资源面如图片、字体、音频等
    • test:测试代码
  • pom.xml:Maven 项目里最主要的配置文件
    • 身份标识:如果要将该程序放到Maven中央仓库上,就需要通过这几个属性来作区分,这三个联合起来,就相当于是一个库的身份标识了
      • groupId:所在公司/组织的名称
      • artifactId:产品名称
      • version:版本号
    • properties 配置的属性
      • maven.compiler.source:当前的源代码是什么版本,如果是8,表示为Java8版本
      • maven.compiler.target:生成的Java文件是什么版本,如果是8,表示为Java8版本
      • project.build.sourceEncoding:编码字符集

在这里插入图片描述

2.3 引入依赖

  1. 为什么要引入依赖:当前代码需要使用Servlet开发,但 Servlet 并不是Java标准库自带的,就需要让 Maven 把 Servle t的依赖获取过来
  2. 如何引入依赖
    • 找到Maven的中央仓库,仓库链接
    • 输入【Java Servlet API】,选择3.1.0版本(如果Tomcat是8版本的话)
      注意,Servlet 版本和Tomcat版本是有对应关系的,如果不匹配可能会出现问题
    • 把中央仓库的坐标复制在dependencies标签下,不需要下载jar包。此时IDEA就会自动的通过Maven从中央仓库下载这里的依赖。
<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>
  1. 如果下载出错/很慢
    因为默认Maven源是国外的服务器,比较慢,如果想要提高速度,可以手动修改Maven源,将其改为国内的阿里云源之类的。
  2. 为什么不像JDBC一样,直接手动下载jar包
    有些依赖可能会间接的依赖其他jar包,而Maven能够把整个依赖链条都搞定。不建议手动下载,因为手动无法保证下载整个依赖链。

2.4 手动创建一些必要的目录/文件

  1. 为什么要创建这些文件:Tomcat 对于 Servlet 项目,有一些额外的要求,我们需要根据该要求创建出一些特定的目录和文件
  2. web.xml
    • 作用:告诉 Tomcat 现在这个目录里的东西就是一个webapp,需要加载进来
    • 如果出现标红怎么办:一般是第二个标红,该处是一个schema文件
      • 不管:注意IDEA只能保证针对java程序的提示是准确的,其他文件仅供参考。而次数的标红,可以不用管。
      • 非要处理:Alt + Enter,选择fetch(主动从服务器中获取这个scheme文件)或ignore(忽略这个)
    • 内容:内容不能为空,且是固定的,copy即可
  3. schema文件
    描述了该xml里面的格式是什么样的,一旦拿到这个文件,IDEA就可以针对你的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>

在这里插入图片描述

2.5 编写代码

  1. 步骤
    • 在Java目录下创建一个继承 HttpServlet 的类
    • 重写父类的方法,这里重写的是 doGet()
  2. doGet()方法什么时候会被调用
    不需要程序员手动调用,本质上是一个“回调函数”。当把该方法写好后,就会交给Tomcat。Tomcat在收到一个合适的时机就会自动调用它
  3. 关于doGet方法被调用的合适时机:请求的方法匹配(Get请求) + 请求的路径匹配
  4. 为何Servlet不需要main方法也能运行
    一个程序的确是需要main方法作为入口,但是此处我们写的代码并不是独立的代码,而是放到Tomcat上执行的,main方法其实是在Tomcat里。包括doGet()、doPost()都是由Tomcat来调用的
  5. HttpServletRequest:这次请求的http请求内容
    调用doGet方法的时候,Tomcat会解析这次的HTTP请求,生成一个与HTTP协议格式匹配的HttpServletRequest对象(Tomcat帮我们解析请求,不需要再去写一个解析代码了)
  6. HttpServletResponse:这次请求要返回的http响应内容
    • Tomcat 会构造出一个空的HttpServletResponse 对象(空不是指null,而是一个new好的,但是没有初始化属性的对象),并且把这个 resp 对象传递到 doGet里面
    • 服务器需要根据req不同的参数的细节往resp这个空对象里设置属性。然后Tomcat就会根据这个响应对象,转换成符合HTTP协议的响应报文,然后返回给浏览器。
  7. 关于父类的doGet方法:要删掉,不然会出错
@WebServlet("/hello")   //把当前这个Servlet类和一个请求的路径关联起来了(配置路由)
//这里必须带/,否则不能正确加载
public class HelloServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {System.out.println("Hello Servlet");  //在服务器的日志中打印resp.getWriter().write("hello servlet");//同调getWriter()拿到内置的Writer字符流,使用write()将数据(这里是一个字符串)写到HTTP响应的body中//浏览器拿到body的内容,就可以显示到界面上了}
}

2.6 打包程序

  1. 为何要打包:因为程序是要放到 Tomcat 上执行的

  2. 如何打包:使用Maven,点package执行打包操作

    • Lifecycle:生命周期
    • 打包后会出现一个 【target】目录,包含着我们已经生出的内容,打好的包也会在该目录下
      在这里插入图片描述
  3. 包的格式

    • 要什么包:Maven 默认打出来的包是 Jar包,但是Tomcat并不能识别这种格式。为了能让Tomcat识别,我们需要打成war包
    • war 包:war 包本质上和 jar 包差不多,但是这里会包含一些前端的代码(HTML、CSS、JS)以及一些Tomcat的配置(web.xml)
  4. 如何修改 Maven 打出的包的格式:在 pom.xml 里修改,注意重新打出的 war 包也在target目录下

<packaging>war</packaging>
<build><!-- 描述了打的包的名字是什么,不是必须的,可以使用默认的名字 --><finalName>light</finalName> 
</build>
  1. 如何确定打包成功:在打印了一系列日志后,出现了【BUILD SUCCESS】
    在这里插入图片描述

2.7 部署

  1. 把写好的war包,拷贝到Tomcat的webapps目录中
  2. 当拷贝进来后,Tomcat就能识别到有新的webapp来了,就会自动对这个war包解压缩,同时会在服务器上打印出一段日志(发现了新的war包,对war包进行部署),此时Tomcat就能识别出我们新写的程序了
  3. 再次使用时,需重启Tomcat。

2.8 验证程序是否能正常工作

  1. 如何做:通过浏览器发起 HTTP 的Get请求,触发刚才 Servlet 的代码
  2. 关于请求路径
    • 通过第一级路径(context path/application path)确认要去访问哪个webapp,通常就是war包的名字,即解压缩之后的目录名字
    • 通过第二级目录说明要访问哪个Servlet代码,与@WebServlet注解是对应的
    • 根据请求决定调用的是哪个方法
  3. 如果出现Tomcat正常运行,但是浏览器一直转圈的情况:可能是cmd的问题,按enter即可解决
    当选中了cmd中的某个内容,cmd就会进入“复制”模式,此时按下enter就是完成复制。而进入复制模式的过程中,cmd就会把正在运行的进程给阻塞掉。此时,可以通过按下enter完成复制,把Tomcat的阻塞状态解除

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

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

相关文章

安卓免费抠图、AI绘图、修图软件——SnapEdit

一、前言 AI绘图原理主要基于深度学习和神经网络技术&#xff0c;通过训练数据集中的图像&#xff0c;从中学习并提取特征&#xff0c;进而生成新的图像。这一过程涉及到多种技术和模型&#xff0c;包括但不限于VAE&#xff08;变分自编码器&#xff09;、auto-encoder、GAN&a…

后端工程师——C++工程师如何准备面试?

相比 Java 语言方向,C++ 入门简单,精通难,找工作竞争压力更小,但 C++ 依然是近年来招聘的热门岗位之一。本文将从以下三个方面进行详细讲解,帮助你对 C++ 相关岗位的就业前景、岗位要求、学习路线等有更充分的了解。 C++工程师面试准备 上两篇文章对 C++ 工程师的招聘需求…

2024年世界排名TOP250医院榜单发布|医学访学/博后/联培博士参考

作为医学类的访问学者、博士后及联合培养博士们&#xff0c;都希望到世界知名医院进行临床研修交流及科研学习。2024年世界最佳医院排行榜的发布为申请者提供了可选目标&#xff0c;现知识人网小编整理刊出。 近日&#xff0c;美国《新闻周刊》&#xff08;Newsweek&#xff09…

To String的几个作用

To String的几个作用 一、Object类中toString的作用 1、在主方法中我们可以直接用toString输出对象其中的内容 2、我们需要直接输出对象中所属内容时&#xff0c;直接使用toString方法输出语句&#xff0c;输出内容不友好&#xff0c;不便于阅读 子类&#xff1a; public c…

Linux 进程管理快捷键 ctrl+z、ctrl+c、ctrl+\、ctrl+d介绍

在Linux系统中&#xff0c;可以使用一些特定的键盘快捷键来管理后台进程和控制终端的行为。下面是对这些快捷键的介绍&#xff1a; 1 CtrlZ&#xff08;挂起&#xff09;&#xff1a; 在终端中运行程序时&#xff0c;你可以使用CtrlZ来将其挂起&#xff0c;即将其移动到后台并…

Pytorch:张量的梯度计算

目录 一、自动微分简单介绍1、基本原理2、梯度计算过程3、示例&#xff1a;基于 PyTorch 的自动微分a.示例详解b.梯度计算过程c.可视化计算图 4、总结 二、为什么要计算损失&#xff0c;为何权重更新是对的&#xff1f;1、梯度下降数学原理2、梯度上升 三、在模型中使用自动微分…

【U+】U+智享版运维平台账号密码重置

【问题描述】 友加畅捷系列中的U智享版软件&#xff0c; 系统运维平台账号admin密码忘记了&#xff0c;无法登录。 【解决方法】 在软件的安装目录下&#xff0c;找到sysconfig_accounts文件&#xff0c;并删除。 【路径&#xff1a;X:\U系列软件\U智享版\WebSite\config\】 …

【算法基础实验】图论-UnionFind连通性检测之quick-union

Union-Find连通性检测之quick-union 理论基础 在图论和计算机科学中&#xff0c;Union-Find 或并查集是一种用于处理一组元素分成的多个不相交集合&#xff08;即连通分量&#xff09;的情况&#xff0c;并能快速回答这组元素中任意两个元素是否在同一集合中的问题。Union-Fi…

AI技术宝库:一键收藏全球最全面的人工智能资源网站

1、KKAI&#xff08;kk.zlrxjh.top&#xff09; R5AI是一种融合了星火大模型与文心大模型的知识增强型大语言模型&#xff0c;主要聚焦于自然语言处理&#xff08;NLP&#xff09;的技术开发。 该模型具有卓越的语义理解和文本生成能力&#xff0c;可以有效处理多种复杂的自然语…

python爬虫-----深入了解 requests 库下篇(第二十六天)

&#x1f388;&#x1f388;作者主页&#xff1a; 喔的嘛呀&#x1f388;&#x1f388; &#x1f388;&#x1f388;所属专栏&#xff1a;python爬虫学习&#x1f388;&#x1f388; ✨✨谢谢大家捧场&#xff0c;祝屏幕前的小伙伴们每天都有好运相伴左右&#xff0c;一定要天天…

M-LAG的基本概念

如图所示&#xff0c;用户侧设备Switch&#xff08;可以是交换机或主机&#xff09;通过M-LAG机制与另外两台设备&#xff08;SwitchA和SwitchB&#xff09;进行跨设备链路聚合&#xff0c;共同组成一个双活系统。这样可以实现SwitchA和SwitchB共同进行流量转发的功能&#xff…

16(第十五章,数据管理成熟度评估)

目录 概述 数据管理成熟度等级 基本概念 评级等级以及特点 现有的DMMA框架 活动 方法 扩展 概述 数据管理成熟度等级 1) 0 级。无能力级。2) 1 级。初始级或临时级&#xff1a;成功取决于个人的能力。3) 2 级。可重复级&#xff1a;制定了最初级的流程规则。4) 3 级。…

【webrtc】m114自己实现的PrioritizedPacketQueue及优先级处理

G:\CDN\WEBRTC-DEV\libwebrtc_build\src\modules\pacing\prioritized_packet_queue.h跟m98不同 :webrtc】m98 RoundRobinPacketQueue的优先级处理,m114直接使用taskqueue顺序处理了。甚至自己实现了优先级队列感觉简化了实现,更为清晰 易读,但是去掉了码率低就优先的逻辑。1…

企业计算机服务器中了rmallox勒索病毒怎么办?Rmallox勒索病毒解密流程工具

在网络飞速发展的时代&#xff0c;企业离不开网络&#xff0c;网络为企业的生产运营提供了极大便利&#xff0c;加快了企业进步的步伐&#xff0c;依靠网络可以开展各项工作业务&#xff0c;通过网络数据整合&#xff0c;可以更方便企业办公。网络在为企业提供便利的同时也为企…

ESLint 、 e2e test 学习

Lint和Format的区别&#xff1a; Lint只会告诉你代码中的错误或者不符合规范的地方&#xff0c;而Format是用来对格式作调整的 HTML/tpl&#xff1a;HTMLLint CSS/SCSS&#xff1a;Stylelint JS/JSX&#xff1a;Eslint JSLint&#xff1a;古老&#xff0c;不能配置和扩展JSHin…

【C++类和对象】日期类的实现

&#x1f49e;&#x1f49e; 前言 hello hello~ &#xff0c;这里是大耳朵土土垚~&#x1f496;&#x1f496; &#xff0c;欢迎大家点赞&#x1f973;&#x1f973;关注&#x1f4a5;&#x1f4a5;收藏&#x1f339;&#x1f339;&#x1f339; &#x1f4a5;个人主页&#x…

Post请求中常见的Content-Type类型

Post请求中常见的Content-Type类型的结构 &#xff08;1&#xff09;application/x-www-form-urlencoded 这是浏览器原生的form表单类型&#xff0c;或者说是表单默认的类型。 下面是一个请求实例&#xff1a; 请求报文&#xff1a; 可以看得出&#xff0c;post将请求参数以k…

了解时间复杂度和空间复杂度

在学习数据结构前&#xff0c;我们需要了解时间复杂度和空间复杂度的概念&#xff0c;这能够帮助我们了解数据结构。 算法效率分为时间效率和空间效率 时间复杂度 一个算法的复杂度与其执行的次数成正比。算法中执行基础操作的次数&#xff0c;为算法的时间复杂度。 我们采…

网络安全实训Day23

网络空间安全实训-渗透测试 文件上传攻击 定义 将Webshell文件上传到网站服务器上&#xff0c;从而获得网站整台服务器控制权限的攻击方式 Webshell 一种以网页形式存在的命令行执行环境&#xff0c;又称网页木马 分类 一句话木马 只有一行代码&#xff0c;功能强大&#xff…

【程序分享1】LAMMPS + OVITO + 晶体缺陷识别 + 点缺陷 + 分子动力学模拟

分享2个分子动力学模拟相关的程序。 1. 一种识别体心立方晶体缺陷的新方法。 2. 无后处理的分子动力学模拟中的并行点缺陷识别: lammps的计算和转储方式 。 感谢论文的原作者&#xff01; 第1个程序 关键词&#xff1a; 1. Atomistic simulations, 2. Molecular dynamics…