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

出错解决方案

1.404

浏览器要访问的资源在服务器上不存在.

a.检查你请求的路径,和你服务器这边的配置,是否一致

也就是contextPath以及servletPath与代码中写的是否一致.

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

smartTomcat由于只是加载你这一个webapp,如果加载失败,就会直接启动失败!!!

拷贝war的方式,Tomcat要加载多个webapp,如果加载失败,只会有日志(观察是否有"部署成功")

如果web.xml没有/目录错了/内容错了/名字拼写错了..都肯会引起加载失败!

2.405

a.写的do..方法,和请求发起的方法,不匹配

浏览器发GET请求,服务器代码写的是doPost

b.没有删除super

发的是GET请求,服务器代码写的也是doGet,但是没有吧super.doGet给删除.

3.500

服务器内部异常,也就是你服务器代码写错了.

4.空白页面

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

5.无法访问此网站

要么是Tomcat服务器无法正确运行,要么就是ip或者端口号编写不对.


http://www.mrgr.cn/news/100484.html

相关文章:

  • 小白自学python第一天
  • 鸿蒙NEXT开发正则工具类RegexUtil(ArkTs)
  • 数据库3,
  • 深度解析:具身AI机器人领域最全资源指南(含人形机器人,多足机器人,灵巧手等精选资源)
  • AUTOSAR图解==>AUTOSAR_RS_FeatureModelExchangeFormat
  • 基于esp32实现键值对存储读写c程序例程
  • C++如何使用调试器(如GDB、LLDB)进行程序调试保姆级教程(2万字长文)
  • shell命令二
  • Centos 7 ssh连接速度慢(耗时20秒+)
  • 【Node.js 】在Windows 下搭建适配 DPlayer 的轻量(简陋)级弹幕后端服务
  • 2025 VSCode中如何进行dotnet开发环境配置完整教程
  • Android 13 接入 MediaSession 指南
  • Spring框架的ObjectProvider用法-笔记
  • CI/CD自动化部署(持续集成和持续交付/部署)
  • Linux常用命令23——usermod修改用户信息
  • 《全球反空间能力》报告翻译——部分1
  • Vue3:component(组件:uniapp版本)
  • 第一个 servlet请求
  • K8S Pod 常见数据存储方案
  • Java SE(3)——程序逻辑控制,输入输出