Servlet 新手村引入-编写一个简单的servlet项目

news2025/2/23 12:10:08

Servlet 新手村引入-编写一个简单的servlet项目

文章目录

  • Servlet 新手村引入-编写一个简单的servlet项目
    • 一、编写一个 Hello world 项目
      • 1.创建项目
      • 2.引入依赖
      • 3.手动创建一些必要的目录/文件
      • 4.编写代码
      • 5.打包程序
      • 6.部署
      • 7.验证程序
    • 二、更方便的处理方案(插件引入)
      • 1.引入插件
      • 2.配置插件
      • 3.问题分析

上篇博客讲到, Tomcat 提供了一些列的 api 接口,这些 api 背后已经把一些基础工作做好了。Tomcat 把这组 api 起了个名字,称为 Servlet。

Java 程序员,只需要调用上述 api,通过少量的代码,就可以完成基本的 http服务器的核心功能。

相比于上篇 Tomcat 中讲到的 静态页面,Servlet 主要的解决的问题,就是为了实现 动态页面。

下面我们就通过 Java 来编写一个最简单的 servlet 的 Hello World 程序。

一、编写一个 Hello world 项目

1.创建项目

创建一个 Maven 项目。Maven 是 java 中一个常用的“构建工具”,一个程序在编写过程中,往往需要涉及到一些第三方库的依赖,另外还需要针对这个写好的程序进行打包部署。

Maven 存在的意义,就是为了能够方便的进行依赖管理和打包。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

观察创建好项目。外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

2.引入依赖

当前代码要使用 Servlet 开发,而 Servlet 并不是 Java 标准库自带的。就需要让 Maven 能够把 Servlet 的依赖给获取过来。需要先找到 maven 中央仓库。在中央仓库中找到 Java Servlt API.

Maven 中央仓库地址(点击跳转)

Java Servlet API 有很多个版本,具体要选择哪个版本是和 Tomcat 的版本,有对应关系的。Tomcat 使用 8,Servlet 就是3.1 如果不匹配,就可能出现问题。

这段代码就是 Maven 仓库中版本为 3.1.0 的坐标外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

把依赖引入外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

首次使用,是最慢的。后面就快了(首次使用需要加载不少的依赖),下载的过程是需要时间的。

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

Tomcat 对于 Servlet项目,是有一些额外的要求的。Maven 是一个通用的工具,可以管理的不仅仅是Servlet项目,还可以管理其他的项目。在这个基础上,再按照Servlet项目的要求,创建出一些特定的目录和文件。外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

web.xml 里,还需要写一些内容,不能是空着的。这里的内容是固定的内容,不需要咱们去背下来,只需要从别的项目中复制粘贴过来即可。下列代码就可以直接放到 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>

(第三行代码可能是标红的,对于 idea 来说,只能保证针对java程序的提示是准确的。其他的文件,提示,仅供参考!!! 如果实在觉得难受可以 alt+enter ,把这个问题处理一下,fetch 忽略掉 ignore)

4.编写代码

在 java 目录中创建一个类 HelloServlet,代码如下:

//这个注解,就把当前这个Servlet类,和一个请求的路径关联起来了(配置路由)
@WebServlet("/hello")
//继承是为了重写这个父类中的方法。
public class HelloServlet extends HttpServlet {
    @Override
    //调用父类doGet,这个方法不需要手动调用,doGet本质上也是一个“回调函数”,方法写好后,就会交给Tomcat
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //下列代码一定要删掉,否则就会出现问题。
        //super.doGet(req,resp);

        //是在服务器日志中产生的 (tomcat)
        System.out.println("Hello World");
        
        //想要把hello world 返回给客户端,还需要进一步的使用下列代码。
        //resp是未初始化过的响应对象,doGet的目的就是把这个对象给设置好。通过getwriter得到resp里面内置的输出流对象(Writer字符流),最后使用 write方法,就可以把一个字符串写入到resp对象中。把数据写入到了 HTTP 响应的body中。
        resp.getWriter().write("hello world");
    }
}

总之,doGet 做的事,就是根据请求计算响应。

前面写 echo server 的时候,一个服务器,典型的工作流程,就是三步:

  1. 读取请求并解析
  2. 根据请求计算响应
  3. 把响应写回到客户端

