Servlet 是什么?
官方术语:
Servlet(Server Applet),全称Java Servlet,未有中文译文。是用Java编写的服务器端程序。其主要功能在于交互式地浏览和修改数据,生成动态Web内容。狭义的Servlet是指Java语言实现的一个接口,广义的Servlet是指任何实现了这个Servlet接口的类,一般情况下,人们将Servlet理解为后者。
Servlet运行于支持Java的应用服务器中。从实现上讲,Servlet可以响应任何类型的请求,但绝大多数情况下Servlet只用来扩展基于HTTP协议的Web服务器。
==================================================================================================
如果你是初学者我相你看到这篇文章应该可以让你对Servlet有很深的印象,因为我将会用一种简单粗暴的方式给你解释什么是Servlet。
首先我们要知道Servlet是J2EE(java)中的,那J2EE是干嘛的呢?随着现在前后端的分离,j2EE逐渐演变成了单纯的“后台”。
(苹果电脑没有Visio,用起来贼不爽,很丑不要见怪)
后台负责所有端之间的信息储存、交换、更新、计算等等,前端的任务主要就是展示数据、采取数据。
由此可见后台是一个互联网产品的“大脑”。那这个大脑用什么东西来跟他们"交流"的呢?
答案当然是Servlet
这里请留意服务而字,你可以把它理解为J2EE的“大管家”。
大家都知道男人有钱就变坏(搞笑),它也一样。因为他是大管家,所以他干脆把自己做成了接口,活都让他的几个小弟干。
他自己定义了几个方法并且给与一定的参数(相当于告诉它小弟我们要干哪些事情)。
(有生有死所以它有生命周期,从第一次访问,直到系统关闭,这也是两个方法被弱化的原因)
比较粗躁,但是可以先这样理解,方便记忆。
Servlet 有两个小弟
其中相对来讲FacesServlet比较没出息,他主要是管理 Web 应用程序请求处理生命周期的 servlet,这些应用程序利用 JavaServer Faces 来构造用户界面。(用的很少)
而GenericServlet就比较厉害了,使编写 servlet 变得更容易。它提供生命周期方法 init
和 destroy
的简单版本,以及 ServletConfig
接口中的方法的简单版本。GenericServlet
还实现 log
方法,在 ServletContext
接口中对此进行了声明。(用的多)
相对FacesServlet,GenericServlet承担了更多的功能,所以他心里不平衡就给自己又找了个小弟。
HttpServlet字面上你也知道这个Servlet是干嘛的了。对他的出生就是专门为了处理Http网络请求来的。所以当你继承他的时候他两个方法很重要Dopost doget 。这是分别对应post请求和get请求。
(如果,如果你是一个真正的初学者那你看到这里就,现在脑海里记住他们关系。因为水平有限下面的我不知道用大白话怎么说了,你可以先记着关系。然后找源码跟着看一下,我尽量简洁)
=================================华丽的分割线==================================================
Java是面向对象的,很多时候我们都只知道方法是干嘛的,但是他是怎么来的我们却云里雾里。
熟悉Java的你不知道有没有留意到Java里面有一个很常用的东西,Context对象。它几乎存在于任何以Java为基础的语言里。如安卓。当然j2EE也不例外-ServletContext。 那这个context 是怎么来的呢?你可以回头看看servlet 的五个方法,根本没有。那他是怎么来的呢?他的使命又是什么呢?当你带着这个问题翻阅源码时,你仔细看仔细体会你也许才真正的体会到什么是面向对象。
当你在httpServlet中调用getServletContext();方法时你点开源码会发现GenericServlet类中有:
public ServletContext getServletContext() { return this.getServletConfig().getServletContext(); }
你在继续点会看到:
public ServletConfig getServletConfig() { return this.config; }
由此可见它来源于config,那这个config来源于哪里呢?
噢,它来源于init方法,GenericServlet
其实把config中最重要的东西提去了出来,做成了一个方法,从而让你在Servlet中能够直接调用。因为context对象了包含了常用的全局的配置,你可以直接拿到。从而把精力更多的话在处理网络请求上,放在处理你自己的业务逻辑上。
这样因为context对象被抽离所以init方法对于下面的子类就没什么作用了,甚至httpservlet都没有出现这个方法。
而destroy方法是在servlet走向死亡的时候才会调用的。这就相当于一封信上面标题系统已经给你写好了叫’遗书‘。这是完全由用户自定的东西,因为只有用户知道自己在Servlet死亡的时候要做哪些事情比如:关流,或者其他的。
Servlet中的方法剩下的还有两个:
service(ServletRequest req, ServletResponse res)
这个方法其实是HttpServlet继承了GenericServlet之后。GenericServlet把这个方法留给了httpServlet封装。httpServlet于是就如它的名字一样,它把请求进一步细化。
而至于最后一个方法:String getServletInfo()是返回有关 servlet 的信息,比如作者、版本和版权。此方法返回的字符串应该是纯文本,不应该是任何种类的标记(比如 HTML、XML,等等)。无关紧要,所以GenericServlet 索性直接
返回了空。之后就没在处理了。
由此可见方法由上到下逐渐细化,到我们手里的时候。系统其实已经把所有能干的都干了。并且为给我们提供方便他们还提供了各种域对象,及方法等。我们只是活着前人的树荫下。这就是面向对象。
时间有限,文章粗浅,还望各位海涵。粗鄙只谈,如有不妥之处望请指点。