婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識(shí)庫 > JSP的運(yùn)行內(nèi)幕

JSP的運(yùn)行內(nèi)幕

熱門標(biāo)簽:騰訊地圖標(biāo)注商戶改名注冊(cè)入駐 開封便宜外呼系統(tǒng)報(bào)價(jià) 黃石智能營(yíng)銷電銷機(jī)器人效果 地圖標(biāo)注人員兼職 商丘百應(yīng)電話機(jī)器人有沒有效果 怎樣把地圖標(biāo)注出來 漯河辦理400電話 電話機(jī)器人的特色和創(chuàng)新 淮南騰訊地圖標(biāo)注

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

本文將通過對(duì)一個(gè)JSP運(yùn)行過程的剖析,深入JSP運(yùn)行的內(nèi)幕,并從全新的視角闡述一些JSP中的技術(shù)要點(diǎn)。

HelloWorld.jsp

我們以Tomcat 4.1.17服務(wù)器為例,來看看最簡(jiǎn)單的HelloWorld.jsp是怎么運(yùn)行的。

代碼清單1:HelloWorld.jsp

HelloWorld.jsp
%
 String message = "Hello World!";
%>
%=message%>
 


  這個(gè)文件非常簡(jiǎn)單,僅僅定義了一個(gè)String的變量,并且輸出。把這個(gè)文件放到Tomcat的webapps\ROOT\目錄下,啟動(dòng)Tomcat,在瀏覽器中訪問http://localhost:8080/HelloWorld.jsp,瀏覽器中的輸出為“HelloWorld!”

  讓我們來看看Tomcat都做了什么。轉(zhuǎn)到Tomcat的\work\Standalone\localhost\_目錄下,可以找到如下的HelloWorld_jsp.java,這個(gè)文件就是Tomcat解析HelloWorld.jsp時(shí)生成的源文件:

  代碼清單2:HelloWorld_jsp.java

package org.apache.jsp;

import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.jsp.*;
import org.apache.jasper.runtime.*;

public class HelloWorld_jsp extends HttpJspBase {
 ......
public void _jspService(HttpServletRequest request,
HttpServletResponse response)throws java.io.IOException, ServletException
 {
  JspFactory _jspxFactory = null;
  javax.servlet.jsp.PageContext pageContext = null;
  HttpSession session = null;
  ServletContext application = null;
  ServletConfig config = null;
  JspWriter out = null;
  Object page = this;
  JspWriter _jspx_out = null;

  try {
   _jspxFactory = JspFactory.getDefaultFactory();
   response.setContentType("text/html;charset=ISO-8859-1");
   pageContext = _jspxFactory.getPageContext(this, request, response,null, true, 8192, true);
   application = pageContext.getServletContext();
   config = pageContext.getServletConfig();
   session = pageContext.getSession();
   out = pageContext.getOut();
   _jspx_out = out;

   String message = "Hello World!";
   out.print(message);
  } catch (Throwable t) {
   out = _jspx_out;
   if (out != null out.getBufferSize() != 0)
    out.clearBuffer();
   if (pageContext != null) pageContext.handlePageException(t);
  } finally {
  if (_jspxFactory != null) _jspxFactory.releasePageContext(pageContext);
  }
 }
}
 


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

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

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

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

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

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


  定制標(biāo)簽的解析過程

  在一個(gè)中大型的Web應(yīng)用中,通常使用JSP定制標(biāo)簽來封裝頁面顯示邏輯。剖析容器對(duì)定制標(biāo)簽的解析過程,對(duì)我們深入理解定制標(biāo)簽的運(yùn)行機(jī)理非常有幫助。下面我們以Struts1.1b中附帶的struts-example應(yīng)用的主頁運(yùn)行為例加以說明。

  包含定制標(biāo)簽的index.jsp

  Struts1.1b的下載地址是http://jakarta.apache.org/struts/index.html。將下載的包解壓,在webapps目錄下可以找到struts-example.war。將該War包拷貝到Tomcat的webapps目錄下,Tomcat會(huì)自動(dòng)安裝此應(yīng)用包。在瀏覽器中通過http://localhost:8080/struts-example訪問struts-example應(yīng)用,將顯示應(yīng)用的首頁(見圖1)。

 

  圖一 應(yīng)用的首頁

  代碼清單4:index.jsp

