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

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 相关知识!!

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

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

相关文章

vue3编写H5适配横竖屏

具体思路如下&#xff1a; 1、监听浏览器屏幕变化&#xff0c;通过监听屏幕宽高&#xff0c;辨别出是横屏&#xff0c;还是竖屏状态 在项目的起始根页面进行监听&#xff0c;我就是在App.vue文件下进行监听 代码如下&#xff1a; <template><RouterView /> <…

Redis 存储原理和数据模型

redis 是不是单线程 redis 单线程指的是命令处理在一个单线程中。主线程 redis-server&#xff1a;命令处理、网络事件的监听。 辅助线程 bio_close_file&#xff1a;异步关闭大文件。bio_aof_fsync&#xff1a;异步 aof 刷盘。bio_lazy_free&#xff1a;异步清理大块内存。io_…

【前端素材】推荐优质在线高端家具电商网页Classi平台模板(附源码)

一、需求分析 1、系统定义 在线高端家具商城是一个专门销售高端家具产品的电子商务平台&#xff0c;旨在为消费者提供购买高品质家具的便捷渠道。 2、功能需求 在线高端家具商城是一个专门销售高端家具产品的电子商务平台&#xff0c;旨在为消费者提供购买高品质家具的便捷…

springboot-基础-thymeleaf配置+YAML语法

备份笔记。所有代码都是2019年测试通过的&#xff0c;如有问题请自行搜索解决&#xff01; 目录 配置thymeleafthymeleaf举例参数设置yaml基础知识YAML语法报错&#xff1a;Expecting a Mapping node but got 其他语法 spring boot不推荐使用jsp。thymeleaf是一个XML/XHTML/HTM…

react 使用 craco库 配置 @ 路径,以及 jsconfig.json或者tsconfig.json 配置智能提示

使用 craco库 来自定义CRA配置 1、概述 Craco&#xff08;Create React App Configuration Override&#xff09;是一个用于扩展 Create React App&#xff08;CRA&#xff09;配置的工具。通过 Craco&#xff0c;你可以在不弹出 Create React App 的内部配置的情况下&#x…

Entry First Day 入职恩孚第一天

入职第一天&#xff0c;电脑还没配置好就去了工厂。 熟悉了一下设备&#xff0c;切了几个小玩意&#xff0c; hello world 一下。 了解了串行端口的Nodejs的库 https://github.com/serialport/node-serialport&#xff0c;以后要用这个东西和硬件通讯&#xff0c;安装&#…

CleanMyMac X2024免费Mac电脑清理和优化工具

CleanMyMac X是一款专业的 Mac 清理和优化工具&#xff0c;它具备一系列强大的功能&#xff0c;可以帮助用户轻松管理和维护他们的 Mac 电脑。以下是一些关于 CleanMyMac X 的主要功能和特点&#xff1a; 智能清理&#xff1a;CleanMyMac X 能够智能识别并清理 Mac 上的无用文件…

mybatis原理图,我拿到了梦寐以求的字节跳动和腾讯双offer

Kafka 如何做到支持百万级 TPS &#xff1f; 先用一张思维导图直接告诉你答案&#xff1a; 顺序读写磁盘 生产者写入数据和消费者读取数据都是顺序读写的&#xff0c;先来一张图直观感受一下顺序读写和随机读写的速度&#xff1a; 从图中可以看出传统硬盘或者SSD的顺序读写甚…

map和set例题应用

个人主页&#xff1a;Lei宝啊 愿所有美好如期而遇 目录 第一题 第二题 第三题 第一题 随机链表的复制https://leetcode.cn/problems/copy-list-with-random-pointer/description/ 思路 首先遍历旧链表&#xff0c;并创建新节点&#xff0c;同时用map将旧节点与新节点…

3,设备无关位图显示

建立了一个类Dib Dib.h #pragma once #include “afx.h” class CDib :public CObject { public: CDib(); ~CDib(); char* GetFileName(); BOOL IsValid(); DWORD GetSize(); UINT GetWidth(); UINT GetHeight(); UINT GetNumberOfColors(); RGBQUAD* GetRGB(); BYTE* GetDat…

MySQL:使用聚合函数查询

