Servlet(写一个Hello Worldt)【一】

devtools/2024/9/20 7:14:24/ 标签: java, 后端, servlet

文章目录

  • 一、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:业务代码
      • javajava 代码。里面自动创建的包,如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方法:要删掉,不然会出错
java">@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.ppmy.cn/devtools/18300.html

相关文章

小程序变更主体还要重新备案吗?

小程序迁移变更主体有什么作用&#xff1f;小程序迁移变更主体的作用可不止变更主体这一个哦&#xff01;还可以解决一些历史遗留问题&#xff0c;比如小程序申请时主体不准确&#xff0c;或者主体发生合并、分立或业务调整等情况。这样一来&#xff0c;账号在认证或年审时就不…

Android EditText 的 属性android:digits 限制输入的字符

在android开发中&#xff0c;在某些场景中&#xff0c;需要限制用户输入的字符&#xff1b; 比如输入电话号码&#xff0c;只能输入数字&#xff0c;输入IPV4只能输入数字和“.”&#xff0c;IPV6只能输入数字字符和“&#xff1a;”&#xff0c;等等。 在Android EditText输…

第十五届蓝桥杯C/C++B组题解

第十五届蓝桥杯大赛软件类省赛C/C大学B组 赛题链接A握手问题B小球反弹C好数DR格式E宝石组合F数字接龙G爬山H拔河

【GlobalMapper精品教程】074:从Lidar点云创建3D地形模型

本文基于地形点云数据,基于泊松方法、贪婪三角形测量方法和阿尔法形状创建3d地形模型。 文章目录 一、加载地形点云数据二、创建三维地形模型1. 泊松方法2. 贪婪三角形测量方法3. 阿尔法形状注意事项一、加载地形点云数据 加载配套案例数据包中的data074.rar中的地形点云数据…

NumPy 1.26 中文官方指南(四)

附加文件 术语表 原文&#xff1a;numpy.org/doc/1.26/glossary.html (n,) 括号中跟着逗号的数字表示一个具有一个元素的元组。尾随逗号将一个元素元组与括号n区分开。 -1 在维度入口中&#xff0c;指示 NumPy 选择长度&#xff0c;以保持数组元素总数不变。 >>> n…

OpenHarmony实战开发-按钮 (Button)

Button是按钮组件&#xff0c;通常用于响应用户的点击操作&#xff0c;其类型包括胶囊按钮、圆形按钮、普通按钮。Button做为容器使用时可以通过添加子组件实现包含文字、图片等元素的按钮。具体用法请参考Button。 创建按钮 Button通过调用接口来创建&#xff0c;接口调用有…

9.Godot数组|遍历|静态变量|对象|调试

数组和字典的遍历 数组的概念 数组是一组数据的集合。在程序中负责批量处理数据。数组中的元素可以包括各个类型的数据&#xff0c;也可以对数组内数据类型进行限定。可以通过 数组名【数字】 的形式来访问数组元素&#xff0c;数字 0 代表数组的第一个元素。数组可以通过调用…

Vue 3新特性解析

Vue 3是Vue.js框架的最新版本&#xff0c;带来了一些重要的新特性和改进。以下是Vue 3的一些新特性解析&#xff1a; Composition API&#xff1a;Vue 3引入了Composition API&#xff0c;它提供了一种新的组织和重用组件逻辑的方式。通过Composition API&#xff0c;可以将相关…

Spring AOP

AOP即 Aspect Oriented Programming 面向切面编程。 切面指的是某一类特定的问题&#xff0c;面向切面编程即解决某一类问题&#xff0c;例如前面我们介绍的拦截器&#xff0c;统一数据返回&#xff0c;统一异常处理。 AOP 是一种思想&#xff0c;它的实现方法有很多&#xf…

Python项目开发实战:怎么实现端口扫描器

注意:本文的下载教程,与以下文章的思路有相同点,也有不同点,最终目标只是让读者从多维度去熟练掌握本知识点。 下载教程:Python项目开发实战_端口扫描器的实现_编程案例解析实例详解课程教程.pdf 1、步骤 在Python项目开发中,设计并实现一个端口扫描器是一项基础且实用的…