%@ page contentType="text/html;charset=UTF-8" language="java" %>
%@ taglib uri="/WEB-INF/struts-bean.tld" prefix="bean" %>
%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html" %>
%@ taglib uri="/WEB-INF/struts-logic.tld" prefix="logic" %>
html:html locale="true">
head>
title>bean:message key="index.title"/>/title>
html:base/>
/head>
body bgcolor="white">
……
/body>
/html:html>
 


  我們僅以index.jsp中的bean:message/>標(biāo)簽的解析為例進(jìn)行分析,看容器是怎樣把這個(gè)自定義標(biāo)簽解析成HTML輸出的。上面代碼省略了頁面的其它顯示部分。首先,查看上面瀏覽器中頁面的源文件:

html lang="zh">
head>
title>MailReader Demonstration Application (Struts 1.0)/title>
/head>
body bgcolor="white">
……
/body>
/html>
 


  可見,容器已經(jīng)把bean:message key="index.title"/>替換成一個(gè)字串,顯示為頁面的標(biāo)題。

  解析過程

  那么,JSP容器是怎樣完成解析的呢?查看在工作目錄jakarta-tomcat-4.1.17\work\Standalone\localhost\struts-example下解析后的index_jsp.java文件:

  代碼清單5:index_jsp.java

package org.apache.jsp;

import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.jsp.*;
import org.apache.jasper.runtime.*;
public class index_jsp extends HttpJspBase {
 //為所有的定制標(biāo)簽定義處理器池類的引用
 private org.apache.jasper.runtime.TagHandlerPool ;
 _jspx_tagPool_bean_message_key;
 ……
 //頁面類構(gòu)造方法
 public index_jsp() {
  _jspx_tagPool_bean_message_key =
  new org.apache.jasper.runtime.TagHandlerPool();
   ……
 }

 public void _jspService(HttpServletRequest request,
   HttpServletResponse response)
   throws java.io.IOException, ServletException {
  ……
  _jspxFactory = JspFactory.getDefaultFactory();
  response.setContentType("text/html;charset=UTF-8");
  pageContext = _jspxFactory.getPageContext(this,
    request, response,null, true, 8192, true);
  application = pageContext.getServletContext();
  config = pageContext.getServletConfig();
  session = pageContext.getSession();
  out = pageContext.getOut();
  _jspx_out = out;
  ……
  if (_jspx_meth_html_html_0(pageContext))
  return;
  ……
 }
 //頁面在處理退出時(shí)釋放所有定制標(biāo)簽的屬性
 public void _jspDestroy() {
  _jspx_tagPool_bean_message_key.release();
  ……
 }
}
 


  生成的index_jsp.java繼承于org.apache. jasper.runtime.HttpJspBase。研究這個(gè)文件為我們了解定制標(biāo)簽的運(yùn)行機(jī)理提供了途徑。

  從上面可以看出,Tomcat在解析一個(gè)JSP頁面時(shí),首先為每一個(gè)定制標(biāo)簽定義并實(shí)例化了一個(gè)TagHandlerPool對(duì)象。頁面的處理方法覆蓋父類的_ jspService()方法,_jspService方法首先初始化環(huán)境,為內(nèi)置對(duì)象賦值。由于index.jsp頁面整體由一個(gè)html:html/>標(biāo)簽包裹,Tomcat對(duì)每一個(gè)標(biāo)簽都產(chǎn)生一個(gè)私有方法加以實(shí)現(xiàn)。html:html/>標(biāo)簽的處理方法是_jspx_meth_html_html_0()。這個(gè)方法的命名規(guī)范大家也可以從這里看出,就是“_jspx_meth + 標(biāo)簽的前綴 + 標(biāo)簽名 + 該標(biāo)簽在JSP頁面同類標(biāo)簽中出現(xiàn)的序號(hào)”。其它標(biāo)簽都被包含在該標(biāo)簽中,所以其它標(biāo)簽在_jspx_meth_html_html_0()方法中進(jìn)行解析。具體的代碼實(shí)現(xiàn)請(qǐng)參見賽迪網(wǎng)http://linux.ccidnet.com期刊瀏覽2003年第6期。

  在_jspx_meth_html_html_0()方法中,首先從_jspx_tagPool_html_html_locale池中得到一個(gè)org.apache.struts.taglib.html.HtmlTag的實(shí)例,然后設(shè)置這個(gè)tag實(shí)例的頁面上下文及上級(jí)標(biāo)簽,由于html:html標(biāo)簽是頁面的最頂層標(biāo)簽,所以它的parent是null。然后對(duì)該標(biāo)簽的內(nèi)容進(jìn)行解析。HTML代碼直接輸出,下面主要看看html:html>/html:html>標(biāo)簽之間包含的bean:message key="index.title"/>標(biāo)簽的解析。對(duì)bean:message標(biāo)簽的解析類似于html:html,Tomcat也將其放入一個(gè)單獨(dú)的方法_jspx_meth_bean_message_0()中進(jìn)行。

  bean:message標(biāo)簽的解析

  代碼清單7:_jspx_meth_bean_message_0()方法片斷

