科技信息
计算机与
网络 基于
JSP运行原理来解析JSP引擎的实际
工作流程
辽宁对外经贸刘玉江
[摘要]目前,最
常用的三种动态网页语言有ASP、JSP和
PHP。其中JSP是未来发展的趋势。“一次编译,随处运行”的特点使得JSP的访问跨平台性和执行高效性发挥得淋漓尽致。本文着重论述了这种先进的WEB开发工具的工作原理和具体执行的全过程。本文以普遍采用的Tomcat6.0作为JSP的执行引擎。本文将通过对一个JSP运行过程的剖析,深入研究JSP运行的具体流程,并从全新的视角阐述一些JSP中的技术要点。[关键词]JSPServletJSP引擎世界上一些大的电子商务解决
方案提供商都普遍采用了JSP/Servlet技术。JSP是Sun公司推出的新一代网站开发语言,他将
Java从Java应用
程序和JavaApplet之外,又有新的扩展,它可以在Serverlet和JavaBean的支持下,完成功能强大的站点程序。JSP与微软的ASP(ActiveServerPages)相容,但它是使用类似
HTML的标签以及Java代码片段而不是
VBScript。JSP网站服务器会自动将以JSP写成的Java代码片段转换成JavaServlet。1、语法的基本原理JSP当一个JSP文件第一次被请求时,JSP引擎把该JSP文件转换成为一个Servlet。引擎先把该JSP文件转换成一个JaJSPva源文件,在转换时如果发现jsp文件有任何语法错误,转换过程将中断,并向服务端和客户端输出出错信息;如果转换成功,JSP引擎用JDK把该Java源文件编译成相应的class文件来实现程序的功能。如图1所示。
然后创建一个该Servlet的实例,该Servlet的jspInit()方法被执行,jspInit()方法在servlet的生命周期中只被执行一次。然后jspService()方法被调用来处理客户端的请求。对每一个请求,JSP引擎创建一个新的线程来处理该请求。如果有多个客户端同时请求该JSP文件,则JSP引擎会创建多个线程。每个客户端请求对应一个线程。以多线程方式执行可大大降低对
系统的资源需求,提高系统的并发量及响应时间.但应该注意多线程的编程限制,由于该servlet始终驻于内存,所以响应是非常快的。如果.jsp文件被修改了,服务器将根据设置决定是否对该文件重新编译,如果需要重新编译,则将编译结果取代内存中的servlet,并继续上述处理过程。虽然JSP效率很高,但在第一次调用时由于需要转换和编译而有一些轻微的延迟。此外,如果在任何时候如果由于系统资源不足的原因,JSP引擎将以某种不确定的方式将servlet从内存中移去。当这种情况发生时jspDestroy()方法首先被调用,然后servlet实例便被标记加入“垃圾收集”理。jspInit()及jspDestory()格式如下:可在jspInit()处中进行一些初始化工作,如建立与数据库的连接,或建立网络连
—219—
科技信息
计算机与网络
接,从配置文件中取一些参数等,在jspDestory()中释放相应的资源(如图2所示)。2、引擎的具体流程JSP我们以Tomcat6.0作为JSP引擎,来看看最简单的HelloWorld.jsp是怎么运行的。关键代码:<%Stringmessage="HelloWorld!";%><%=message%>Tomcat可以将JSP文件“翻译”一个java文件,关键代成码如下:try{jspxFactory=JspFactory.getDefaultFactory();response.setContentType("text/html;charset=ISO8859-1");pageContext=jspxFactory.getPageContext(this,request,response,null,true,8192,true);application=pageContext.getServletContext();config=pageContext.getServletConfig();session=pageContext.getSession();out=pageContext.getOut();jspxout=out;Stringmessage="HelloWorld!";out.print(message);}catch(Throwablet){out=jspxout;if(out!=null&;&;out.getBufferSize()!=0)out.clearBuffer();if(pageContext!=null)pageContext.handlePageException(t);}finally{if(jspxFactory!=null)jspxFactory.releasePageContext(pageContext);