深度解析JSP工作原理


相信大家一定對jsp(即Java Server Page)並不陌生吧,也許你經常用到它,但是很多人不懂它的工作原理.
我利用空餘的工作時間,總結出來點東西,希望大家對jsp有深刻的瞭解和認識.
      JSP是Servlet的擴展,JSP沒出現之前,就已經出現了Servlet技術.Servlet是利用了"輸出流",動態的生成了HTML頁面。
  包括每一個HTML標籤和所有的HTML頁面中出現的內容,簡單點說就是利用Servlet的輸出流將HTML標籤生成一個HTML頁面。
  由於時間長了Servlet中包含了大量的HTML標籤、大量的靜態文本及格式等,導致了Servlet的開發效率非常低下.
  這時候JSP誕生了,JSP彌補了這種情況,JSP通過在標準的THML頁面中嵌入JAVA代碼,使其靜態的部分無需JAVA程序控制,
  只有那些需要從數據庫讀取或需要動態生成的頁面內容,才使用JAVA腳本控制。
      從而可以看出來JSP主要是由兩部分組成:
   靜態部分:標準的HTML標籤、靜態的頁面內容,這些內容與靜態HTML頁面相同.
   動態部分:Java程序控制的內容,這些內容由Java程序來動態生成。
  下面是一個最簡單的一段jsp代碼;
   <%@ page contentType="text/html; charset=GBK" language="java" errorPage="" %>
     <html>
       <head>
         <title>歡迎</title>
       </head>
        <body>
               歡迎學習Java JSP!現在時間是:<%out.println(new java.util.Date());%>
       </body>
    </html>
頁面中粗體字代碼放在<%和%>之間,表明這些是Java腳本,而不是靜態內容,
通過這種方式就可以把Java代碼嵌入HTML頁面中,這就變成了動態的JSP頁面
從表面上來分析,JSP頁面已經不再需要Java類,似乎感覺完全脫離了Java面向對象的特徵了。
但是,實際上JSP是Servlet的一種特殊的形式,每一個JSP的頁面就是一個Servlet的實例。
爲什麼是Servlet實例?那是因爲你的web項目中每一個JSP頁面,首先都會由Servlet容器生成對應的Servlet類.
這個生成好的類放在C:\Program Files\Apache Software Foundation\Tomcat 6.0\work目錄下(注:這裏是我自己默認的安裝的目錄).
如果你有過研究的話,你會發現,你部署完你的項目之後,當你啓動了Tomcat之後,你可以在Tomcat的work\Catalina\localhost\你項目名\org\apache\jsp
目錄下找到index_jsp.class 和index_jsp.java這兩個文件.其實index_jsp.java是一個特殊的Java類,實際上就是一個Servlet類。
index_jsp.java 這個類間接的繼承了Servlet。仔細看下面的代碼:
//JSP頁面經過Tomcat編譯後默認的包
package org.apache.jsp;

import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.jsp.*;
//繼承HttpJspBase類,該類其實是Servlet的子類
public final class test_jsp extends org.apache.jasper.runtime.HttpJspBase
implements org.apache.jasper.runtime.JspSourceDependent {
private static final JspFactory _jspxFactory = JspFactory.getDefaultFactory();
private static java.util.List _jspx_dependants;
private javax.el.ExpressionFactory _el_expressionfactory;
private org.apache.AnnotationProcessor _jsp_annotationprocessor;
public Object getDependants() {
return _jspx_dependants;
}
public void _jspInit() {
_el_expressionfactory = _jspxFactory.getJspApplicationContext
(getServletConfig().getServletContext()).getExpressionFactory();
_jsp_annotationprocessor = (org.apache.AnnotationProcessor)
getServletConfig().getServletContext().getAttribute(org.apache.
AnnotationProcessor.class.getName());
}
public void _jspDestroy() {
}
//用於響應用戶請求的方法
public void _jspService(HttpServletRequest request, HttpServletResponse response)
throws java.io.IOException, ServletException {
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 {
//設置響應格式
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("<!-- 表明這爲一個JSP頁面 -->\r\n");
out.write("\r\n");
out.write("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 Transitional
//EN\">\r\n");
out.write("<HTML>\r\n");
out.write("<HEAD>\r\n");
out.write("<TITLE>第二個JSP頁面</TITLE>\r\n");
out.write("</HEAD>\r\n");
out.write("<BODY>\r\n");
out.write("<!-- 下面是Java腳本 -->\r\n");
//頁面中的循環,在此處循環輸出
for(int i = 0 ; i < 7; i++)
{
out.println("<font size='" + i + "'>");
out.write("\r\n");
out.write("Java的web世界!)</font>\r\n");
out.write("<br>\r\n");
}
out.write("\r\n");
out.write("</BODY>\r\n");
out.write("</HTML>\r\n");
} catch (Throwable t) {
if (!(t instanceof SkipPageException)){
out = _jspx_out;
if (out != null && out.getBufferSize() != 0)
try { out.clearBuffer(); } catch (java.io.IOException e) {}
if (_jspx_page_context != null) _jspx_page_context.
handlePageException(t);
}
} finally {
_jspxFactory.releasePageContext(_jspx_page_context);
}
}
}
雖然你看不懂上面的代碼,但是沒關係,因爲全是WEB容器負責生成的。
其實我個人理解JSP的工作原理非常簡單包含如下幾條:
1.JSP頁面必須要在JSP服務器內運行,如tomcat weblogic,jboss等等.
(順便說一下,apache 和 tomcat是兩碼事兒,有不少人認爲apache就是tomcat,
其實是錯誤的理解!~,tomcat只是apache中的一個子項目,apache是作爲WEB應用服務器,而tomcat可以說是JSP或Servlet的一個web容器)
2.JSP頁面必須先生成Servlet才能被服務器響應給客戶端。
3.每個JSP頁面的第一個訪問者速度很慢,那是因爲必須等到JSP頁面編譯成Servlet。
4.JSP頁面的訪問者無須安裝任何客戶端,甚至不需要可以運行Java的運行環境,因爲JSP頁面輸送到客戶端的是標準HTML頁面。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章