//對(duì)message定制標(biāo)簽的處理方法
private boolean _jspx_meth_bean_message_0(
javax.servlet.jsp.tagext.Tag _jspx_th_html_html_0,
javax.servlet.jsp.PageContext pageContext) throws Throwable {
 JspWriter out = pageContext.getOut();
 /* ----  bean:message ---- */
 org.apache.struts.taglib.bean.MessageTag
 _jspx_th_bean_message_0 =
 (org.apache.struts.taglib.bean.MessageTag)
 _jspx_tagPool_bean_message_key.get(
 org.apache.struts.taglib.bean.MessageTag.class);
 _jspx_th_bean_message_0.setPageContext(pageContext);
 _jspx_th_bean_message_0.setParent(_jspx_th_html_html_0);
 _jspx_th_bean_message_0.setKey("index.title");
 int _jspx_eval_bean_message_0 = _jspx_th_bean_message_0.doStartTag();
 if (_jspx_th_bean_message_0.doEndTag()== javax.servlet.jsp.tagext.Tag.SKIP_PAGE)
  return true;
 _jspx_tagPool_bean_message_key.reuse(_jspx_th_bean_message_0);
  return false;
}
 


  同樣,對(duì)html:bean也需要從池中得到一個(gè)標(biāo)簽類的實(shí)例,然后設(shè)置環(huán)境。這里不再贅述。我們只專注對(duì)MessageTag定制標(biāo)簽類特殊的處理部分。定制標(biāo)簽類的開發(fā)不在本文討論范圍之內(nèi)。在index.jsp中定義了一個(gè)bean:message標(biāo)簽,并設(shè)置了一個(gè)屬性:bean:message key="index.title"/>。Tomcat在解析時(shí),調(diào)用MessageTag對(duì)象的key屬性設(shè)置方法setKey(),將該屬性置入。然后調(diào)用MessageTag的doStartTag()和doEndTag()方法,完成解析。如果doEndTag()方法的返回值為javax.servlet.jsp.tagext.Tag. SKIP_PAGE,表明已經(jīng)完成解析,返回true,Tomcat將立即停止剩余頁面代碼的執(zhí)行,并返回。否則把該MessageTag的實(shí)例放回池中。

  標(biāo)簽類對(duì)象實(shí)例的池化

  為了提高運(yùn)行效率,Tomcat對(duì)所有的定制標(biāo)簽類進(jìn)行了池化,池化工作由org.apache.jasper. runtime.TagHandlerPool類完成。TagHandlerPool類主要有兩個(gè)方法,代碼如下:

  代碼清單8:TagHandlerPool.java

