Java杂谈(八)--Servlet/Jsp

deer332025-03-06技术文章36

终于正式进入J2ee的细节部分了,首当其冲的当然是Servlet和Jsp了,上篇曾经提到过J2ee只是一个规范和指南,定义了一组必须要遵循的接口,核心概念是组件和容器。曾经有的人问我Servlet的Class文件是哪里来的?他认为是J2ee官方提供的,我举了一个简单的反例:稍微检查了一下Tomcat5.0里面的Servlet.jar文件和JBoss里面的Servlet.jar文件大小,很明显是不一样的,至少已经说明了它们不是源自同根的吧。其实Servlet是由容器根据J2ee的接口定义自己来实现的,实现的方式当然可以不同,只要都遵守J2ee规范和指南。

上述只是一个常见的误区罢了,告诉我们要编译运行Servlet,是要依赖于实现它的容器的,不然连jar文件都没有,编译都无法进行。那么Jsp呢?Java Server Page的简称,是为了开发动态网页而诞生的技术,其本质也是Jsp,在编写完毕之后会在容器启动时经过编译成对应的Servlet。只是我们利用Jsp的很多新特性,可以更加专注于前后台的分离,早期Jsp做前台是满流行的,毕竟里面支持Html代码,这让前台美工人员可以更有效率的去完成自己的工作。然后Jsp将请求转发到后台的Servlet,由Servlet处理业务逻辑,再转发回另外一个Jsp在前台显示出来。这似乎已经成为一种常用的模式,最初我学习J2ee的时候,大量时间也在编写这样的代码。

尽管现在做前台的技术越来越多,例如Flash、Ajax等,已经有很多人不再认为Jsp重要了。我觉得Jsp带来的不仅仅是前后端分离的设计理念,它的另外一项技术成就了我们今天用的很多框架,那就是Tag标签技术。所以与其说是在学习Jsp,不如更清醒的告诉自己在不断的理解Tag标签的意义和本质。

1. Servlet以及Jsp的生命周期

Servlet是Jsp的实质,尽管容器对它们的处理有所区别。Servlet有init()方法初始化,service()方法进行Web服务,destroy()方法进行销毁,从生到灭都由容器来掌握,所以这些方法除非你想自己来实现Servlet,否则是很少会接触到的。正是由于很少接触,才容易被广大初学者所忽略,希望大家至少记住Servlet生命周期方法都是回调方法。回调这个概念简单来说就是把自己注入另外一个类中,由它来调用你的方法,所谓的另外一个类就是Web容器,它只认识接口和接口的方法,注入进来的是怎样的对象不管,它只会根据所需调用这个对象在接口定义存在的那些方法。由容器来调用的Servlet对象的初始化、服务和销毁方法,所以叫做回调。这个概念对学习其他J2ee技术相当关键!

那么Jsp呢?本事上是Servlet,还是有些区别的,它的生命周期是这样的:

a) 一个客户端的Request到达服务器 ->

b) 判断是否第一次调用 -> 是的话编译Jsp成Servlet

c) 否的话再判断此Jsp是否有改变 -> 是的话也重新编译Jsp成Servlet

d) 已经编译最近版本的Servlet装载所需的其他Class

e) 发布Servlet,即调用它的Service()方法

所以Jsp号称的是第一次Load缓慢,以后都会很快的运行。从它的生命的周期确实不难看出来这个特点,客户端的操作很少会改变Jsp的源码,所以它不需要编译第二次就一直可以为客户端提供服务。这里稍微解释一下Http的无状态性,因为发现很多人误解,Http的无状态性是指每次一张页面显示出来了,与服务器的连接其实就已经断开了,当再次有提交动作的时候,才会再次与服务器进行连接请求提供服务。当然还有现在比较流行的是Ajax与服务器异步通过xml交互的技术,在做前台的领域潜力巨大,我不是Ajax的高手,这里无法为大家解释。

2. Tag标签的本质

我之前说了,Jsp本身初衷是使得Web应用前后台的开发可以脱离耦合分开有效的进行,可惜这个理念的贡献反倒不如它带来的Tag技术对J2ee的贡献要大。也许已经有很多人开始使用Tag技术了却并不了解它。所以才建议大家在学习J2ee开始的时候一定要认真学习Jsp,其实最重要的就是明白标签的本质。

