日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
細(xì)看JSP應(yīng)用運(yùn)行中與Servlet的關(guān)系

經(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í)一行行的輸出語句就顯得非常笨拙,對于復(fù)雜布局或者顯示頁面更是如此。JSP就是為了滿足這種需求在Servlet技術(shù)之上開發(fā)的??梢?,JSP和Servlet之間有著內(nèi)在的血緣關(guān)系,在學(xué)習(xí)JSP時(shí),如果能夠抓住這種聯(lián)系,就能更深刻地理解JSP應(yīng)用的運(yùn)行機(jī)理,達(dá)到事半功倍的效果。

超過十載行業(yè)經(jīng)驗(yàn),技術(shù)領(lǐng)先,服務(wù)至上的經(jīng)營模式,全靠網(wǎng)絡(luò)和口碑獲得客戶,為自己降低成本,也就是為客戶降低成本。到目前業(yè)務(wù)范圍包括了:網(wǎng)站設(shè)計(jì)、網(wǎng)站制作,成都網(wǎng)站推廣,成都網(wǎng)站優(yōu)化,整體網(wǎng)絡(luò)托管,微信小程序開發(fā),微信開發(fā),成都app開發(fā),同時(shí)也可以讓客戶的網(wǎng)站和網(wǎng)絡(luò)營銷和我們一樣獲得訂單和生意!

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

HelloWorld.jsp

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

代碼清單1:HelloWorld.jsp

HelloWorld.jsp

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

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

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

代碼清單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,nulltrue, 8192, true);  
  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在運(yùn)行時(shí)首先解析成一個(gè)Java類HelloWorld_jsp.java,該類繼承于org.apache.jasper.runtime.HttpJspBase基類,HttpJspBase實(shí)現(xiàn)了HttpServlet接口。可見,JSP應(yīng)用在運(yùn)行前首先將編譯為一個(gè)Servlet,這就是理解JSP技術(shù)的關(guān)鍵。

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

首先,調(diào)用JspFactory的getDefaultFactory()方法獲取容器實(shí)現(xiàn)(本文中指Tomcat 4.1.17)的一個(gè)JspFactory對象的引用。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)置對象都經(jīng)由該pageContext得到。具體過程見上面的代碼,這里不再贅述。該頁面Servlet的環(huán)境設(shè)置完畢,開始對頁面進(jìn)行解析。HelloWorld.jsp頁面僅僅定義了一個(gè)String變量,然后直接輸出。解析后的代碼如下:

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

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

以上,JSP應(yīng)用的運(yùn)行過程應(yīng)該很清楚了。


分享文章:細(xì)看JSP應(yīng)用運(yùn)行中與Servlet的關(guān)系
文章出自:http://www.5511xx.com/article/cooehes.html