經(jīng)常有朋友問(wèn)起,JSP和Servlet之間有什么區(qū)別,兩者之間又有什么聯(lián)系?其實(shí)Servlet技術(shù)的出現(xiàn)時(shí)間很早,是當(dāng)時(shí)為了Java的服務(wù)器端應(yīng)用而開(kāi)發(fā)的。大家都知道Applet是應(yīng)用小程序,Servlet就是服務(wù)器端小程序了。但在Microsoft公司的ASP技術(shù)出現(xiàn)后,使用Servlet進(jìn)行響應(yīng)輸出時(shí)一行行的輸出語(yǔ)句就顯得非常笨拙,對(duì)于復(fù)雜布局或者顯示頁(yè)面更是如此。JSP就是為了滿足這種需求在Servlet技術(shù)之上開(kāi)發(fā)的??梢?jiàn),JSP和Servlet之間有著內(nèi)在的血緣關(guān)系,在學(xué)習(xí)JSP時(shí),如果能夠抓住這種聯(lián)系,就能更深刻地理解JSP的運(yùn)行機(jī)理,達(dá)到事半功倍的效果。
本文將通過(guò)對(duì)一個(gè)JSP運(yùn)行過(guò)程的剖析,深入JSP運(yùn)行的內(nèi)幕,并從全新的視角闡述一些JSP中的技術(shù)要點(diǎn)。
HelloWorld.jsp
我們以Tomcat 4.1.17服務(wù)器為例,來(lái)看看最簡(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,在瀏覽器中訪問(wèn)http://localhost:8080/HelloWorld.jsp,瀏覽器中的輸出為“HelloWorld!”
讓我們來(lái)看看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)
新聞熱點(diǎn)
疑難解答
圖片精選