自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

細看JSP應用運行中與Servlet的關系

開發(fā) 后端
本文通過對一個JSP應用運行過程的剖析,深入JSP運行的內幕。經解析發(fā)現,JSP應用在運行前首先將編譯為一個Servlet,這就是理解JSP技術的關鍵。

經常有朋友問起,JSP和Servlet之間有什么區(qū)別,兩者之間又有什么聯系?其實Servlet技術的出現時間很早,是當時為了Java的服務器端應用而開發(fā)的。大家都知道Applet是應用小程序,Servlet就是服務器端小程序了。但在Microsoft公司的ASP技術出現后,使用Servlet進行響應輸出時一行行的輸出語句就顯得非常笨拙,對于復雜布局或者顯示頁面更是如此。JSP就是為了滿足這種需求在Servlet技術之上開發(fā)的??梢姡琂SP和Servlet之間有著內在的血緣關系,在學習JSP時,如果能夠抓住這種聯系,就能更深刻地理解JSP應用的運行機理,達到事半功倍的效果。

本文將通過對一個JSP應用運行過程的剖析,深入JSP運行的內幕,并從全新的視角闡述一些JSP中的技術要點。

HelloWorld.jsp

我們以Tomcat 4.1.17服務器為例,來看看最簡單的HelloWorld.jsp應用程序是怎么運行的。

代碼清單1:HelloWorld.jsp

HelloWorld.jsp

  1. < %  
  2.  String message = "Hello World!";  
  3. %> 
  4. < %=message%>  

這個文件非常簡單,僅僅定義了一個String的變量,并且輸出。把這個文件放到Tomcat的webappsROOT目錄下,啟動Tomcat,在瀏覽器中訪問http://localhost:8080/HelloWorld.jsp,瀏覽器中的輸出為“HelloWorld!”

讓我們來看看Tomcat都做了什么。轉到Tomcat的workStandalonelocalhost_目錄下,可以找到如下的HelloWorld_jsp.java,這個文件就是Tomcat解析HelloWorld.jsp時生成的源文件:

代碼清單2:HelloWorld_jsp.java

  1. package org.apache.jsp;  
  2. import javax.servlet.*;  
  3. import javax.servlet.http.*;  
  4. import javax.servlet.jsp.*;  
  5. import org.apache.jasper.runtime.*;  
  6. public class HelloWorld_jsp extends HttpJspBase {  
  7.  ......  
  8. public void _jspService(HttpServletRequest request,   
  9. HttpServletResponse response)throws java.io.IOException, ServletException  
  10.  {  
  11.   JspFactory _jspxFactory = null;  
  12.   javax.servlet.jsp.PageContext pageContext = null;  
  13.   HttpSession session = null;  
  14.   ServletContext application = null;  
  15.   ServletConfig config = null;  
  16.   JspWriter out = null;  
  17.   Object page = this;  
  18.   JspWriter _jspx_out = null;  
  19.   try {  
  20.    _jspxFactory = JspFactory.getDefaultFactory();  
  21.    response.setContentType("text/html;charset=ISO-8859-1");  
  22.    pageContext = _jspxFactory.getPageContext(this, request, response,nulltrue8192true);  
  23.    application = pageContext.getServletContext();  
  24.    config = pageContext.getServletConfig();  
  25.    session = pageContext.getSession();  
  26.    out = pageContext.getOut();  
  27.    _jspx_out = out;  
  28.    String message = "Hello World!";  
  29.    out.print(message);  
  30.   } catch (Throwable t) {  
  31.    out = _jspx_out;  
  32.    if (out != null && out.getBufferSize() != 0)  
  33.     out.clearBuffer();  
  34.    if (pageContext != null) pageContext.handlePageException(t);  
  35.   } finally {  
  36.   if (_jspxFactory != null) _jspxFactory.releasePageContext(pageContext);  
  37.   }  
  38.  }  
  39. }  

從上面可以看出,HelloWorld.jsp在運行時首先解析成一個Java類HelloWorld_jsp.java,該類繼承于org.apache.jasper.runtime.HttpJspBase基類,HttpJspBase實現了HttpServlet接口。可見,JSP應用在運行前首先將編譯為一個Servlet,這就是理解JSP技術的關鍵。

我們還知道JSP頁面中內置了幾個對象,如pageContext、application、config、page、session、out等,你可能會奇怪,為什么在JSP中的代碼片斷中可以直接使用這些內置對象。觀察_jspService()方法,實際上這幾個內置對象就是在這里定義的。在對JSP文件中的代碼片斷進行解析之前,先對這幾個內置對象進行初始化。

首先,調用JspFactory的getDefaultFactory()方法獲取容器實現(本文中指Tomcat 4.1.17)的一個JspFactory對象的引用。JspFactory是javax.servlet.jsp包中定義的一個抽象類,其中定義了兩個靜態(tài)方法set/getDefaultFactory()。set方法由JSP容器(Tomcat)實例化該頁面Servlet(即HelloWorld_jsp類)的時候置入,所以可以直接調用JspFactory.getDefaultFactory()方法得到這個JSP工廠的實現類。Tomcat是調用org.apache.jasper.runtime.JspFactoryImpl類。

然后,調用這個JspFactoryImpl的getPageContext()方法,填充一個PageContext返回,并賦給內置變量pageConext。其它內置對象都經由該pageContext得到。具體過程見上面的代碼,這里不再贅述。該頁面Servlet的環(huán)境設置完畢,開始對頁面進行解析。HelloWorld.jsp頁面僅僅定義了一個String變量,然后直接輸出。解析后的代碼如下:

代碼清單3:JSP頁面解析后的代碼片斷

  1. String message = "Hello World!";  
  2. out.print(message);  

以上,JSP應用的運行過程應該很清楚了。

【編輯推薦】

  1. 充分使用標簽功能編寫JSP應用(JSTL)
  2. JSP換行問題解決辦法一覽
  3. 簡化JSP表達式中代碼
  4. 淺析JSP服務器
  5. 監(jiān)視JSP中JVM可用內存
責任編輯:yangsai 來源: CSDN博客
相關推薦

2009-07-06 15:47:11

Servlet API

2009-07-03 14:02:51

2009-07-03 13:54:38

Java Servle

2009-07-03 12:48:24

Java Servle

2012-06-29 13:31:56

ServletJSPJava

2009-07-03 10:46:48

JSP ServletJavaBean

2009-06-25 14:26:07

JSPJavaBeanServlet

2009-07-07 11:18:59

JSP Servlet

2009-07-06 15:34:56

JSP和Servlet

2009-07-01 13:54:41

Servlet和JSP

2009-07-01 17:34:03

Servlet和JSP

2009-08-10 09:19:28

Servlet JSP

2009-06-30 15:37:27

Servlet和JSP

2009-07-08 09:22:03

Servlet和JSP

2009-07-06 09:49:26

Servlet JSP

2009-07-08 15:13:00

獲取所session數JSPServlet

2009-03-02 09:45:45

2009-06-29 16:24:00

JSP和Servlet

2009-06-30 17:10:28

JSP和Servlet

2009-06-30 14:51:19

JSP和Servlet
點贊
收藏

51CTO技術棧公眾號