当前位置: 首页 > web >正文

Servlet (简单的servlet的hello world程序)

Servlet

servlet在20年前左右,是网站开发的一种主力技术.

现在随着时间的推移,Java这个圈子中,逐渐使用spring代替了servlet.现在讲servlet,目的有两个方面.

1.spring作为一个框架.底层仍然是需要调用servlet里的一些api的,包括熟悉servlet有助于理解spring工作原理.包括spring有些接一口也会暴露出servlet的一些影子.

2.学习servlet,不仅仅是学习servlet api本身,更主要的是学习"web开发"这件事情(为了开发一个网站,你需要做哪些事情).

页面主要分为静态页面和动态页面.静态页面就是你无论什么时候,打开这个页面,他都是一成不变的.而动态页面,往往是在请求发起的时候,由服务器通过一系列运算,动态生成的页面.

servlet主要解决的问题,就是为了实现动态页面.

简单的servlet的hello world程序

1.创建项目

这里需要创建一个Maven项目

这一组现在用不到,但是如果你要把你先的程序放到Maven中央仓库上,就需要通过这几个属性来做区分.联合到一起,就相当于一个 库 的身份标识.

2.引入依赖

当前的代码要使用servlet开发.而servlet并不是Java标准库自带的.就需要让Maven能够把servlet的依赖给获取过来.

需要先找到Maven中央仓库.

选择这个版本.

servlet的版本,和Tomcat的版本是有对应关系的.Tomcat使用8,servlet就是3.1,如果不匹配就可能出现问题.

我们将servlet引入到Maven里面.先手动创建一个标签,把刚才的坐标复制到这个标签里.此时idea就会自动的通过Maven从中央仓库来下载这里的依赖.

如果等了很久还不行,可以点击这里的刷新,手动重新下载

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

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

Tomcat对于servlet项目,是有一些额外要求的.Maven是一个通用的工具,可以管理的不仅仅是servlet项目,还可以管理其他的项目.在这个基础上,在按照servlet项目的要求,创建出一些特定的目录和文件.

目录结构和名字都是固定的.

web.xml就是告诉Tomcat,我现在这个目录里的东西就是一个webapp,你就要把我加载起来.

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中

(这里的标红并非是报错,不影响后续程序的运行.)

1.复制红色部分的代码

file --> settings- -> languages & frameworks -->Schemas and DTDs

解决

这个文件叫做schema文件,描述了该xml里面的格式是怎样的.(哪些标签是合法的,哪些不合法,如何进行嵌套等)idea拿到这个文件,就可以针对你的xml进行代码补全了.

4.编写代码

这个类,是前面的servlet的jar包,提供的父类.编写servlet程序一般都需要继承这个类.

继承不是目的,真正的目的是为了重写父类的方法

req:代表这次请求的http请求内容.

resp:代表这次请求要返回的http响应内容.

这个方法不需要咱们手动调用,doGet本质上也是一个"回调函数"把这个方法写好之后,就会交给Tomcat,Tomcat在收到一个合适的GET请求的时候就会自动调用doGet.调用doGet的时候,Tomcat就会解析这次的http请求,生成一个HttpServletRequest对象.(这个对象里的属性什么的都是个http协议格式匹配的)相当于Tomcat帮我们吧http请求给解析好了.同时,Tomcat也会构造出一个空的 HttpServletResponse 对象(这里的空不是指 null 而是一个new好的但是没有初始化属性的对象),把这个resp对象也会传递到doGet里面.doGet要做的事情,就是根据这次的请求(req),计算出响应(resp).doGet里面的代码,就要根据req里不同的参数的细节,生成一个具体的resp对象(往空的对象里设置属性)Tomcat就会根据这个响应对象,转换成符合HTTP协议的响应报文,返回给浏览器了.

总而言之,doGet就是根据请求计算响应.

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

1.读取请求并解析

2.根据请求计算响应

3.把响应写回到客户端

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

注意:这行代码一定要删除掉,否则会有问题.

我们还需要手动打上这个注解,这个注解就把当前这个Servlet类,和一个请求的路径关联起来了.(配置路由)

Tomcat会在合适的时机,自动调用doGet.

1.请求的方法,是否是GET

GET=>doGet

POST=>doPost

PUT=>doPut

...

2.请求的路径.URL后面带有层次结构的路径.

