4、编写servlet代码
经过上面的分析,我们可以知道,我具体的servlet代码是要在doGet这个方法中写的,下面我们深入这个方法来看一下
🤔你以为到了这里就大功告成了吗?
我们要实现的是通过在浏览器输入url(发一个HTTP的get请求),进而通过tomcat服务器来调用我们这个doGet。
当我们成功给tomcat发了一个get请求,tomcat怎么知道要调用具体哪个servlet代码呢?
这里我们希望调用我们HelloServlet类中的doGet方法,那么我们就需要给我们这个类添加一个“标识符”,同时把这个标识符写到在浏览器url中中,这样tomcat就能够识别到这个请求具体是要调用哪个servlet代码了。
5、打包
刚刚我们编写的servlet代码是不能单独运行的
我们的servlet程序要卸载Tomcat才能正确执行,这里我们的servlet代码就相当于是一节节的车厢,光有车厢不能跑起来,还需要车头——也就是Tomcat的帮助才能跑起来
打包就是把你车厢和车头连接起来,让车头Tomcat拖着我们的车厢Servlet程序来执行
下面我们看一下打包的具体实现过程
6、部署
把 war 包拷贝到 Tomcat 的 webapps 目录下
让Tomcat(车头)拖着它执行。
7、验证程序
其实就是看看能不能通过tomcat服务器在浏览器来访问我们的servlet代码
📝一点补充
与HTML生成页面不同,我们当前的通过Servlet生成的页面是动态的,根据用户输入的不同,是可以得到不同的显示效果的。
此外当我们修改了servlet代码后,我们需要重写进行打包、部署、然后再验证程序。
注意:我们在重新部署时候,最好重启一下tomcat
不过如果每次改了代码,我们都要重新打包生成一个.war文件,然后再把这个新的.war文件放到tomcat目录中的webapps目录下,然后再找到bin目录下的startup.bat文件重新启动tomcat。这样子的确十分的麻烦。
为此我们可以借助第三方工具:smart tomcat来简化我们的打包和部署
smart tomcat这个idea里的一个插件,就 保证我们把tomcat服务器和我们的idea关联起来。保证我们一键式完成打包和部署操作。
但是我们要知道idea 和 tomcat是两个独立的程序!!! tomcat部署idea功能的一部分 ,tomcat只是通过idea插件:smart tomcat,来和我们的idea建立起来一个合作的桥梁。
为什么要提这一点?
这是因为后面开发,主要还是通过 idea 调用 Tomcat的方式来进行。
用的时间长了之后,大家就对于 Tomcat的印象,就开始模糊。
甚至会产生 Tomcat 是 idea 功能的一部分,这样的错觉!
以后大家在工作中,会涉及到几个不同的环境。
📝smart tomcat的使用
使用 Smart Tomcat 部署的时候, 我们发现 Tomcat 的 webapps 内部并没有被拷贝一个 war 包,也没有看到解压缩的内容.
Smart Tomcat 相当于是在 Tomcat 启动的时候直接引用了项目中的 webapp 和 target 目录(@WebServlet()中的内容).
🍑ServletAPI详解
1、HttpServlet
相信通过上面我们第一个hello world程序,大家应该已经知道了。我们写的servlet代码总是继承自HttpServlet这个类——我们就是重写其中的doPost、doGet等相关方法来被Tomcat执行调用的
这个过程 和 继承 有关,就会涉及到Java中的一个核心语法 “多态”。
在我们学习Java的时候,多态就是我们一个难啃的骨头。
如果以后在面试的时候,被面试官问到。
让你讲讲对多态的理解,最好方式就是 举例子。
最好举一些有意义的例子,并且最好是关于代码的。
比如:
集合类: List list = new ArrayList<>();
多线程:class Mythred extends Thread{ 重写 run方法 }
像这种平常刷题经常会用到的代码,用来举例是最好的。
另外,Servlet 也是一个很好的例子!
因为我们自己写的代码也是通过继承重写的方式来实现的。
因此在执行的过程,是一定会涉及到 “多态的”!
HttpServlet的核心方法
我们实际开发的时候主要重写 doXXX 方法, 很少会重写 init / destory / service
🌰这些方法的调用时机, 就称为 "Servlet 生命周期". (也就是描述了一个 Servlet 实例从生到死的过
程
Servlet生命周期描述的是Servlet创建到销毁的过程:
当一个请求从HTTP服务器转发给Servlet容器时,容器检查对应的Servlet是否创建,没有创建就实例化该Servlet,并调用init()方法,init()方法只调用一次,之后的请求都从第二步开始执行;
请求进入service()方法,根据请求类型转发给对应的方法处理,如doGet, doPost, 等等
容器停止前,调用destroy()方法,进行清理操作,该方法只调用一次,随后JVM回收资源。
注意:Httpservlet实例只是再程序启动时,创建一次,而不是每次收到HTTP请求都重新创建实例
其中的doGet和doPost等doxx方法,是根据HTTP的请求的不同来分别执行的。
doGet处理get请求,doPost处理post请求,doPut处理put请求
2、HtttpServletRequest
核心方法
代码案例
自动刷新
- 实现 Servlet, 设置 header, 实现每隔 1s 自动刷新页面的效果. 页面上要显示当前时间戳
2、让页面上能够显示格式化的事前. 例如 2022-01-19 12:00:00
3、重定向:访问 /redirect 路径后, 自动重定向到 搜狗主页 的代码.
光理解了 Servlet API,还不足以支撑我们写出一个功能完整的网站。
还需要理解一个网站的开发过程大概是什么样子的。
理解这里的一些基本的编程思维 和 设计思路。
这就需要通过更多的案例,来进行强化了。
下篇博文就让我们一起事情一个服务器版本的表白墙(注意不只是单单的前端HTML文件哦,还有与之相对应的后端代码——说白了就是一个简单的前后端交互的栗子)