JavaWeb基石之——Servlet

21 篇文章 3 订阅

最近一段时间,老是觉得学不爽,焦虑而急躁。归根到底,是没有一个较好的学习路径。像是还没学会走,就想飞一样。
学习,还是要按照一定的路径,一步一步来。才能学的扎实,走的稳重。以实践为指导,输出倒逼输入,才能学的更有意义,也让知识消化的更彻底。而不是一味地为了学习而学习。
就像很多人一上来就想着如何去阅读Spring源码,为什么呢?因为这样能在面试时让面试官高看自己一眼呀,很多公司现在招聘都会要求面试者阅读过什么什么源码。源码阅读没有错,也是一个想要在技术上深耕的人的必经之路。只是它应该往后放,学习不应该这么浮躁,不应该抄近道。否则,大厦的地基不牢,总有一天会倒塌的。知乎的一个回答我很认同,你连Spring的官方文档都没有认真通读过,一上来就读源码干什么?如何实现一个框架和如何用框架实现具体业务,有很大的不同。只有当你需要设计一个类似的框架,或者你需要调试进底层源码时,才需要看源码。
所有跳过读文档这一步,直接读底层源码的人,多是读不懂文档又急于求成,想给自己简历加点料而已。

就像我先前的学习一样,没有首尾,一上来就直接学SSM,然后又急着学SpringBoot,MySQL,Redis等。仿佛学了一个技术自己就更有底气。但是焦虑和惶恐一直伴随着我。因为感觉自己变成了一个机器,被推着往前走,不知道学的东西有什么用,能做什么,如何实践。
我可能是一个比较喜欢自底向上学习的人。JavaWeb确实在国内多以Spring为生态,但是剥开这些框架的外衣之后。它是如何运作的?我不知道。直到我到了一家新公司,用的不是Spring框架了。我就一头雾水了。Http请求是怎么回事?怎么就被接收到了?又是怎么生成Request,Response等一系列对象的?多个Request请求并发到来时,是怎么回事?我的服务不是单例吗?一系列问题。
于是,决定还是稍微绕一下远路,重学JavaWeb,从基石开始。
抛开SSM这些框架,用Java实现一个Web服务,是要基于Servlet的,这是几乎所有JavaWeb的最底层(当然现在也有那些比较先进的不基于Servlet的web技术)。
由此来到了JavaEE的十三种规范,Servlet/JSP规范作为web核心,JDBC作为持久层的基石,以及XML,JMS等。
于是打算从Servlet,Tomcat重新学起。

正文

Servlet是JavaEE的十三种规范之一,Servlet其实没那么复杂,它就是一个规范而已。

下面就是Servlet,它就是个接口,它定义了5个方法。

Servlet规范中规定了Servlet容器的运行机制。

在这里插入图片描述

Tomcat是实现了Servlet接口的web容器(web服务器+Servlet/JSP容器)

Tomcat的职责是:监听计算机的对应端口,负责网络通信,解析Http协议,创建Request和Response对象,并将Http请求中的数据,填充到Request对象中,Response对象中一开始不包含任何内容,然后将Request和Response传递给Servlet执行业务逻辑,最后Servlet将处理结束后的结果写入到Response流中,Tomcat再从Response流中取出数据,组装成静态的HTML页面,返回给浏览器端。

Servlet的基础知识 -> 生命周期等 init() service() destroy() -> servlet是单例的

-> tomcat每收到一个请求,会有一个对应的Connector去处理(Connector会拿着这个请求,去找到Engine,Engine再将请求转交给对应的Servlet处理),而Connector有很多个,它是一个池,所以tomcat其实可以同时接收并处理多个http请求,但是Servlet是单例的。

资源 -> 动态资源,静态资源。类似于Apache服务器,Nginx服务器,只能算Web服务器,它们只能处理Http请求,并且处理静态资源。无法处理动态资源。Tomcat由于实现了Servlet,故可以处理动态资源。

一般会用一个Http服务器(Apache或Nginx),搭配Tomcat使用。请求到来时先通过Http服务器,进行Http请求转发,负载均衡,和处理静态资源,这样只将动态资源交给Tomcat处理,减少了Tomcat的压力。(如果没有前面的静态服务器,则静态资源的请求也将由Tomcat完成,会影响Tomcat的性能)