一个Servlet程序里,可能有多个servlet类的.这些servlet类,就需要在不同的情况下被执行到了

当请求的路径中带有hello的时候,才能执行到咱们这个HelloServlet的代码.不同的Servlet类,就可以关联到不同的路径.

至此,helllo word程序就写完了.

Servlet程序,不需要main方法.一个程序,是需要有main方法作为入口的.实际上,咱们在这里写的这个代码,并不是独立的程序.而是放到Tomcat上执行的.main方法其实是在Tomcat里的,咱们写的这些doGet之类的都是让Tomcat来调用的.

5.打包程序

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

同时"打包"也是借助Maven完成的.

这个就是打包选项

只要出现SUCCESS,那就成功了,注意,首次打包会很慢很慢.

打包成功之后

在左侧会出现target,里面可以看到实际上我们是将代码打包成一个jar包了,但是Tomcat要的不是jar包而是war包.war包本质上和jar包差不多,war包中会包含一些前端的代码(html,css,js),以及一些Tomcat的配置(web.xml)

下面的finalName设置的是打出的war包的包的名字(改名字不是必须的)

6.部署

部署的前提是Tomcat是运行的.

将war包复制到Tomcat的这个目录下

若你的Tomcat处于运行状态下,那么Tomcat就会对这个war包进行解压缩

同时Tomcat中也会多出来几行日志,这就是发现了新的war包,对这个war包进行部署.

7.验证程序是否可以正常工作

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

其中在这里,application path : webappTest

就是war包解压出来的文件名字

servlet path : hello

是这里的路径

通过第一级路径来确定一个webapp

通过第二级路径确定哪个servlet

通过方法确定执行servlet中的哪个方法

此时在页面上就展示出了hello word

这行代码的功劳.

注意如果出现Tomcat正常运行但是浏览器正常转圈.

只需要在Tomcat里面敲几个回车就出来了.

原因:之所以有这种情况,是因为CMD在搞鬼

通过上述七个步骤,hello word 就写完了.

如果需要修改代码,就需要重复上述 5 6 7,是比较麻烦的.当然了,也有大佬想出了办法,可以让我们简化这个修改的过程.让idea和Tomcat集成起来.直接使用idea图形化界面把你的代码部署到Tomcat上达成"一键式打包&部署"过程.

在idea中安装SmartTomcat插件.

在一个项目中,第一次使用,需要配置一下

下面配置一下名字以及ContentPath的名字,以及找到你当前电脑上Tomcat的路径即可

运行结果

但是不要去点击那个链接,此处只是提示你contextPath是什么.而且之前的乱码问题没有了.

http://www.xdnf.cn/news/2578.html

相关文章:

  • SAP-pp 怎么通过底表的手段查找BOM的全部ECN变更历史
  • 小红书笔记详情API接口概述及JSON数据返回参考
  • element通过业务按钮点击导入,调用el-upload的导入方法
  • Redis缓存问题的深度解析与解决方案
  • c++的匿名函数捕获
  • 代码小优化
  • Babel、core-js、Loader之间的关系和作用全解析
  • 人类社会的第四阶段
  • 【C语言练习】006. 编写条件语句处理不同情况
  • Spring中生成Bean的方式总结-笔记
  • Customizing Materials Management with SAP ERP Operations
  • Spark-Streaming核心编程内容总结
  • CSS布局实战:Flexbox 与 Grid 精髓解析
  • ecovadis认证评估标准?ecovadis审核目的?
  • 网络安全厂商F5荣登2025 CRN AI 100榜单,释放AI潜力
  • Vue3 里 CSS 深度作用选择器 :deep()
  • HQChart k线图配置
  • BUUCTF——The mystery of ip
  • mac 设置飞书默认浏览器(解决系统设置默认浏览器无效)
  • Nacos简介—4.Nacos架构和原理二
  • [AHOI2001] 质数和分解
  • 蓝桥杯 16. 密文搜索
  • Zookeeper实现分布式锁实战应用
  • 启效云平台审核流应用场景及功能介绍
  • day51—二分法—x 的平方根(LeetCode-69)
  • Gin 框架中集成 runtime/debug 打印日志堆栈信息
  • 2025.4.22 JavaScript 常用事件学习笔记
  • 司法大模型构建指南
  • 问题四、如何解决模型轴配置问题
  • 高功率无人机动力方案首选:CKESC ROCK 220A-H CAN 电调工程性能实测