一、起源

在很多动态网页中,绝大部分内容都是固定不变的,只有局部内容需要动态产生和改变。 

如果使用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 - 起源、执行过程、运行原理、生命周期-LMLPHP

JSP - 起源、执行过程、运行原理、生命周期-LMLPHP

客户端发出请求,请求为JSP,web容器就会找出相应的servlet进行处理。

JSP - 起源、执行过程、运行原理、生命周期-LMLPHP

将servlet转成字节码文件。

JSP - 起源、执行过程、运行原理、生命周期-LMLPHP

将字节码文件加载到web容器里。

JSP - 起源、执行过程、运行原理、生命周期-LMLPHP

这时会在web容器里建立实例。

JSP - 起源、执行过程、运行原理、生命周期-LMLPHP

进行初始化。

JSP - 起源、执行过程、运行原理、生命周期-LMLPHP

通过service接受请求。

JSP - 起源、执行过程、运行原理、生命周期-LMLPHP

然后web容器会自动产生两个对象servlet和service;最后进行销毁。

JSP - 起源、执行过程、运行原理、生命周期-LMLPHP

 

三、运行原理

(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)

import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.jsp.*;
import java.util.*;
public final class HelloJSP_jsp extendsorg.apache.jasper.runtime.HttpJspBase
    implementsorg.apache.jasper.runtime.JspSourceDependent {
private static java.util.List _jspx_dependants;
public Object getDependants() {
    return _jspx_dependants;
  }
public void _jspService(HttpServletRequest request,HttpServletResponse response) throws java.io.IOException,ServletException {
    JspFactory _jspxFactory = null;
    PageContext pageContext =null;
    HttpSession session =null;
    ServletContext application =null;
    ServletConfig config =null;
    JspWriter out = null;
    Object page = 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 (Throwable t) {
      if (!(t instanceof SkipPageException)){
        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

文件如下:

JSP - 起源、执行过程、运行原理、生命周期-LMLPHP

 

四、生命周期

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中。

10-04 17:41