专业编程教程与实战项目分享平台

网站首页 > 技术文章 正文

Java杂谈(八)--Servlet/Jsp

ins518 2025-02-26 12:27:20 技术文章 19 ℃ 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.ins518.com/tags-996.html" title="查看更多有关于“jsp前端”的内容" rel="tag" target="_blank">jsp前端</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.ins518.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.ins518.com/post/12675.html" title="一个完整网站的基本结构组成">一个完整网站的基本结构组成</a> </li> <li class="fr ziyou">下一篇: <a href="http://www.ins518.com/post/12677.html" title="10款前端流程图框架">10款前端流程图框架</a> </li> <div class="clear"></div> </ul> </div> <div class="xg"> <h2 class="ybbt">猜你喜欢</h2> <ul> <li><span class="">2025-02-26</span><i class="fa fa-caret-right"></i> <a href="http://www.ins518.com/post/12685.html" title="Jsp Servlet Mysql实现的在线商城项目源码附带视频指导运行教程">Jsp Servlet Mysql实现的在线商城项目源码附带视频指导运行教程</a></li> <li><span class="">2025-02-26</span><i class="fa fa-caret-right"></i> <a href="http://www.ins518.com/post/12684.html" title="java基础都在这了,小主们拿去吧">java基础都在这了,小主们拿去吧</a></li> <li><span class="">2025-02-26</span><i class="fa fa-caret-right"></i> <a href="http://www.ins518.com/post/12683.html" title="springboot中对各个层的理解以及流程">springboot中对各个层的理解以及流程</a></li> <li><span class="">2025-02-26</span><i class="fa fa-caret-right"></i> <a href="http://www.ins518.com/post/12682.html" title="基于JSP技术的健康信息网站的设计与实现-计算机毕业设计源码">基于JSP技术的健康信息网站的设计与实现-计算机毕业设计源码</a></li> <li><span class="">2025-02-26</span><i class="fa fa-caret-right"></i> <a href="http://www.ins518.com/post/12681.html" title="《JSP》第16节:JSTL标签库之循环语句标签介绍">《JSP》第16节:JSTL标签库之循环语句标签介绍</a></li> <li><span class="">2025-02-26</span><i class="fa fa-caret-right"></i> <a href="http://www.ins518.com/post/12680.html" title="想成为一名合格的前端工程师,需要掌握哪些技能?">想成为一名合格的前端工程师,需要掌握哪些技能?</a></li> <li><span class="">2025-02-26</span><i class="fa fa-caret-right"></i> <a href="http://www.ins518.com/post/12679.html" title="用 JSP 连接 MySQL 登入注册项目实践(JSP + HTML + CSS + MySQL)">用 JSP 连接 MySQL 登入注册项目实践(JSP + HTML + CSS + MySQL)</a></li> <li><span class="">2025-02-26</span><i class="fa fa-caret-right"></i> <a href="http://www.ins518.com/post/12678.html" title="2023最新版360度无死角Java学习路线">2023最新版360度无死角Java学习路线</a></li> <li><span class="">2025-02-26</span><i class="fa fa-caret-right"></i> <a href="http://www.ins518.com/post/12677.html" title="10款前端流程图框架">10款前端流程图框架</a></li> <li><span class="">2025-02-26</span><i class="fa fa-caret-right"></i> <a href="http://www.ins518.com/post/12675.html" title="一个完整网站的基本结构组成">一个完整网站的基本结构组成</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.ins518.com/zb_system/cmd.php?act=cmt&postid=12676&key=f4a16558eeac5abd5af2d83802260fde" class="clearfix"> <input type="hidden" name="inpId" id="inpId" value="12676"> <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-09</span><a href="http://www.ins518.com/post/13949.html" title="前端流行框架Vue3教程:13. 组件传递数据_Props" target="_blank">前端流行框架Vue3教程:13. 组件传递数据_Props</a></li> <li><span class="fr zuo10">05-09</span><a href="http://www.ins518.com/post/13948.html" title="前端必看!10 个 Vue3 救命技巧,解决你 90% 的开发难题?" target="_blank">前端必看!10 个 Vue3 救命技巧,解决你 90% 的开发难题?</a></li> <li><span class="fr zuo10">05-09</span><a href="http://www.ins518.com/post/13947.html" title="JAVA和JavaScript到底是什么关系?是亲戚吗?" target="_blank">JAVA和JavaScript到底是什么关系?是亲戚吗?</a></li> <li><span class="fr zuo10">05-09</span><a href="http://www.ins518.com/post/13946.html" title="Java和js有什么区别?(java和javascript的区别和联系)" target="_blank">Java和js有什么区别?(java和javascript的区别和联系)</a></li> <li><span class="fr zuo10">05-09</span><a href="http://www.ins518.com/post/13945.html" title="东方标准|Web和Java的区别,如何选择这两个专业" target="_blank">东方标准|Web和Java的区别,如何选择这两个专业</a></li> <li><span class="fr zuo10">05-09</span><a href="http://www.ins518.com/post/13944.html" title="前端面试题-JS 中如何实现大对象深度对比" target="_blank">前端面试题-JS 中如何实现大对象深度对比</a></li> <li><span class="fr zuo10">05-09</span><a href="http://www.ins518.com/post/13943.html" title="360前端一面~面试题解析(360前端笔试)" target="_blank">360前端一面~面试题解析(360前端笔试)</a></li> <li><span class="fr zuo10">05-09</span><a href="http://www.ins518.com/post/13942.html" title="加班秃头别慌!1 道 Vue 面试题,快速解锁大厂 offer 通关密码" target="_blank">加班秃头别慌!1 道 Vue 面试题,快速解锁大厂 offer 通关密码</a></li> </ul> </div> <div class="tab-pal"> <ul> <li><span class="fr zuo10">405℃</span><a href="http://www.ins518.com/post/10937.html" title="使用 Json 构建完整的管理系统界面" target="_blank">使用 Json 构建完整的管理系统界面</a></li> <li><span class="fr zuo10">388℃</span><a href="http://www.ins518.com/post/5992.html" title="Oracle 12c PDB迁移(一) oracle迁移到oceanbase" target="_blank">Oracle 12c PDB迁移(一) oracle迁移到oceanbase</a></li> <li><span class="fr zuo10">388℃</span><a href="http://www.ins518.com/post/6056.html" title="几个Oracle空值处理函数 oracle处理null值的函数" target="_blank">几个Oracle空值处理函数 oracle处理null值的函数</a></li> <li><span class="fr zuo10">387℃</span><a href="http://www.ins518.com/post/6050.html" title="Oracle数据库的单、多行函数 oracle执行多个sql语句" target="_blank">Oracle数据库的单、多行函数 oracle执行多个sql语句</a></li> <li><span class="fr zuo10">386℃</span><a href="http://www.ins518.com/post/5991.html" title="0497-如何将Kerberos的CDH6.1从Oracle JDK 1.8迁移至OpenJDK 1.8" target="_blank">0497-如何将Kerberos的CDH6.1从Oracle JDK 1.8迁移至OpenJDK 1.8</a></li> <li><span class="fr zuo10">376℃</span><a href="http://www.ins518.com/post/6026.html" title="【数据统计分析】详解Oracle分组函数之CUBE" target="_blank">【数据统计分析】详解Oracle分组函数之CUBE</a></li> <li><span class="fr zuo10">372℃</span><a href="http://www.ins518.com/post/5993.html" title="最佳实践 | 提效 47 倍,制造业生产 Oracle 迁移替换" target="_blank">最佳实践 | 提效 47 倍,制造业生产 Oracle 迁移替换</a></li> <li><span class="fr zuo10">368℃</span><a href="http://www.ins518.com/post/6045.html" title="Oracle分析函数之Lag和Lead()使用" target="_blank">Oracle分析函数之Lag和Lead()使用</a></li> </ul> </div> <div class="tab-pal"> <ul> <li><span class="fr zuo10">230℃</span><a href="http://www.ins518.com/post/5.html" title="史上最全的前端学习路线图,干货满满" target="_blank">史上最全的前端学习路线图,干货满满</a></li> <li><span class="fr zuo10">232℃</span><a href="http://www.ins518.com/post/7.html" title="精选100个优秀的前端框架!" target="_blank">精选100个优秀的前端框架!</a></li> <li><span class="fr zuo10">285℃</span><a href="http://www.ins518.com/post/8.html" title="怎样成为一名Web前端工程师?三个阶段让你快速入门!附Web前端工程师学习图" target="_blank">怎样成为一名Web前端工程师?三个阶段让你快速入门!附Web前端工程师学习图</a></li> </ul> </div> </div> </div> </dl> <dl class="function" id="divPrevious"> <dt class="function_t">最近发表</dt><dd class="function_c"> <ul><li><a title="前端流行框架Vue3教程:13. 组件传递数据_Props" href="http://www.ins518.com/post/13949.html">前端流行框架Vue3教程:13. 组件传递数据_Props</a></li> <li><a title="前端必看!10 个 Vue3 救命技巧,解决你 90% 的开发难题?" href="http://www.ins518.com/post/13948.html">前端必看!10 个 Vue3 救命技巧,解决你 90% 的开发难题?</a></li> <li><a title="JAVA和JavaScript到底是什么关系?是亲戚吗?" href="http://www.ins518.com/post/13947.html">JAVA和JavaScript到底是什么关系?是亲戚吗?</a></li> <li><a title="Java和js有什么区别?(java和javascript的区别和联系)" href="http://www.ins518.com/post/13946.html">Java和js有什么区别?(java和javascript的区别和联系)</a></li> <li><a title="东方标准|Web和Java的区别,如何选择这两个专业" href="http://www.ins518.com/post/13945.html">东方标准|Web和Java的区别,如何选择这两个专业</a></li> <li><a title="前端面试题-JS 中如何实现大对象深度对比" href="http://www.ins518.com/post/13944.html">前端面试题-JS 中如何实现大对象深度对比</a></li> <li><a title="360前端一面~面试题解析(360前端笔试)" href="http://www.ins518.com/post/13943.html">360前端一面~面试题解析(360前端笔试)</a></li> <li><a title="加班秃头别慌!1 道 Vue 面试题,快速解锁大厂 offer 通关密码" href="http://www.ins518.com/post/13942.html">加班秃头别慌!1 道 Vue 面试题,快速解锁大厂 offer 通关密码</a></li> <li><a title="焦虑深夜刷题!5 道高频 React 面试题,吃透 offer 稳了" href="http://www.ins518.com/post/13941.html">焦虑深夜刷题!5 道高频 React 面试题,吃透 offer 稳了</a></li> <li><a title="2025Web前端面试题大全(整理版)面试题附答案详解,最全面详细" href="http://www.ins518.com/post/13940.html">2025Web前端面试题大全(整理版)面试题附答案详解,最全面详细</a></li> </ul> </dd> </dl> <dl class="function" id="divTags"> <dt class="function_t">标签列表</dt><dd class="function_c"> <ul><li><a title="前端设计模式" href="http://www.ins518.com/tags-23.html">前端设计模式<span class="tag-count"> (75)</span></a></li> <li><a title="前端性能优化" href="http://www.ins518.com/tags-30.html">前端性能优化<span class="tag-count"> (51)</span></a></li> <li><a title="前端模板" href="http://www.ins518.com/tags-36.html">前端模板<span class="tag-count"> (66)</span></a></li> <li><a title="前端跨域" href="http://www.ins518.com/tags-48.html">前端跨域<span class="tag-count"> (52)</span></a></li> <li><a title="前端md5加密" href="http://www.ins518.com/tags-141.html">前端md5加密<span class="tag-count"> (49)</span></a></li> <li><a title="前端路由" href="http://www.ins518.com/tags-163.html">前端路由<span class="tag-count"> (55)</span></a></li> <li><a title="前端数组" href="http://www.ins518.com/tags-166.html">前端数组<span class="tag-count"> (65)</span></a></li> <li><a title="前端定时器" href="http://www.ins518.com/tags-206.html">前端定时器<span class="tag-count"> (47)</span></a></li> <li><a title="前端懒加载" href="http://www.ins518.com/tags-219.html">前端懒加载<span class="tag-count"> (45)</span></a></li> <li><a title="前端接口" href="http://www.ins518.com/tags-262.html">前端接口<span class="tag-count"> (46)</span></a></li> <li><a title="Oracle RAC" href="http://www.ins518.com/tags-265.html">Oracle RAC<span class="tag-count"> (73)</span></a></li> <li><a title="oracle恢复" href="http://www.ins518.com/tags-267.html">oracle恢复<span class="tag-count"> (76)</span></a></li> <li><a title="oracle 删除表" href="http://www.ins518.com/tags-270.html">oracle 删除表<span class="tag-count"> (48)</span></a></li> <li><a title="oracle 用户名" href="http://www.ins518.com/tags-273.html">oracle 用户名<span class="tag-count"> (74)</span></a></li> <li><a title="oracle 工具" href="http://www.ins518.com/tags-276.html">oracle 工具<span class="tag-count"> (55)</span></a></li> <li><a title="oracle 内存" href="http://www.ins518.com/tags-278.html">oracle 内存<span class="tag-count"> (50)</span></a></li> <li><a title="oracle 导出表" href="http://www.ins518.com/tags-281.html">oracle 导出表<span class="tag-count"> (57)</span></a></li> <li><a title="oracle查询数据库" href="http://www.ins518.com/tags-283.html">oracle查询数据库<span class="tag-count"> (45)</span></a></li> <li><a title="oracle约束" href="http://www.ins518.com/tags-286.html">oracle约束<span class="tag-count"> (46)</span></a></li> <li><a title="oracle 中文" href="http://www.ins518.com/tags-291.html">oracle 中文<span class="tag-count"> (51)</span></a></li> <li><a title="oracle链接" href="http://www.ins518.com/tags-301.html">oracle链接<span class="tag-count"> (47)</span></a></li> <li><a title="oracle的函数" href="http://www.ins518.com/tags-309.html">oracle的函数<span class="tag-count"> (57)</span></a></li> <li><a title="mac oracle" href="http://www.ins518.com/tags-507.html">mac oracle<span class="tag-count"> (47)</span></a></li> <li><a title="前端调试" href="http://www.ins518.com/tags-662.html">前端调试<span class="tag-count"> (52)</span></a></li> <li><a title="前端登录页面" href="http://www.ins518.com/tags-694.html">前端登录页面<span class="tag-count"> (48)</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.ins518.com/zb_users/theme/txcms2/script/txcstx.min.js?v=2024-07-12"></script> </body> </html><!--160.53 ms , 19 queries , 3161kb memory , 0 error-->