这个过程体现了服务器的业务逻辑,1 3都是相对固定的操作。而在 Servlet 这块,1 3 都是Tomcat 帮我们完成的。咱们写代码只需要关注 2。也就是doGet要完成的工作。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

5.打包程序

因为咱们的程序是放到 Tomcat 上运行,就需要对于程序进行打包。达成一个 Tomcat 能识别的包的格式,此时代码才会被 Tomcat 给加载起来。

打包也是借助 maven 来完成的。打开 maven 窗口(一般在 IDEA 右侧就可以看到 Maven 窗口,如果看不到的话,可以通过 菜单-View-Tool Window-Maven 打开),然后展开Lifecycle,双击 package 即可进行打包。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

如果看到 BUILD SUCCESS 字样,说明打包成功了。外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

这就是通过 maven 打包生成的内容。在 maven 中,默认打包生成的是jar包。(常用的 java 的打包方式,jar 里面就是一些 .class文件)但是Tomcat需要的并非是 jar 包,而是 war 包。外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

war包本质上和 jar 包差不多,这里会包含一些前端的代码(html,css,js),以及一些 tomcat 的配置(web.xml)

此处需要修改 pom.xml,在这里添加一个 标签。(的子标签,层次结构不要搞错)外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

这个东西描述了打的包的名字是啥。(不是必须的,同样是的子标签)外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

此时再次进行打包,文件中就会生成如下war文件。外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

6.部署

启动 tomcat ,将写好的 war 包,放到 tomcat 上。具体来说,就是把这个 war 包拷贝到 tomcat 的 webapps 目录中。外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

发现新的war包,对war包进行部署操作。外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

7.验证程序

通过浏览器发起 http get 请求,触发刚才 servlet 的代码。

127.0.0.1:8080/java_hello/hello

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  • 通过 第一级 路径,确定一个 webapp
  • 通过 第二级 路径,确定哪个 servlet
  • 通过 方法,确定执行 servlet 中的哪个方法

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

问题1:在你检查了所有代码都是正确的,但是最后利用浏览器发起请求的时候,出现加载不出来的情况。外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

之所以出现这个情况,是 cmd 在搞鬼!!比如你选中了 cmd 中的某个内容,cmd 就会进入“复制”模式,此时按下 enter 就是完成复制。外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

进入复制模式的过程中,cmd 就会把正在运行的进程给阻塞掉。

问题2:针对上述 7 步操作,能否简化一下?

也是有办法的!后续学习的 Spring 就是做出了简化后的效果。

二、更方便的处理方案(插件引入)

1.引入插件

手动拷贝 war 包到 Tomcat 的过程比较麻烦。我们还有更方便的方法。

此处我们使用 IDEA 中的 Smart Tomcat 插件完成这个工作。

理解“插件”

插件会提升我们软件的可修改性、可维护性、可移植性。

插件就是对程序的一些特定场景,做出一些特定的功能的扩展

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

同学们可能会出现 插件市场 加载不出来的情况,也可以去官网下载,手动安装。下载之后,会得到一个 jar 包,把这个 jar 包拖到 idea 的界面上,就能安装插件。

2.配置插件

一个项目中,第一次使用 smart tomcat 需要简单配置一下。配置一次之后,后续就不需要配置了。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

出现问题:当我们配置完插件后启动程序,会发现端口号已被占用,这是因为咱们之前启动了 Tomcat,之前的 Tomcat 已经占用了 8080。一个端口号只能被一个进程绑定,解决方法就是把之前的 tomcat 关闭,再启动此程序外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

3.问题分析

  • 404 浏览器要访问的资源,在服务器上不存在。

    1. 检查你的请求路径,和你服务器这边的配置,是否一致。外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

    2. 确认你的 webapp 是否被正确加载。

      smart tomcat 由于只是加载你这一个 webapp。如果加载失败,就会直接启动失败!!我们要学会观察日志,观察是否有“部署成功”。

  • 405 外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

    1. 写的 doXX 方法,和请求发起的方法,不匹配。浏览器发 Get 请求,服务器代码写的是 doPost。
    2. 发的是 Get 请求,服务器写的也是Get请求,但是没有把 super.doPost 给删了。
  • 505 服务器内部错误,代码中抛出异常了。出现 500 后一定要仔细观察异常调用栈外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  • 出现空白页

    往往就是没有执行 getWriter().write 方法

  • 无法访问此网站

    这种情况,要么是 tomcat 服务器,没有正确运行。要么就是 ip 或者 端口号 编写的不对!!

