一、起源
在很多动态网页中,绝大部分内容都是固定不变的,只有局部内容需要动态产生和改变。
如果使用Servlet程序来输出只有局部内容需要动态改变的网页,其中所有的静态内容也需要程序员用Java程序代码产生,整个Servlet程序的代码将非常臃肿,编写和维护都将非常困难。
对大量静态内容的美工设计和相关HTML语句的编写,并不是程序员所要做的工作,程序员对此也不一定在行。网页美工设计和制作人员不懂Java编程,更是无法来完成这样的工作。
为了弥补Servlet的缺陷,SUN公司在Servlet的基础上推出了JSP(Java Server Pages)技术作为解决方案。
JSP是简化Servlet编写的一种技术,它将Java代码和HTML语句混合在同一个文件中编写,只对网页中的要动态产生的内容采用Java代码来编写,而对固定不变的静态内容采用普通静态HTML页面的方式编写。
JSP页面是由HTML语句和嵌套在其中的Java代码组成的一个普通文本文件,JSP 页面的文件扩展名必须为.jsp。
在JSP页面中编写的Java代码需要嵌套在<%和%>中,嵌套在<%和%>之间的Java代码被称之为脚本片段(Scriptlets),没有嵌套在<%和%>之间的内容被称之为JSP的模版元素。
JSP中的Java代码可以使用out.println语句将其他Java程序代码产生的结果字符串输出给客户端,也可以使用System.out.println语句将它们打印到命令行窗口。
JSP文件就像普通的HTML文件一样,它们可以放置在WEB应用程序中的除了WEB-INF及其子目录外的其他任何目录中,JSP页面的访问路径与普通HTML页面的访问路径形式也完全一样。
JSP全称是Java Server Pages,它和servle技术一样,都是SUN公司定义的一种用于开发动态web资源的技术。
JSP这门技术的最大的特点在于,写jsp就像在写html,但它相比html而言,html只能为用户提供静态内容,而Jsp技术允许在页面中嵌套java代码,为用户提供动态数据。
Jsp快速入门:在jsp页面中输出当前时间。
不管是JSP还是Servlet,虽然都可以用于开发动态web资源。但由于这2门技术各自的特点,在长期的软件实践中,人们逐渐把servlet作为web应用中的控制器组件来使用,而把JSP技术作为数据显示模板来使用。
其原因为,程序的数据通常要美化后再输出:
让jsp既用java代码产生动态数据,又做美化会导致页面难以维护。
让servlet既产生数据,又在里面嵌套html代码美化数据,同样也会导致程序可读性差,难以维护。
因此最好的办法就是根据这两门技术的特点,让它们各自负责各的,servlet只负责响应请求产生数据,并把数据通过转发技术带给jsp,数据的显示jsp来做。
二、执行过程
1)首先,客户端发出请求(request ),请求访问JSP网页
2)接着,JSP Container将要访问的.JSP文件 转译成Servlet的源代码(.java文件)
3)然后,将产生的Servlet的源代码(.java文件)经过编译,生成.class文件,并加载到内存执行
4)最后把结果响应(response )给客户端
执行JSP网页文件时,需要经过两个时期:转译时期(TranslationTime)和请求时期(RequestTime)。
转译时期:JSP转译成Servlet类(.class文件)。
请求时期:Servlet类(.class文件)执行后,响应结果至客户端。
转译期间主要做了两件事情:
(1)将JSP网页转译为Servlet源代码(.java),此段称为转译时期(Translation time);
(2)将Servlet源代码(.java)编译成Servlet类(.class),此阶段称为编译时期(Compilation time)。
客户端发出请求,请求为JSP,web容器就会找出相应的servlet进行处理。
将servlet转成字节码文件。将字节码文件加载到web容器里。这时会在web容器里建立实例。进行初始化。通过service接受请求。然后web容器会自动产生两个对象servlet和service;最后进行销毁。
三、运行原理
(1)WEB容器JSP页面的访问请求时,它将把该访问请求交给JSP引擎去处理。Tomcat中的JSP引擎就是一个Servlet程序,它负责解释和执行JSP页面。
(2)每个JSP页面在第一次被访问时,JSP引擎先将它翻译成一个Servlet源程序,接着再把这个Servlet源程序编译成Servlet的class类文件,然后再由WEB容器像调用普通Servlet程序一样的方式来装载和解释执行这个由JSP页面翻译成的Servlet程序。
(3)Tomcat 5把为JSP页面创建的Servlet源文件和class类文件放置在“apache-tomcat-5.5.26\work\Catalina\localhost\<应用程序名>\”目录中,Tomcat将JSP页面翻译成的Servlet的包名为org.apache.jsp(即:apache-tomcat-5.5.26\work\Catalina\localhost\org\apache\jsp\文件下)
例子:
HelloJSP.jsp:(文件目录:D:\apache-tomcat-5.5.26\webapps\test_jsp\HelloJSP.jsp)
<%@pagelanguage="java"import="java.util.*"pageEncoding="gb2312"%><html><head><title>简单JSP页面示例</title></head><body>这是一个简单的JSP页面示例——HelloJSP<br></body></html>
HelloJSP.jsp页面被请求时,Web服务器中JSP编译器会编译生成对应的Java文件,如下:
HelloJSP_jsp.java:(文件目录:D:\apache-tomcat-5.5.26\work\Catalina\localhost\test_jsp\org\apache\jsp\HelloJSP_jsp.java)
importjavax.servlet.*; importjavax.servlet.http.*; importjavax.servlet.jsp.*; importjava.util.*; publicfinalclassHelloJSP_jspextendsorg.apache.jasper.runtime.HttpJspBaseimplementsorg.apache.jasper.runtime.JspSourceDependent { privatestaticjava.util.List_jspx_dependants; publicObjectgetDependants() { return_jspx_dependants; } publicvoid_jspService(HttpServletRequestrequest,HttpServletResponseresponse) throwsjava.io.IOException,ServletException { JspFactory_jspxFactory=null; PageContextpageContext=null; HttpSessionsession=null; ServletContextapplication=null; ServletConfigconfig=null; JspWriterout=null; Objectpage=this; JspWriter_jspx_out=null; PageContext_jspx_page_context=null; try { _jspxFactory=JspFactory.getDefaultFactory(); response.setContentType("text/html;charset=gb2312"); pageContext=_jspxFactory.getPageContext(this, request, response, null,true, 8192, true); _jspx_page_context=pageContext; application=pageContext.getServletContext(); config=pageContext.getServletConfig(); session=pageContext.getSession(); out=pageContext.getOut(); _jspx_out=out; out.write("\r\n"); out.write("<html>\r\n"); out.write("\t<head>\r\n"); out.write(" \t<title>简单JSP页面示例</title>\r\n"); out.write("\t</head>\r\n"); out.write("<body>\r\n"); out.write("\t这是一个简单的JSP页面示例――HelloJSP <br>\r\n"); out.write("\t</body>\r\n"); out.write("</html>\r\n"); } catch (Throwablet) { if (!(tinstanceofSkipPageException)){ out=_jspx_out; if (out!=null&&out.getBufferSize() !=0) out.clearBuffer(); if (_jspx_page_context!=null)_jspx_page_context.handlePageException(t); } } finally { if (_jspxFactory!=null)_jspxFactory.releasePageContext(_jspx_page_context); } } }
上面这段代码就是HelloJSP.jsp编译生成的Java代码,它的路径(我的电脑)为:D:\apache-tomcat-5.5.26\work\Catalina\localhost\test_jsp\org\apache\jsp中(其中:test_jsp为我的项目名称)。在这个目录下会有两个对应的文件,一个是class文件一个是java
文件如下:
四、生命周期
Servlet的生命周期
1)构造方法(第1次访问)
2)init方法(第1次访问)
3)service方法
4)destroy方法
Jsp的生命周期(翻看源码就可以发现jsp的方法和servlet很像)
1)翻译: jsp->java文件
2)编译: java文件->class文件(servlet程序)
3)构造方法(第1次访问)
4)init方法(第1次访问):_jspInit()
5)service方法:_jspService()
6)destroy方法:_jspDestroy()
五、总结
可以发现JSP就是Servlet,以及JSP间接继承了HttpServlet,所以JSP就是Servlet。Servlet的技术都可以用到JSP中,但JSP的技术不全能用到Servlet中。