Java Servlet 诠释

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 索性直接返回了空。之后就没在处理了。

由此可见方法由上到下逐渐细化,到我们手里的时候。系统其实已经把所有能干的都干了。并且为给我们提供方便他们还提供了各种域对象,及方法等。我们只是活着前人的树荫下。这就是面向对象。

时间有限,文章粗浅,还望各位海涵。粗鄙只谈,如有不妥之处望请指点。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值