程序员开发实例大全宝库

网站首页 > 编程文章 正文

Java杂谈(八)--Servlet/Jsp(jsp中servlet)

zazugpt 2025-03-30 00:10:01 编程文章 20 ℃ 0 评论

终于正式进入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 class="info-share-box clearfix"> <div class="fl"> <p class="tags"><strong>Tags:</strong><a href="http://www.zazugpt.com/tags-796.html" title="查看更多有关于“servlet-api.jar”的内容" rel="tag" target="_blank">servlet-api.jar</a></p> </div> <div class="fr"> <div class="info-share"> <div class="social-share" data-initialized="true"> <a href="#" class="social-share-icon iconfont icon-weibo"></a> <a href="#" class="social-share-icon iconfont icon-qq"></a> <a href="#" class="social-share-icon iconfont icon-wechat"></a> <a href="#" class="social-share-icon iconfont icon-qzone"></a> </div> </div> <script src="http://www.zazugpt.com/zb_users/theme/txcms2/script/social-share.min.js"></script> </div> </div> </div> <div class="sx mb15"> <ul> <li class="fl">上一篇: <a href="http://www.zazugpt.com/post/16081.html" title="Tomcat处理HTTP请求流程解析(tomcat解析http请求header错误)">Tomcat处理HTTP请求流程解析(tomcat解析http请求header错误)</a> </li> <li class="fr ziyou">下一篇: <a href="http://www.zazugpt.com/post/16083.html" title="Servlet 容器(servlet容器的功能)">Servlet 容器(servlet容器的功能)</a> </li> <div class="clear"></div> </ul> </div> <div class="xg"> <h2 class="ybbt">猜你喜欢</h2> <ul> <li><span class="">2025-03-30</span><i class="fa fa-caret-right"></i> <a href="http://www.zazugpt.com/post/16091.html" title="JavaEE概述总结:Servlet生命周期+JSP内置对象">JavaEE概述总结:Servlet生命周期+JSP内置对象</a></li> <li><span class="">2025-03-30</span><i class="fa fa-caret-right"></i> <a href="http://www.zazugpt.com/post/16090.html" title="java中的jar包,war包详解(java中jar包的作用)">java中的jar包,war包详解(java中jar包的作用)</a></li> <li><span class="">2025-03-30</span><i class="fa fa-caret-right"></i> <a href="http://www.zazugpt.com/post/16089.html" title="Java文件上传是如何实现的?(java实现上传文件到服务器)">Java文件上传是如何实现的?(java实现上传文件到服务器)</a></li> <li><span class="">2025-03-30</span><i class="fa fa-caret-right"></i> <a href="http://www.zazugpt.com/post/16088.html" title="Spring框架系列(5) - 深入浅出SpringMVC请求流程和案例">Spring框架系列(5) - 深入浅出SpringMVC请求流程和案例</a></li> <li><span class="">2025-03-30</span><i class="fa fa-caret-right"></i> <a href="http://www.zazugpt.com/post/16087.html" title="MyEclipse中文教程六:新建Maven Web项目的步骤">MyEclipse中文教程六:新建Maven Web项目的步骤</a></li> <li><span class="">2025-03-30</span><i class="fa fa-caret-right"></i> <a href="http://www.zazugpt.com/post/16086.html" title="Clickhouse入门(clickhouse深度揭秘)">Clickhouse入门(clickhouse深度揭秘)</a></li> <li><span class="">2025-03-30</span><i class="fa fa-caret-right"></i> <a href="http://www.zazugpt.com/post/16085.html" title="讲讲maven(讲讲自己的第一次经历和对象)">讲讲maven(讲讲自己的第一次经历和对象)</a></li> <li><span class="">2025-03-30</span><i class="fa fa-caret-right"></i> <a href="http://www.zazugpt.com/post/16084.html" title="Shiro学习系列教程三:集成web(shiro 集群)">Shiro学习系列教程三:集成web(shiro 集群)</a></li> <li><span class="">2025-03-30</span><i class="fa fa-caret-right"></i> <a href="http://www.zazugpt.com/post/16083.html" title="Servlet 容器(servlet容器的功能)">Servlet 容器(servlet容器的功能)</a></li> <li><span class="">2025-03-30</span><i class="fa fa-caret-right"></i> <a href="http://www.zazugpt.com/post/16081.html" title="Tomcat处理HTTP请求流程解析(tomcat解析http请求header错误)">Tomcat处理HTTP请求流程解析(tomcat解析http请求header错误)</a></li> </ul> </div> </div> <div id="comment" class="bgb pd15"> <div class="tx-comments"> <h4>本文暂时没有评论,来添加一个吧(●'◡'●)</h4> <label id="AjaxCommentBegin"></label> <!--评论输出--> <label id="AjaxCommentEnd"></label> </div> <!--评论框--> <div class="post tx-comment" id="divCommentPost"> <h3><a href="javascript:;" id="cancel-reply" style="display:none;float:right;"><small>取消回复</small></a>欢迎 <span class="tx-red">你</span> 发表评论:</h3> <form id="frmSumbit" target="_self" method="post" action="http://www.zazugpt.com/zb_system/cmd.php?act=cmt&postid=16082&key=62db40a193f0ef2763241d0b7a8f426a" class="clearfix"> <input type="hidden" name="inpId" id="inpId" value="16082"> <input type="hidden" name="inpRevID" id="inpRevID" value="0"> <div class="tx-comment-box tx-comment-ul3"><input type="text" name="inpName" id="inpName" class="text" value="访客" tabindex="1" placeholder="名称(*)"> </div> <div class="tx-comment-box tx-comment-textarea"> <textarea name="txaArticle" id="txaArticle" class="text" cols="50" rows="4" tabindex="5" placeholder="欢迎在这里交流评论,但是垃圾评论不受欢迎!"></textarea> <input name="sumbit" type="submit" tabindex="6" value="提交" onclick="return zbp.comment.post()" class="button"> </div> </form> </div> </div> </div> <div class="right fr sjwu"> <dl class="wupd"> <div class="notice"> <div class="tab-hd"> <ul class="tab-nav"> <li class="on"><a href="javascript:;">最新文章</a></li> <li><a href="javascript:;">热门文章</a></li> <li><a href="javascript:;" class="wux">推荐文章</a></li> </ul> </div> <div class="tab-bd"> <div class="tab-pal" style="display:block"> <ul> <li><span class="fr zuo10">05-14</span><a href="http://www.zazugpt.com/post/16816.html" title="2014年最流行前端开发框架对比评测" target="_blank">2014年最流行前端开发框架对比评测</a></li> <li><span class="fr zuo10">05-14</span><a href="http://www.zazugpt.com/post/16815.html" title="七爪源码:如何使用 Next.js 构建 Shopify 店面" target="_blank">七爪源码:如何使用 Next.js 构建 Shopify 店面</a></li> <li><span class="fr zuo10">05-14</span><a href="http://www.zazugpt.com/post/16814.html" title="Web 前端怎样入门?" target="_blank">Web 前端怎样入门?</a></li> <li><span class="fr zuo10">05-14</span><a href="http://www.zazugpt.com/post/16813.html" title="我为什么不建议你使用框架" target="_blank">我为什么不建议你使用框架</a></li> <li><span class="fr zuo10">05-14</span><a href="http://www.zazugpt.com/post/16812.html" title="推荐几个好用的React UI 框架" target="_blank">推荐几个好用的React UI 框架</a></li> <li><span class="fr zuo10">05-14</span><a href="http://www.zazugpt.com/post/16811.html" title="PDFsharp:强大的 .NET 跨平台 PDF 处理库" target="_blank">PDFsharp:强大的 .NET 跨平台 PDF 处理库</a></li> <li><span class="fr zuo10">05-14</span><a href="http://www.zazugpt.com/post/16810.html" title="一组开源免费的Web动画图标,荐给需要的设计师和程序员" target="_blank">一组开源免费的Web动画图标,荐给需要的设计师和程序员</a></li> <li><span class="fr zuo10">05-14</span><a href="http://www.zazugpt.com/post/16809.html" title="salesforce 零基础学习(二十九)Record Types简单介绍" target="_blank">salesforce 零基础学习(二十九)Record Types简单介绍</a></li> </ul> </div> <div class="tab-pal"> <ul> <li><span class="fr zuo10">1098℃</span><a href="http://www.zazugpt.com/post/12323.html" title="CT影像如何放在手机上让另外的医院诊断" target="_blank">CT影像如何放在手机上让另外的医院诊断</a></li> <li><span class="fr zuo10">938℃</span><a href="http://www.zazugpt.com/post/6249.html" title="python还不懂?这本《python背记手册》高清版PDF开放下载" target="_blank">python还不懂?这本《python背记手册》高清版PDF开放下载</a></li> <li><span class="fr zuo10">704℃</span><a href="http://www.zazugpt.com/post/7863.html" title="所有古筝曲谱上你会遇到的符号,一次性全都在这了" target="_blank">所有古筝曲谱上你会遇到的符号,一次性全都在这了</a></li> <li><span class="fr zuo10">691℃</span><a href="http://www.zazugpt.com/post/15778.html" title="[魔兽WLK]大佬的战斗贼基础教程,天赋、配装、宏,看这篇就够了" target="_blank">[魔兽WLK]大佬的战斗贼基础教程,天赋、配装、宏,看这篇就够了</a></li> <li><span class="fr zuo10">675℃</span><a href="http://www.zazugpt.com/post/7819.html" title="微信两根毛表情怎么打出来?左右小辫子符号苹果安卓手机教程介绍" target="_blank">微信两根毛表情怎么打出来?左右小辫子符号苹果安卓手机教程介绍</a></li> <li><span class="fr zuo10">675℃</span><a href="http://www.zazugpt.com/post/7865.html" title="乐谱上升降号的秘密(简谱中的升降号指一个音符还是一小节)" target="_blank">乐谱上升降号的秘密(简谱中的升降号指一个音符还是一小节)</a></li> <li><span class="fr zuo10">617℃</span><a href="http://www.zazugpt.com/post/10745.html" title="钢铁雄心4 德国部队配置及编组方式解析 德军怎么玩" target="_blank">钢铁雄心4 德国部队配置及编组方式解析 德军怎么玩</a></li> <li><span class="fr zuo10">614℃</span><a href="http://www.zazugpt.com/post/7841.html" title="Creo三维标注小技巧,你知道吗?(creo三维生成二维图如何标注)" target="_blank">Creo三维标注小技巧,你知道吗?(creo三维生成二维图如何标注)</a></li> </ul> </div> <div class="tab-pal"> <ul> </ul> </div> </div> </div> </dl> <dl class="function" id="divPrevious"> <dt class="function_t">最近发表</dt><dd class="function_c"> <ul><li><a title="2014年最流行前端开发框架对比评测" href="http://www.zazugpt.com/post/16816.html">2014年最流行前端开发框架对比评测</a></li> <li><a title="七爪源码:如何使用 Next.js 构建 Shopify 店面" href="http://www.zazugpt.com/post/16815.html">七爪源码:如何使用 Next.js 构建 Shopify 店面</a></li> <li><a title="Web 前端怎样入门?" href="http://www.zazugpt.com/post/16814.html">Web 前端怎样入门?</a></li> <li><a title="我为什么不建议你使用框架" href="http://www.zazugpt.com/post/16813.html">我为什么不建议你使用框架</a></li> <li><a title="推荐几个好用的React UI 框架" href="http://www.zazugpt.com/post/16812.html">推荐几个好用的React UI 框架</a></li> <li><a title="PDFsharp:强大的 .NET 跨平台 PDF 处理库" href="http://www.zazugpt.com/post/16811.html">PDFsharp:强大的 .NET 跨平台 PDF 处理库</a></li> <li><a title="一组开源免费的Web动画图标,荐给需要的设计师和程序员" href="http://www.zazugpt.com/post/16810.html">一组开源免费的Web动画图标,荐给需要的设计师和程序员</a></li> <li><a title="salesforce 零基础学习(二十九)Record Types简单介绍" href="http://www.zazugpt.com/post/16809.html">salesforce 零基础学习(二十九)Record Types简单介绍</a></li> <li><a title="Vue+SpringBoot 集成 PageOffice 实现在线编辑Word、excel文档" href="http://www.zazugpt.com/post/16808.html">Vue+SpringBoot 集成 PageOffice 实现在线编辑Word、excel文档</a></li> <li><a title="PDF管理API-Aspose.PDF 11月新更上线!支持居中对齐输出HTML" href="http://www.zazugpt.com/post/16807.html">PDF管理API-Aspose.PDF 11月新更上线!支持居中对齐输出HTML</a></li> </ul> </dd> </dl> <dl class="function" id="divTags"> <dt class="function_t">标签列表</dt><dd class="function_c"> <ul><li><a title="spire.doc" href="http://www.zazugpt.com/tags-4.html">spire.doc<span class="tag-count"> (59)</span></a></li> <li><a title="system.data.oracleclient" href="http://www.zazugpt.com/tags-229.html">system.data.oracleclient<span class="tag-count"> (61)</span></a></li> <li><a title="按键小精灵源码提取" href="http://www.zazugpt.com/tags-230.html">按键小精灵源码提取<span class="tag-count"> (66)</span></a></li> <li><a title="pyqt5designer教程" href="http://www.zazugpt.com/tags-239.html">pyqt5designer教程<span class="tag-count"> (65)</span></a></li> <li><a title="联想刷bios工具" href="http://www.zazugpt.com/tags-271.html">联想刷bios工具<span class="tag-count"> (66)</span></a></li> <li><a title="c#源码" href="http://www.zazugpt.com/tags-272.html">c#源码<span class="tag-count"> (64)</span></a></li> <li><a title="graphics.h头文件" href="http://www.zazugpt.com/tags-274.html">graphics.h头文件<span class="tag-count"> (62)</span></a></li> <li><a title="mysqldump下载" href="http://www.zazugpt.com/tags-277.html">mysqldump下载<span class="tag-count"> (66)</span></a></li> <li><a title="sqljdbc4.jar下载" href="http://www.zazugpt.com/tags-281.html">sqljdbc4.jar下载<span class="tag-count"> (56)</span></a></li> <li><a title="libmp3lame" href="http://www.zazugpt.com/tags-284.html">libmp3lame<span class="tag-count"> (60)</span></a></li> <li><a title="maven3.3.9" href="http://www.zazugpt.com/tags-300.html">maven3.3.9<span class="tag-count"> (63)</span></a></li> <li><a title="二调符号库" href="http://www.zazugpt.com/tags-394.html">二调符号库<span class="tag-count"> (57)</span></a></li> <li><a title="苹果ios字体下载" href="http://www.zazugpt.com/tags-462.html">苹果ios字体下载<span class="tag-count"> (56)</span></a></li> <li><a title="git.exe下载" href="http://www.zazugpt.com/tags-468.html">git.exe下载<span class="tag-count"> (68)</span></a></li> <li><a title="diskgenius_winpe" href="http://www.zazugpt.com/tags-472.html">diskgenius_winpe<span class="tag-count"> (72)</span></a></li> <li><a title="pythoncrc16" href="http://www.zazugpt.com/tags-474.html">pythoncrc16<span class="tag-count"> (57)</span></a></li> <li><a title="solidworks宏文件下载" href="http://www.zazugpt.com/tags-476.html">solidworks宏文件下载<span class="tag-count"> (59)</span></a></li> <li><a title="qt帮助文档中文版" href="http://www.zazugpt.com/tags-490.html">qt帮助文档中文版<span class="tag-count"> (73)</span></a></li> <li><a title="satacontroller" href="http://www.zazugpt.com/tags-494.html">satacontroller<span class="tag-count"> (66)</span></a></li> <li><a title="hgcad" href="http://www.zazugpt.com/tags-502.html">hgcad<span class="tag-count"> (64)</span></a></li> <li><a title="bootimg.exe" href="http://www.zazugpt.com/tags-521.html">bootimg.exe<span class="tag-count"> (69)</span></a></li> <li><a title="android-gif-drawable" href="http://www.zazugpt.com/tags-525.html">android-gif-drawable<span class="tag-count"> (62)</span></a></li> <li><a title="axure9元件库免费下载" href="http://www.zazugpt.com/tags-526.html">axure9元件库免费下载<span class="tag-count"> (57)</span></a></li> <li><a title="libmysqlclient.so.18" href="http://www.zazugpt.com/tags-531.html">libmysqlclient.so.18<span class="tag-count"> (58)</span></a></li> <li><a title="springbootdemo" href="http://www.zazugpt.com/tags-535.html">springbootdemo<span class="tag-count"> (64)</span></a></li> </ul> </dd> </dl> </div> <div class="clear"></div> </div> <div class="footer"> <div class="zh"> </div> </div> <div class="fixed-right"> <a href="javascript:;" class="gotop bgb" title="回到顶部"><i class="fa fa-chevron-up"></i></a> </div> <script src="http://www.zazugpt.com/zb_users/theme/txcms2/script/txcstx.min.js?v=2024-09-18"></script> </body> </html><!--289.31 ms , 16 queries , 3277kb memory , 0 error-->