Servlet 3.0 之前,创建一个Java Web应用,必须要提供web.xml配置文件,在该配置文件中配置Servlet,然后使用Servlet接口的实现类,对请求进行处理即可。(Tomcat启动web应用时,需要读取web.xml,以便在接收到请求时,从web.xml中查找相应的servlet对请求进行处理)

Servlet 3.0 及以后,支持注解配置,可以不用提供web.xml。(Java EE6 以上支持Servlet 3.0)

仅使用类似@WebServlet等注解,即完成web.xml中对Servlet的配置

在这里插入图片描述

关于在IDEA中配置tomcat,并部署项目

在这里插入图片描述

配置了虚拟路径后,启动项目。进入到IDEA工作路径

默认是在%USER_HOME%\IntelliJIdeaxxx\system\tomcat

可以看到针对每个部署到tomcat的web项目,这个目录下都有一个文件夹与之对应

在这里插入图片描述

在这里插入图片描述

进去之后看到,主要有conf配置文件,logs日志文件,work工作目录

conf里的文件(最关键的server.xml和web.xml)都是从指定的tomcat安装目录拷贝过来的。我在IDEA中启动tomcat之前,已经将tomcat安装目录下的server.xml中进行了一些修改。

发现IDEA工作目录中的server.xml也包含了这些修改。
在这里插入图片描述

项目的根路径,是在/conf/Catalina/localhost下配置的

在这里插入图片描述

在这里插入图片描述

进入\work工作目录,可以看到运行时生成的一些文件

在这里插入图片描述

在这里插入图片描述

由此可见,index.jsp,在被请求时,实际是转换成了Servlet

在这里插入图片描述

在浏览器访问localhost:8080/index.jsp

并不是返回了jsp页面,index.jsp只是一种url pattern,它会由tomcat自带的Servlet进行处理。下面看Tomcat自带的web.xml中的配置。

在这里插入图片描述

在这里插入图片描述

对于后缀为.jsp或.jspx的请求,会交由JspServlet去处理,而JspServlet中,先将JSP文件进行转换,生成Servlet,然后在Servlet中执行数据的处理,并将最终的数据和HTML语句进行组装拼接,将HTML字符串流写入到Response,再由Tomcat返回给浏览器。所以说JSP是运行在服务端的。

JSP技术的弊端就是,它不支持页面的部分刷新,若页面的部分内容要进行变化,则整个页面需要刷新。当页面只有部分内容需要刷新时,这无疑就浪费了带宽,降低了响应时间,影响了用户体验。

在没有ajax以前,动态的过程(数据的组装)都是在服务端完成,最终返回给浏览器的,一定是处理好的静态页面。

有了ajax以后,它提供了页面部分刷新的功能。可以让页面在浏览器端进行动态的数据请求。

JavaWeb的三大组件除了Servlet,还有Filter和Listener。这是JavaWeb基础中的基础。

国内基于Java的Web应用,包括以Spring为生态的,底层都是Servlet。如SpringMvc中的核心类DispatcherServlet,也是一个Servlet。SpringBoot,Dubbo等框架中内置的默认容器是Tomcat。

这些都是以后学习SSM,SpringBoot和SpringCloud等的基础。所以一定要先把基础打扎实。

学习Servlet,最好就是研究Tomcat源码。

Tomcat中部署项目的N种方式!

至于基于Servlet以外的web技术,算是更先进的技术。比如SpringWebFlux基于流和响应式。

对于多线程方面,还有一些不是基于线程驱动,而基于事件驱动。Tomcat至少是线程驱动的。

=> 参考:

Servlet-Wiki https://en.wikipedia.org/wiki/Java_servlet

Servlet的本质 https://www.zhihu.com/question/21416727

JSP的前世今生 https://zhuanlan.zhihu.com/p/42343690

Web服务器,Web容器傻傻分不清?https://www.zhihu.com/question/32212996

Tomcat外传 https://zhuanlan.zhihu.com/p/54121733

终于有人把Tomcat讲清楚了https://zhuanlan.zhihu.com/p/99410527

放弃Tomcat,选择Undertowhttps://zhuanlan.zhihu.com/p/106559336

另外,对于数据库层面的访问,JavaEE有JDBC规范,这也是以后学习mybatis等持久层框架的基础。

在目前流行的互联网架构中,对一个应用来说,Tomcat是首,SSM是中,JVM是尾,我们通常对于SSM是比较了解的,而忽略了首尾。

学习最好先观其脉络。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值