public class TagHandlerPool {
 private static final int MAX_POOL_SIZE = 5;
 private Tag[] handlers;
 public synchronized Tag get(Class handlerClass) throws JspException {……}
 public synchronized void reuse(Tag handler) {……}
}
 


  TagHandlerPool簡(jiǎn)單地實(shí)現(xiàn)了對(duì)標(biāo)簽類的池化,其中MAX_POOL_SIZE是池的初始大小,handlers是一個(gè)Tag的數(shù)組,存儲(chǔ)標(biāo)簽類的實(shí)例。get(Class handlerClass)得到一個(gè)指定標(biāo)簽類的實(shí)例,如果池中沒有可用實(shí)例,則新實(shí)例化一個(gè)。reuse(Tag handler)把handler對(duì)象放回池中。

  至此,我們對(duì)JSP在容器中的運(yùn)行過程已經(jīng)了然于胸了。雖然每種JSP容器的解析結(jié)果會(huì)有差異,但其中的原理都雷同。對(duì)于編寫JSP應(yīng)用,我們并不需要干涉容器中的運(yùn)行過程,但如果你對(duì)整個(gè)底層的運(yùn)行機(jī)制比較熟悉,就能對(duì)JSP/Servlet技術(shù)有更深的認(rèn)識(shí)。