K8s: 在Pod中将configmap数据注入容器

configMap 概述 文档: https://kubernetes.io/zh-cn/docs/concepts/configuration/configmap/ Kubernetes 为我们提供了 ConfigMap&#xff0c;可以方便的配置一些变量 是一个存储键值对 key-value 对象的 创建一个可以包含多个键值对的 ConfigMap, 以下是&#xff1a;mul-c…

【JavaEE多线程】线程中断 interrupt()

系列文章目录 &#x1f308;座右铭&#x1f308;&#xff1a;人的一生这么长、你凭什么用短短的几年去衡量自己的一生&#xff01; &#x1f495;个人主页:清灵白羽 漾情天殇_计算机底层原理,深度解析C,自顶向下看Java-CSDN博客 ❤️相关文章❤️&#xff1a;清灵白羽 漾情天…

Guitar Pro怎么循环某个段落 Guitar Pro怎么调整吉他谱段落间距

在学习音乐的过程中&#xff0c;不断地重复听和练习是提高技能的关键。对于吉他手来说&#xff0c;利用专业的乐谱软件如Guitar Pro可以极大地辅助练习&#xff0c;尤其是在需要反复播放某个段落时。下面来看看Guitar Pro怎么循环某个段落&#xff0c;Guitar Pro怎么调整吉他谱…

内网pth横向渗透思路笔记

PTH 是 Pass the hash&#xff0c; 哈希传递攻击 的缩写。其原理是通过直接找到与账户相关的密码 Hash 值&#xff08;通常是 NTML Hash&#xff09;&#xff0c;由于域环境中&#xff0c;域管理员与本地管理员的账户大概率都是相同的&#xff0c;利用这种场景&#xff0c;使用…

MySQL 8.0.23 临时表空间文件ibtmp1暴增原因及解决方法

背景描述 同事反馈现场的MySQL8.0.23支撑库异常停止。分析发现是临时表空间过大撑爆了磁盘导致MySQL异常终止。 分析过程 查看MySQL版本 [rootsjjhpt182 mysql]# mysql -V mysql Ver 8.0.23 for Linux on x86_64 (MySQL Community Server - GPL) You have mail in /var/spool/m…

vue3:组合式API和选项式API里分别如何使用store

vue3越来越主流了&#xff0c;但是很多人还不习惯vue3的组合式API写法&#xff0c;依旧喜欢用选项是API&#xff0c;但是很多功能的写法是不同的&#xff0c;比如我今天要分享的store写法。 我用的store是pinia。 选项式API&#xff08;script里不带setup&#xff09;的写法&…

uniapp

uniapp教程 uniapp项目新建 uniapp官网 新建Uniapp项目&#xff1a; 1. 2.

鸿蒙OpenHarmony【轻量系统 编写“Hello World”程序】 (基于Hi3861开发板)

编写“Hello World”程序 下方将通过修改源码的方式展示如何编写简单程序&#xff0c;输出“Hello world”。请在下载的源码目录中进行下述操作。 确定目录结构。 开发者编写业务时&#xff0c;务必先在./applications/sample/wifi-iot/app路径下新建一个目录&#xff08;或一…

Java数据结构-二叉树

目录 1. 树与二叉树1.1 树1.2 二叉树1.3 树的相关概念1.4 特殊的二叉树1.5 二叉树性质1.6 二叉树的存储与表示方法 2. 二叉树遍历2.1 前序遍历2.2 中序遍历2.3 后序遍历2.4 层序遍历 3. 二叉树基本操作3.1 求树的所有结点个数3.2 求叶子结点个数3.3 求第k层结点个数3.4 求二叉树…

【FineBI】强大处理、分析和可视化数据的工具

文章目录 前言功能丰富的数据处理深入的数据分析交互式的数据可视化协作与共享无缝的集成 总结 前言 在当今数据驱动的商业环境中&#xff0c;企业需要强大的工具来处理、分析和可视化数据&#xff0c;以便做出更明智的决策。FineBI就是这样一个工具&#xff0c;它是一个全面的…