Html标签我们都很熟悉了,有 、 、 、 ,Jsp带来的Tag标签遵循同样的格式,或者说更严格的Xml格式规范,例如 <jsp:include> 、 <jsp:usebean> 、 <c:if> 、 <c:foreach> 等等。它们没有什么神秘的地方,就其源头也还是Java Class而已,Tag标签的实质也就是一段Java代码,或者说一个Class文件。当配置文件设置好去哪里寻找这些Class的路径后,容器负责将页面中存在的标签对应到相应的Class上,执行那段特定的Java代码,如此而已。 </p><p>说得明白一点的话还是举几个简单的例子说明一下吧: </p><p> <jsp:include> 去哪里找执行什么class呢?首先这是个jsp类库的标签,当然要去jsp类库寻找相应的class了,同样它也是由Web容器来提供,例如Tomcat就应该去安装目录的lib文件夹下面的jsp-api.jar里面找,有兴趣的可以去找一找啊! </p><p> <c:foreach> 又去哪里找呢?这个是由Jsp2.0版本推荐的和核心标记库的内容,例如 <c:if> 就对应在页面中做if判断的功能的一断Java代码。它的class文件在jstl.jar这个类库里面,往往还需要和一个standard.jar类库一起导入,放在具体Web项目的WEB-INF的lib目录下面就可以使用了。 </p><p> 顺便罗唆一句,Web Project的目录结构是相对固定的,因为容器会按照固定的路径去寻找它需要的配置文件和资源,这个任何一本J2ee入门书上都有,这里就不介绍了。了解Tag的本质还要了解它的工作原理,所以大家去J2ee的API里找到并研究这个包:javax.servlet.jsp.tagext。它有一些接口,和一些实现类,专门用语开发Tag,只有自己亲自写出几个不同功能的标签,才算是真正理解了标签的原理。别忘记了自己开发的标签要自己去完成配置文件,容器只是集成了去哪里寻找jsp标签对应class的路径,自己写的标签库当然要告诉容器去哪里找啦。 </p><p> 说了这么多,我们为什么要用标签呢?完全在Jsp里面来个 <%> 就可以在里面任意写Java代码了,但是长期实践发现页面代码统一都是与html同风格的标记语言更加有助于美工人员进行开发前台,它不需要懂Java,只要Java程序员给个列表告诉美工什么标签可以完成什么逻辑功能,他就可以专注于美工,也算是进一步隔离了前后台的工作吧! </p><p> 3. 成就Web框架 </p><p> 框架是什么?曾经看过这样的定义:与模式类似,框架也是解决特定问题的可重用方法,框架是一个描述性的构建块和服务集合,开发人员可以用来达成某个目标。一般来说,框架提供了解决某类问题的基础设施,是用来创建解决方案的工具,而不是问题的解决方案。 </p><p> 正是由于Tag的出现,成就了以后出现的那么多Web框架,它们都开发了自己成熟实用的一套标签,然后由特定的Xml文件来配置加载信息,力图使得Web应用的开发变得更加高效。下面这些标签相应对很多人来说相当熟悉了: </p><p class='syl-line-pure-english'> <html:password> </p><p class='syl-line-pure-english'> <logic:equal> </p><p class='syl-line-pure-english'> <bean:write> </p><p class='syl-line-pure-english'> <f:view> </p><p class='syl-line-pure-english'> <h:form> </p><p class='syl-line-pure-english'> <h:message> </p><p> 它们分别来自Struts和JSF框架,最强大的功能在于控制转发,就是MVC三层模型中间完成控制器的工作。Struts-1实际上并未做到真正的三层隔离,这一点在Struts-2上得到了很大的改进。而Jsf向来以比较完善合理的标签库受到人们推崇。 </p><p> 今天就大概讲这么多吧,再次需要强调的是Servlet/Jsp是学习J2ee必经之路,也是最基础的知识,希望大家给与足够的重视!</p><p>想要了解更多Java知识那就来关注我们吧! 精彩内容多多哦!不从错过哦!</p><p>多多关注</p><p></p></div> </div> </div> </div> <div class="block"> <div class="posttitle"><h4>相关文章</h4></div> <div class="relatecon"> <div class="relatelist"><a href="http://www.deer33.com/post/2021.html" title="你写的JSP代码正在拖垮系统90%开发者不知道的过时陷阱与重生法则">你写的JSP代码正在拖垮系统90%开发者不知道的过时陷阱与重生法则</a><span class="posttime">2025-03-06</span></div><div class="relatelist"><a href="http://www.deer33.com/post/2023.html" title="深入理解JSP">深入理解JSP</a><span class="posttime">2025-03-06</span></div><div class="relatelist"><a href="http://www.deer33.com/post/2025.html" title="从asp.net到jsp:3分钟看透Jsp&amp;Servlet">从asp.net到jsp:3分钟看透Jsp&amp;Servlet</a><span class="posttime">2025-03-06</span></div><div class="relatelist"><a href="http://www.deer33.com/post/2028.html" title="牛皮了,GitHub上还不错的Java Web开发手册,屌?">牛皮了,GitHub上还不错的Java Web开发手册,屌?</a><span class="posttime">2025-03-06</span></div><div class="relatelist"><a href="http://www.deer33.com/post/2031.html" title="JSP – 支持WORD上传的富文本编辑器">JSP – 支持WORD上传的富文本编辑器</a><span class="posttime">2025-03-06</span></div> </div> </div> </div> <div class="sidebar fixed"> <dl id="divCatalog" class="sidebox"> <dt class="sidetitle">网站分类</dt> <dd> <ul><li><a title="技术文章" href="http://www.deer33.com/?cate=1">技术文章</a></li> </ul> </dd> </dl><dl id="divTags" class="sidebox"> <dt class="sidetitle">标签列表</dt> <dd> <ul><li><a title="数据库设计工具有哪些" href="http://www.deer33.com/tags-2.html">数据库设计工具有哪些<span class="tag-count"> (34)</span></a></li> <li><a title="网上商城项目完整源码" href="http://www.deer33.com/tags-3.html">网上商城项目完整源码<span class="tag-count"> (34)</span></a></li> <li><a title="系统管理系统" href="http://www.deer33.com/tags-6.html">系统管理系统<span class="tag-count"> (43)</span></a></li> <li><a title="round向上取整公式怎么用" href="http://www.deer33.com/tags-7.html">round向上取整公式怎么用<span class="tag-count"> (57)</span></a></li> <li><a title="htmlinput属性" href="http://www.deer33.com/tags-11.html">htmlinput属性<span class="tag-count"> (46)</span></a></li> <li><a title="html5下载官方网站" href="http://www.deer33.com/tags-12.html">html5下载官方网站<span class="tag-count"> (48)</span></a></li> <li><a title="python正则表达式使用实例" href="http://www.deer33.com/tags-15.html">python正则表达式使用实例<span class="tag-count"> (35)</span></a></li> <li><a title="程序员需要考哪些证书" href="http://www.deer33.com/tags-16.html">程序员需要考哪些证书<span class="tag-count"> (34)</span></a></li> <li><a title="程序员基础知识" href="http://www.deer33.com/tags-17.html">程序员基础知识<span class="tag-count"> (33)</span></a></li> <li><a title="源代码电影在线播放" href="http://www.deer33.com/tags-26.html">源代码电影在线播放<span class="tag-count"> (37)</span></a></li> <li><a title="java我的世界启动器" href="http://www.deer33.com/tags-29.html">java我的世界启动器<span class="tag-count"> (44)</span></a></li> <li><a title="手机数控编程软件免费" href="http://www.deer33.com/tags-36.html">手机数控编程软件免费<span class="tag-count"> (56)</span></a></li> <li><a title="如何编程序" href="http://www.deer33.com/tags-37.html">如何编程序<span class="tag-count"> (35)</span></a></li> <li><a title="手机编程游戏软件" href="http://www.deer33.com/tags-43.html">手机编程游戏软件<span class="tag-count"> (35)</span></a></li> <li><a title="简单学生的网页代码" href="http://www.deer33.com/tags-44.html">简单学生的网页代码<span class="tag-count"> (35)</span></a></li> <li><a title="sql必知必会" href="http://www.deer33.com/tags-56.html">sql必知必会<span class="tag-count"> (36)</span></a></li> <li><a title="二次函数公式大全表格" href="http://www.deer33.com/tags-59.html">二次函数公式大全表格<span class="tag-count"> (36)</span></a></li> <li><a title="jquery事件处理" href="http://www.deer33.com/tags-62.html">jquery事件处理<span class="tag-count"> (34)</span></a></li> <li><a title="jquery ui下载" href="http://www.deer33.com/tags-63.html">jquery ui下载<span class="tag-count"> (36)</span></a></li> <li><a title="jquery是什么库" href="http://www.deer33.com/tags-64.html">jquery是什么库<span class="tag-count"> (35)</span></a></li> <li><a title="网站免费源码大全下载" href="http://www.deer33.com/tags-153.html">网站免费源码大全下载<span class="tag-count"> (34)</span></a></li> <li><a title="常用控件" href="http://www.deer33.com/tags-254.html">常用控件<span class="tag-count"> (35)</span></a></li> <li><a title="wordpress网站建设" href="http://www.deer33.com/tags-329.html">wordpress网站建设<span class="tag-count"> (34)</span></a></li> <li><a title="反函数和原函数关系" href="http://www.deer33.com/tags-335.html">反函数和原函数关系<span class="tag-count"> (34)</span></a></li> <li><a title="sqlserver" href="http://www.deer33.com/tags-360.html">sqlserver<span class="tag-count"> (34)</span></a></li> </ul> </dd> </dl><dl id="divComments" class="sidebox"> <dt class="sidetitle">最新留言</dt> <dd> <ul></ul> </dd> </dl></div> </div> </div> </div> </div> <div class="footer"> <div class="fademask"></div> <div class="wrap"> <h3><a href="https://beian.miit.gov.cn/" target="_blank">蜀ICP备2024111239号-17 </a></h3> <!--<h4>Powered By <a href="https://www.zblogcn.com/" title="Z-BlogPHP 1.7.3 Build 173295" target="_blank" rel="noopener norefferrer">Z-BlogPHP</a>. Theme by <a href="https://www.toyean.com/" target="_blank" title="拓源网">TOYEAN</a>.</h4>--> </div> </div> <div class="edgebar"> </div></body> </html><!--90.07 ms , 9 queries , 3943kb memory , 0 error-->