標(biāo)簽:拉薩 武威 岳陽 亳州 大興安嶺 鄭州 馬鞍山 紅河

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《JSP的運(yùn)行內(nèi)幕》,本文關(guān)鍵詞  JSP,的,運(yùn)行,內(nèi)幕,JSP,的,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《JSP的運(yùn)行內(nèi)幕》相關(guān)的同類信息!
  • 本頁收集關(guān)于JSP的運(yùn)行內(nèi)幕的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    另类小说图片综合网| 2023国产一二三区日本精品2022| 成人av午夜影院| 欧美午夜在线一二页| 91成人网在线| 亚洲欧洲成人av每日更新| 日韩成人午夜精品| 99精品偷自拍| 精品嫩草影院久久| 青青草91视频| 99久久精品久久久久久清纯| 欧美一区二区在线播放| 国产精品久久久久久久久快鸭| 亚洲一区二区三区小说| 粉嫩高潮美女一区二区三区| 欧美精品一级二级三级| 亚洲欧美色图小说| 91在线精品秘密一区二区| 国产调教视频一区| 日韩成人伦理电影在线观看| 99riav一区二区三区| 日韩精品综合一本久道在线视频| 肉肉av福利一精品导航| 色婷婷亚洲综合| 成人欧美一区二区三区1314| 国精品**一区二区三区在线蜜桃| 91网上在线视频| 亚洲人成精品久久久久久| 久草中文综合在线| 在线免费观看日韩欧美| 自拍偷拍国产亚洲| 在线国产亚洲欧美| 亚洲男帅同性gay1069| 懂色av中文一区二区三区| 日韩一二三区不卡| 亚洲国产日韩av| 欧美日韩精品欧美日韩精品一| 亚洲精品ww久久久久久p站 | 亚洲精品国产视频| 99精品视频一区| 国产精品第一页第二页第三页| 91麻豆福利精品推荐| 亚洲日本丝袜连裤袜办公室| 99久久久无码国产精品| 国产精品国产三级国产普通话蜜臀| 国产精品99久久久久久似苏梦涵| 久久精品免费在线观看| 粉嫩欧美一区二区三区高清影视| 久久精品无码一区二区三区| 国产91色综合久久免费分享| 欧美一区三区二区| 成人高清视频免费观看| 中文字幕一区在线观看视频| 91麻豆免费在线观看| 美腿丝袜亚洲色图| 精品日韩在线观看| 国产中文字幕一区| 中文一区在线播放| 欧美日韩高清一区二区| 亚洲一区二区不卡免费| 欧美日韩国产免费| 免费成人小视频| 欧美大片在线观看| 91老师国产黑色丝袜在线| 亚洲国产一区二区三区| 精品国产一区二区三区久久影院| 国产精品自拍av| 日韩影院免费视频| 精品久久一区二区| av不卡在线观看| 五月天中文字幕一区二区| 中文一区二区完整视频在线观看| 91一区二区三区在线观看| 亚洲18女电影在线观看| 精品欧美乱码久久久久久| 久久机这里只有精品| 亚洲色欲色欲www| 911精品产国品一二三产区 | 在线综合视频播放| 成人久久18免费网站麻豆| 一二三区精品福利视频| 91麻豆精品国产91久久久久久久久| 精品亚洲国产成人av制服丝袜| 欧美日韩国产大片| 不卡在线视频中文字幕| 亚洲超碰精品一区二区| 国产午夜精品一区二区三区四区 | 亚洲一区二区三区四区五区黄| 91精品国产91热久久久做人人| 成人影视亚洲图片在线| 欧美午夜精品电影| 一区二区在线观看不卡| 久久久久久久久久久久电影| 日本二三区不卡| 不卡一区二区三区四区| 理论电影国产精品| 亚洲第一会所有码转帖| 亚洲乱码精品一二三四区日韩在线| 国产日产欧美一区| 久久嫩草精品久久久久| 精品少妇一区二区三区在线播放| 欧美电影一区二区| 欧美理论片在线| 欧美日韩一区 二区 三区 久久精品| 91免费看`日韩一区二区| 成人性生交大片| 成人一区在线观看| 丁香婷婷综合色啪| 国产69精品久久99不卡| 国产成人在线网站| 国产乱码精品1区2区3区| 国产精品18久久久久久vr| 蜜桃av一区二区在线观看| 青娱乐精品在线视频| 免费久久99精品国产| 五月婷婷综合在线| 日韩二区在线观看| 日韩成人av影视| 日本中文一区二区三区| 久久超碰97人人做人人爱| 久久99久久久欧美国产| 国产成人免费视频网站| 高清在线观看日韩| av成人免费在线| 欧美亚洲综合久久| 51精品视频一区二区三区| 日韩西西人体444www| 日韩免费高清视频| 国产日韩精品久久久| 国产婷婷色一区二区三区四区| 久久精品亚洲乱码伦伦中文| 中文字幕亚洲成人| 亚洲美女偷拍久久| 五月激情六月综合| 六月丁香婷婷久久| 国产91丝袜在线观看| 色女孩综合影院| 欧美日韩视频不卡| 久久人人超碰精品| 中文一区二区完整视频在线观看| 国产精品白丝在线| 午夜精品视频在线观看| 国产乱码精品1区2区3区| 成人黄色在线看| 欧美日韩一区二区三区视频| 欧美xingq一区二区| 最近中文字幕一区二区三区| 日韩有码一区二区三区| 成人午夜看片网址| 欧美精品免费视频| 国产精品白丝在线| 免费日本视频一区| 色噜噜狠狠色综合欧洲selulu| 日韩精品中午字幕| 亚洲综合精品自拍| 高清在线观看日韩| 日韩一区二区在线看| 亚洲婷婷综合久久一本伊一区| 日本欧美一区二区| 色综合天天综合在线视频| 精品国产一区二区三区av性色 | 麻豆91小视频| 91麻豆精品秘密| 国产三级精品三级在线专区| 五月天久久比比资源色| 一本色道综合亚洲| 中文字幕国产一区| 国产一区二区女| 日韩三级视频中文字幕| 午夜精品久久久久影视| 91视频.com| 国产精品二三区| 丰满少妇久久久久久久| 久久婷婷国产综合精品青草| 免费看精品久久片| 欧美高清视频一二三区| 亚洲午夜日本在线观看| 色呦呦网站一区| 成人欧美一区二区三区视频网页| 国产麻豆精品久久一二三| 日韩欧美不卡一区| 日韩和的一区二区| 欧美揉bbbbb揉bbbbb| 亚洲特黄一级片| 9久草视频在线视频精品| 国产欧美中文在线| 国产另类ts人妖一区二区| 欧美sm极限捆绑bd| 国内一区二区视频| 日韩午夜激情免费电影| 午夜精品久久久久久久| 欧美日韩国产综合草草| 偷拍亚洲欧洲综合| 欧美疯狂性受xxxxx喷水图片| 亚洲成人tv网| 51午夜精品国产| 亚洲国产你懂的| 色www精品视频在线观看| 一区二区三区中文免费| 99国产精品久久久久久久久久久|