感谢观看,下期继续分享 servlet 相关知识!!

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

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

相关文章

c++阶梯之内存管理

目录 1.c/c内存分布 2. C语言中的动态内存管理方式&#xff1a;malloc/calloc/realloc/free 3.c的内存管理方式 3.1 new/delete操作内置类型 3.2 new/delete操作自定义类型 3.3 实践中总结new与malloc的区别 1. new的用法比malloc更加的简单 2. new可以控制初始化&am…

C# OpenVINO Nail Seg 指甲分割 指甲检测

目录 效果 模型信息 项目 代码 数据集 下载 C# OpenVINO Nail Seg 指甲分割 指甲检测 效果 模型信息 Model Properties ------------------------- date&#xff1a;2024-02-29T16:41:28.273760 author&#xff1a;Ultralytics task&#xff1a;segment version&#…

遥感、航拍、影像等用于深度学习的数据集集合

遥感图像的纹理特征异常繁杂&#xff0c;地貌类型多变&#xff0c;人工提取往往存在特征提取困难和特征提取不准确的问题&#xff0c;同时&#xff0c;在这个过程中还会耗费海量的人力物力。随着计算力的突破、数据洪流的暴发和算法的不断创新&#xff0c;在具有鲜明“大数据”…

Python爬虫——Urllib库-上

这几天都在为了蓝桥杯做准备&#xff0c;一直在刷算法题&#xff0c;确实刷算法题的过程是及其的枯燥且枯燥的。于是我还是决定给自己找点成就感出来&#xff0c;那么Python的爬虫就这样开始学习了。 注&#xff1a;文章源于观看尚硅谷爬虫视频后笔记 目录 Urllib库 基本使…

Html零基础入门教程(非常详细)

文章目录 1.认识HTML2.html 框架3.HTML常见标签4.HTML语法特征5.列表 1.认识HTML html是超文本标记语言: 目前最新版本是html5,由w3c(万维网联盟)完成标准制定。 声明文档的类型是html5 超文本标记语言。 HTML &#xff0c;全称“Hyper Text Markup Language&#xff08;超文…

微信小程序图片展示淡入淡出纯WXSS实现,无需使用消耗性能的动画引擎

进入下面小程序可以体验效果&#xff1a; 以下代码的淡入淡出是切换图片的时候动画效果显示的。需要用其他方式&#xff0c;可以基于这个wxss修改即可 原理就是&#xff0c;图片默认样式的opacity 是 0&#xff0c;通过变量改变样式的opacity即可&#xff0c;然后需要有transi…

Vue纯前端实现链接生成二维码并支持下载

你好&#xff0c;我是小白Coding日志&#xff0c;一个热爱技术的程序员。在这里&#xff0c;我分享自己在编程和技术世界中的学习心得和体会。希望我的文章能够给你带来一些灵感和帮助。欢迎来到我的博客&#xff0c;一起在技术的世界里探索前行吧&#xff01; 在现代 Web 应用…

(C语言)Sleep函数,system函数,数组练习,详解与运用

一维数组详解&#xff1a;http://t.csdnimg.cn/zahZF 二维数组详解&#xff1a;http://t.csdnimg.cn/h2mLe 我们看过可一维数组与二维数组&#xff0c;现在我们来进行简单的练习。 题目&#xff1a;编写代码&#xff0c;演⽰多个字符从两端移动&#xff0c;向中间汇聚 1. …

DFS之剪枝与优化

剪枝 1.优化搜索顺序&#xff1a;在大部分情况下&#xff0c;我们应该优先搜索分支较少的结点 2.排除等效冗余&#xff08;在不考虑顺序的情况下&#xff0c;尽量用组合的方式来搜索&#xff09; 3.可行性剪枝 4.最优性剪枝 5.记忆化搜索 165. 小猫爬山 - AcWing题库 import …

【快速上手QT】06-检测按键检测鼠标

