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

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是什么.而且之前的乱码问题没有了.

相关文章:

  • HK1RBOX K8 RK3528 Via浏览器_插件_央视频的组合验证(失败)
  • AVFormatContext 再分析
  • python+adafruit_pca9685 测试舵机存储当前角度
  • 中国区域250米归一化植被指数数据集(2000-2023)
  • 数据库3,
  • 前端Ui设计工具
  • BP 算法探秘 :神经网络的幕后引擎
  • 单值映射、多值映射
  • 单点登录(双token)的简单总结
  • C++ 类与对象(中)—— 默认成员函数与运算符重载的深度解析:构造函数,析构函数,拷贝构造函数,赋值运算符重载,普通取地址重载,const取地址重载
  • Java使用微信云服务HTTP API操作微信云开发数据库
  • WebGIS面试题目整合资料
  • 《TVM模式匹配实战:从DFPatternNode到DFPattern的高级用法》
  • PPIO X OWL:一键开启任务自动化的高效革命
  • Codeforces Round 1021 (Div. 2) D. Baggage Claim(建图)
  • PLC在仪表控制系统中的应用
  • 代码随想录算法训练营第60期第二十天打卡
  • Python爬虫(6)静态页面解析实战:BeautifulSoup与lxml(XPath)高效提取数据指南
  • 能源行业数字化转型:利用大数据与人工智能提升效率与可持续性
  • MCP Server On FC 之旅1: MCP 协议的深度解析与云上适配最佳实践
  • 对外投资增长、消费市场持续升温,中国经济砥砺前行
  • 经济日报:AI时代如何寻找“你的赛道”
  • 中国人民对外友好协会代表团访问美国
  • 广州多条BRT相关线路将停运,全市BRT客运量较高峰时大幅下降
  • 李彦宏:DeepSeek不是万能,多模态将是未来基础模型的标配
  • 潘功胜在美谈关税:吁全球经济勿滑向“高摩擦、低信任”轨道