提醒&#xff1a; 设定下面的语句是在数据库名为 db_book里执行的。 创建t_grade表 USE db_book; CREATE TABLE t_grade(id INT,stuName VARCHAR(20),course VARCHAR(40),score INT );为t_grade表里添加多条数据 INSERT INTO t_grade(id,stuName,course,score)VALUES(1,测试0…

一线互联网大厂中高级Android面试真题收录,记一次字节跳动Android社招面试

在开始回答前&#xff0c;先简单概括性地说说Linux现有的所有进程间IPC方式&#xff1a; 1. **管道&#xff1a;**在创建时分配一个page大小的内存&#xff0c;缓存区大小比较有限&#xff1b; 2. 消息队列&#xff1a;信息复制两次&#xff0c;额外的CPU消耗&#xff1b;不合…

今年Android面试必问的这些技术面,2024Android常见面试题

都说程序员是在吃青春饭&#xff0c;这一点的确有一点对的成分&#xff0c;以前我不这么认为&#xff0c;但随着年龄的增长&#xff0c;事实告诉我的确是这样的&#xff0c;过了30以后&#xff0c;就会发现身体各方面指标下降&#xff0c;体力和身心上都多少有点跟不上了&#…

请查收:2024年腾讯云服务器优惠价格表_租用配置报价

一张表看懂腾讯云服务器租用优惠价格表&#xff0c;一目了然&#xff0c;腾讯云服务器分为轻量应用服务器和云服务器CVM&#xff0c;CPU内存配置从2核2G、2核4G、4核8G、8核16G、4核16G、8核32G、16核32G、16核64等配置可选&#xff0c;公网带宽1M、3M、5M、12M、18M、22M、28M…

RTSP协议

1 简介 RTSP 英文全称 Real Time Streaming Protocol&#xff0c;RFC2326&#xff0c;实时流传输协议&#xff0c;是TCP/IP协议体系中的一个应用层协议&#xff01;协议主要规定定了一对多应用程序如何有效地通过IP网络传送多媒体数据。RTSP体系结位于RTP和RTCP之上&#xff08…

【Langchain多Agent实践】一个有推销功能的旅游聊天机器人

【LangchainStreamlit】旅游聊天机器人_langchain streamlit-CSDN博客 视频讲解地址&#xff1a;【Langchain Agent】带推销功能的旅游聊天机器人_哔哩哔哩_bilibili 体验地址&#xff1a; http://101.33.225.241:8503/ github地址&#xff1a;GitHub - jerry1900/langcha…

C/C++基础语法

C/C基础语法 文章目录 C/C基础语法头文件经典问题链表链表基础操作 秒数转换闰年斐波那契数列打印n阶菱形曼哈顿距离菱形图案的定义大数计算 输入输出格式化输入输出getline()函数解决cin只读入一个单词的问题fgets读入整行输出字符数组&#xff08;两种方式puts和printf&#…

#单片机(TB6600驱动42步进电机)

1.IDE:keil 2.设备:保密 3.实验&#xff1a;使用单片机通过普通IO口控制TB6600驱动42步进电机 4.时序图&#xff1a; TB6600 ENA、ENA-DIR-、DIRPUL-、PULB-、BA、A-VCC、GND使能电机&#xff08;直接悬空不接&#xff09;方向脉冲输入&#xff08;普通IO口模拟即可&#xff…

Rocky Linux 安装部署 Zabbix 6.4

一、Zabbix的简介 Zabbix是一种开源的企业级监控解决方案&#xff0c;用于实时监测服务器、网络设备和应用程序的性能和可用性。它提供了强大的数据收集、处理和可视化功能&#xff0c;同时支持事件触发、报警通知和自动化任务等功能。Zabbix易于安装和配置&#xff0c;支持跨平…

vscode在windows环境不能使用终端安装依赖

会报这样的错误提示 解决思路&#xff1a; 1、vscode用管理员打开 (非必须) 2、设置策略 打开 windows powerShell . 输入命令 set-ExecutionPolicy RemoteSigned 然后 Y . 查看是否设置成功 get-executionpolicy 3、下载总是超时&#xff0c;设置镜像源 查看镜像源 npm …