今天聊聊事件&#xff0c;实际上我们在前两篇文章中就已经接触到了事件&#xff0c;分别是定时器事件和绘画事件&#xff0c;今天我们再来看看其他的事件。 我们打开QT助手&#xff0c;在QWidget的界面中找到下图中的地方。 我们可以看到很多函数的结尾都是Event&#xff0c;那…

日本极致产品力|200人的小型家族企业,如何年销7亿块巧克力?

蒂罗尔巧克力是日本经典的巧克力品牌。糖果业务是其早期的主营业务&#xff0c;在主营业务下滑的情况下&#xff0c;确立新的竞争方向、打造新产品、寻找新方法&#xff0c;成就巧克力极致产品力重回增长。 竞争环境变化&#xff1a;糖果主营业务持续下滑 始于1903年的松尾株式…

云原生架构技术揭秘:探索容器技术的奥秘

云原生的概念和演进都是围绕云计算的核心价值展开的&#xff0c;比如弹性、自动化、韧性&#xff0c;所以云原生所涵盖的技术领域非常丰富。 随着云计算技术的不断发展&#xff0c;云原生架构已经成为了新一代软件开发的重要趋势。本文将为您介绍云原生架构的相关技术&#xf…

产品经理岗位的任职资格和职业规划

产品经理主要是商业银行以客户为导向的&#xff0c;具体负责组织银行某一金融产品线的创新设计、生产营销和管理服务的工作。这类人士主要负责应用实施工作&#xff0c;其中产品线由一系列的产品构成&#xff0c;公司的产品经理主要分为全过程产品创新设计专家、全过程产品生产…

Decision Transformer

DT个人理解 emmm, 这里的Transformer 就和最近接触到的whisper一样,比起传统Transformer,自己还设计了针对特殊情况的tokens。比如whisper里对SOT,起始时间,语言种类等都指定了特殊tokens去做Decoder的输入和输出。 DT这里的作为输入的Tokens由RL里喜闻乐见的历史数据:…

QtCreator报Failed to parse qmlimportscanner output解决

错误如下: 定位错误位置 增加错误信息打印 打印执行命令 执行打印输出的命令,成功返回JSON 但输出的JSON对象不是json格式,而是命令 增加$$成功输出JSON 使用QtCreator12编译一次后,再使用QtCreator13成功编译通过,问题解决

Floyd算法、Dijkstra算法、基础拓扑排序

Floyd算法 Dijkstra算法 基础拓扑排序

TikTok运营应该使用什么IP?网络问题大全

想要迈过TikTok新手门槛&#xff0c;首先必须要学习的就是网络问题。很多人开始做TikTok账号或者TikTok小店时&#xff0c;都会遇到一些先前没有遇到的词汇和概念&#xff0c;比如原生IP&#xff0c;独享IP&#xff0c;甚至专线&#xff0c;那么一个IP可以做几个账号呢&#xf…

编译 qsqlmysql.dll QMYSQL driver not loaded

Qt 连接MySQL数据库&#xff0c;没有匹配的qsqlmysql.dll, 需要我们跟进自己Mysql 以及QT版本自行编译的。异常如下图&#xff1a; 安装环境为 VS2019 Qt5.12.12&#xff08;msvc2017_64、以及源码&#xff09; 我的安装地址&#xff1a;D:\Qt\Qt5.12.12 Mysql 8.1.0 默认安…

【C++从0到王者】第四十五站:图

文章目录 一、图的概念1.图概念2.顶点与边的概念3.有向图和无向图4.完全图5.邻接顶点6.顶点的度7.路径与路径长度8.简单路径与回路9.子图10.连通图与强连通图11.生成树 二、图的存储结构1.邻接矩阵1.1 基本概念1.2 代码实现 2.邻接表1.1 基本概念1.2 代码实现 3.总结 一、图的概…

如何设计一个秒杀系统?

秒杀是电商系统中常见的业务&#xff0c;用于吸引用户&#xff0c;刺激留存及消费所做的一种活动。经典的秒杀包含限时秒杀和限量秒杀。很多公司有专门的秒杀系统。哪个业务要做活动&#xff0c;就来对接这个系统。 系统特点 1、瞬时流量极大&#xff0c;过了秒杀时间点流量结束…