《Web網(wǎng)站設(shè)計(jì)與開發(fā)教程》課件第8章_第1頁
《Web網(wǎng)站設(shè)計(jì)與開發(fā)教程》課件第8章_第2頁
《Web網(wǎng)站設(shè)計(jì)與開發(fā)教程》課件第8章_第3頁
《Web網(wǎng)站設(shè)計(jì)與開發(fā)教程》課件第8章_第4頁
《Web網(wǎng)站設(shè)計(jì)與開發(fā)教程》課件第8章_第5頁
已閱讀5頁,還剩94頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

第8章JSP基本語法及基本技術(shù)8.1JSP技術(shù)概況 8.2JSP基本語法8.3JSP指令8.4JSP動(dòng)作

【學(xué)習(xí)提示】Servlet使用out對(duì)象的println(

)方法輸出HTML代碼,這種方式不僅繁瑣、工作量大而且容易出錯(cuò)。為此,Sun公司在Java語言基礎(chǔ)上開發(fā)出JSP,用于簡(jiǎn)化Web開發(fā)人員的工作。JSP和Servlet的本質(zhì)是一樣的。JSP最終必須編譯成Servlet才能運(yùn)行。JSP比較簡(jiǎn)單,它的特點(diǎn)是在HTML頁面中嵌入Java代碼片段,或使用各種JSP標(biāo)簽,包括用戶自定義的標(biāo)簽,從而可以動(dòng)態(tài)地提供頁面內(nèi)容。早期使用JSP頁面的用戶非常廣泛,一個(gè)Web應(yīng)用可以全部由JSP頁面組成,只輔以少量的JavaBean即可。自從JavaEE標(biāo)準(zhǔn)出現(xiàn)以后,人們逐漸認(rèn)識(shí)到使用JSP充當(dāng)過多的角色是不合適的。因此,JSP如今發(fā)展成單一的表現(xiàn)層技術(shù),不再承擔(dān)業(yè)務(wù)邏輯組件及持久層組件的功能。本章主要講解JSP的基本語法、指令標(biāo)簽和動(dòng)作標(biāo)簽的使用方法。

JSP(JavaServerPages)是由SunMicrosystems公司倡導(dǎo)、許多公司參與一起建立的一種動(dòng)態(tài)網(wǎng)頁技術(shù)標(biāo)準(zhǔn)。JSP技術(shù)類似于微軟公司的ASP(ActiveServerPage)技術(shù),是將小段的Java程序代碼(Scriptlet)和JSP標(biāo)簽插入HTML文件中,形成在服務(wù)器端運(yùn)行的JSP文件(通常擴(kuò)展名為.jsp)。8.1JSP技術(shù)概況作為基于Java的網(wǎng)站開發(fā)技術(shù),JSP應(yīng)用程序具有跨平臺(tái)等特性,因而在網(wǎng)站項(xiàng)目開發(fā)中得到廣泛應(yīng)用。下面代碼是一個(gè)最簡(jiǎn)單的JSP程序,hello.jsp。

<html>

<head>

<title>FirstPage</title>

</head>

<body>

<H3><%="HelloWorld!"%></H3>

</body>

</html>其執(zhí)行結(jié)果為HTML文檔,如下:

<html>

<head>

<title>

FirstPage

</title>

</head>

<body>

<H3>HelloWorld!</H3>

</body>

</html>

JSP與JavaServlet一樣都是在服務(wù)器端執(zhí)行的,執(zhí)行的結(jié)果通常以HTML文件的形式由Web服務(wù)器返回給瀏覽器端。事實(shí)上,JSP與JavaServlet不僅功能相似,而且具有內(nèi)在的、緊密的關(guān)系。在JSP頁面被執(zhí)行的過程中,會(huì)被JSP編譯器(JSPcompiler)編譯為Servlet源代碼,進(jìn)而被Java編譯器(Javacompiler)編譯為可在Java虛擬機(jī)中執(zhí)行的字節(jié)代碼并被執(zhí)行,如圖8-1所示。當(dāng)然,這兩個(gè)編譯的操作僅在對(duì)JSP頁面的第一次請(qǐng)求時(shí)自動(dòng)發(fā)生,之后便不再重復(fù),除非開發(fā)人員提交了新的JSP代碼。

圖8-1JSP程序執(zhí)行過程針對(duì)本節(jié)前面的JSP程序?qū)嵗?,下面的代碼就是由JSP編譯器所生成的Servlet源代碼。

packageorg.apache.jsp;

importjavax.servlet.*;

importjavax.servlet.http.*;

importjavax.servlet.jsp.*;

publicfinalclasshello_jspextendsorg.apache.jasper.runtime.HttpJspBase

implementsorg.apache.jasper.runtime.JspSourceDependent{

privatestaticfinaljavax.servlet.jsp.JspFactory_jspxFactory=

javax.servlet.jsp.JspFactory.getDefaultFactory();

privatestaticjava.util.Map<java.lang.String,java.lang.Long>_jspx_dependants;

privatejavax.el.ExpressionFactory_el_expressionfactory;

privateorg.apache.tomcat.InstanceManager_jsp_instancemanager;

publicjava.util.Map<java.lang.String,java.lang.Long>getDependants(){

return_jspx_dependants;

}

publicvoid_jspInit(){

_el_expressionfactory=_jspxFactory.getJspApplicationContext(getServletConfig()

.getServletContext()).getExpressionFactory();

_jsp_instancemanager=org.apache.jasper.runtime.InstanceManagerFactory.

getInstanceManager

(getServletConfig());

}

publicvoid_jspDestroy(){

}

publicvoid_jspService(finaljavax.servlet.http.HttpServletRequestrequest,finaljavax.servlet.http.HttpServletResponseresponse)

throwsjava.io.IOException,javax.servlet.ServletException{

finaljavax.servlet.jsp.PageContextpageContext;

javax.servlet.http.HttpSessionsession=null;

finaljavax.servlet.ServletContextapplication;

finaljavax.servlet.ServletConfigconfig;

javax.servlet.jsp.JspWriterout=null;

finaljava.lang.Objectpage=this;

javax.servlet.jsp.JspWriter_jspx_out=null;

javax.servlet.jsp.PageContext_jspx_page_context=null;

try{

response.setContentType("text/html");

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("\r\n");

out.write("<html>\r\n");

out.write("<head>\r\n");

out.write("<title>\r\n");

out.write("FirstPage\r\n");

out.write("</title>\r\n");

out.write("</head>\r\n");

out.write("\t<body>\r\n");

out.write("\t\t\t<H3>");

out.print("HelloWorld!");

out.write("</H3>\r\n");

out.write("\t</body>\r\n");

out.write("</html>\r\n");

}catch(java.lang.Throwablet){

if(!(tinstanceofjavax.servlet.jsp.SkipPageException)){

out=_jspx_out;

if(out!=null&&out.getBufferSize()!=0)

try{out.clearBuffer();}catch(java.io.IOExceptione){}

if(_jspx_page_context!=null)_jspx_page_context.handlePageException(t);

elsethrownewServletException(t);

}

}finally{

_jspxFactory.releasePageContext(_jspx_page_context);

}

}

}借助Java和Servlet本身的優(yōu)點(diǎn),JSP具有以下技術(shù)優(yōu)勢(shì):

(1)跨平臺(tái)性。JSP技術(shù)支持多種操作系統(tǒng)和硬件平臺(tái),可以在Windows、Linux、Unix中直接部署,代碼無需改動(dòng)。

(2)可伸縮性。JSP可以在很小的系統(tǒng)中運(yùn)行來支持小規(guī)模的Web服務(wù),也可以到多臺(tái)服務(wù)器中運(yùn)行來支持集群和負(fù)載均衡機(jī)制。

(3)開發(fā)工具的多樣性和開放性。目前,已經(jīng)有了許多優(yōu)秀的開發(fā)工具支持JSP的開發(fā),而且其中有很多是開源產(chǎn)品。廣泛的技術(shù)支持為JSP的發(fā)展帶來了巨大的動(dòng)力。

(4)服務(wù)器端的可擴(kuò)展性。JSP支持服務(wù)器端組件,可以使用成熟的JavaBean組件來實(shí)現(xiàn)復(fù)雜的商務(wù)功能。

依據(jù)JSP的語法規(guī)則,在Html代碼中嵌入Java程序的方式可以分為三類:程序片、表達(dá)式和聲明。下面進(jìn)行詳細(xì)說明。8.2JSP基本語法8.2.1程序片

在“<%”和“%>”之間可以包含任何符合Java語言語法的程序片段。此標(biāo)簽中嵌入的代碼段在服務(wù)器端被執(zhí)行,真正實(shí)現(xiàn)動(dòng)態(tài)網(wǎng)頁的功能。一個(gè)JSP頁面可以嵌入多個(gè)程序片,這些程序片被JSP引擎并按順序執(zhí)行。

下面例子中的程序片(ShowServerTime.jsp)負(fù)責(zé)顯示服務(wù)器的時(shí)間。

<%@pagelanguage="java"import="java.util.*,java.text.*"pageEncoding="UTF-8"%>

<!DOCTYPEHTMLPUBLIC"-//W3C//DTDHTML4.01Transitional//EN">

<html>

<head>

<title>服務(wù)器時(shí)間</title>

</head>

<body>

<%

Datenow=newDate();

DateFormatd1=DateFormat.getDateInstance();

Stringstr1=d1.format(now);

out.write("用Date方式顯示時(shí)間:"+now+"<br>");

out.write("用DateFormat.getDateInstance格式化時(shí)間后為:"+str1);

%>

</body>

</html>

上述代碼的運(yùn)行結(jié)果如圖8-2所示。

圖8-2JSP顯示服務(wù)器時(shí)間8.2.2表達(dá)式

JSP表達(dá)式經(jīng)常被用到,在“<%=”和“%>”之間可包含任何一個(gè)有效的Java表達(dá)式。表達(dá)式在服務(wù)器端經(jīng)過計(jì)算后,將計(jì)算結(jié)果轉(zhuǎn)化成字符串插入到該表達(dá)式在JSP文件中的位置上。表達(dá)式后面不能加分號(hào)。

下面的例子(expression_test.jsp)使用表達(dá)式輸出100的平方根。

<html>

<head>

<title>表達(dá)式示例</title>

</head>

<body>

100的平方根為

<%=Math.sqrt(100)%>

</body>

</html>

expression_test.jsp的運(yùn)行結(jié)果如圖8-3所示。

圖8-3JSP表達(dá)式示例8.2.3聲明

<%!intnumber=0;%>被稱為JSP聲明,用于聲明所生成servlet類的成員,即變量、方法和類都可以聲明?!?lt;%!”和“%>”標(biāo)簽之間的所有內(nèi)容都會(huì)增加到類中,而且置于_jspService(

)方法之外。這意味著使用該標(biāo)簽可以聲明靜態(tài)變量和方法,成為頁面級(jí)別的共享變量,并可被訪問此網(wǎng)頁的所有用戶共享。

1.變量聲明

使用上述標(biāo)簽聲明變量的JSP文件(def_var.jsp)源碼如下:

<html>

<head>

<title>變量聲明示例</title>

</head>

<body>

<%!intnumber=0;%>

<!--上一行代碼聲明一個(gè)變量number-->

Thenumberofthispageis:

<%=++number%>

</body>

</html>

def_var.jsp文件運(yùn)行后由Tomcat自動(dòng)生成的servlet源文件如下:

publicfinalclassdef_005fvar_jspextendsorg.apache.jasper.runtime.HttpJspBase

implementsorg.apache.jasper.runtime.JspSourceDependent{

intnumber=0;

publicvoid_jspService(finaljavax.servlet.http.HttpServletRequestrequest,finaljavax.servlet.http.HttpServletResponseresponse)

out.print(++number);

}

其運(yùn)行結(jié)果如圖8-4所示。

圖8-4JSP變量聲明示例

2.方法聲明

在“<%!”和“%>”之間聲明方法的JSP文件(def_met.jsp)源碼如下:

<html>

<head>

<title>方法聲明示例</title>

</head>

<body>

<!--下面的代碼聲明一個(gè)方法square()-->

<%!doublesquare(doublex){

doubleresult=Math.pow(x,2);

returnresult;}%>

<%!doublenumber=45;%>

Thesquareof<%=number%> is:

<%=square(number)%>

<!--上一行代碼使用聲明的方法square()-->

</body>

</html>

def_met.jsp的運(yùn)行結(jié)果如圖8-5所示。

圖8-5JSP方法聲明示例在“<%!”和“%>”之間聲明的方法在整個(gè)JSP頁面內(nèi)有效,但在該方法內(nèi)定義的變量只在該方法內(nèi)有效。這些方法將在Java程序片中被調(diào)用時(shí),則方法內(nèi)定義的變量被分配內(nèi)存,調(diào)用完畢即可釋放所占用的內(nèi)存。當(dāng)多個(gè)客戶同時(shí)請(qǐng)求一個(gè)JSP頁面,并調(diào)用方法操作成員變量時(shí),可以在方法前增加“synchronized”實(shí)現(xiàn)同步。

3.類聲明

在“<%!”和“%>”之間還可以聲明類,該類在JSP頁面內(nèi)有效。即JSP頁面中的Java程序片可以調(diào)用該類創(chuàng)建對(duì)象。現(xiàn)舉例如下:

def_class.jsp

<%@pagelanguage="java"import="java.util.*"pageEncoding="UTF-8"%>

<html>

<head>

<title>聲明類</title>

</head>

<body>

<p>請(qǐng)輸入一個(gè)數(shù):</p>

<br>

<form

name="form"method="post"action="def_class.jsp">

<inputtype="text"name="number"value="1">

<inputtype="submit"name="submit"value="送出"></form>

<!--下面的代碼聲明一個(gè)類SquareRoot-->

<%!publicclassSquareRoot

{doublenumber;

SquareRoot(doublenumber)

{this.number=number;

}

doublecompute()

{returnMath.sqrt(number);

}

}

%>

<%Stringstr=request.getParameter("number");

doublei;

if(str!=null)

{i=Double.valueOf(str).doubleValue();

}

else

{i=1;

}

SquareRootsquareRoot=newSquareRoot(i);//由類SquareRoot生成對(duì)象squareRoot

%>

<p><%=i%>的平方根是:

<br>

<%=squareRpute()%></p>

<!—調(diào)用對(duì)象squareRoot的compute()方法-->

</body>

</html>

在上述例子中定義了一個(gè)SquareRoot類負(fù)責(zé)求平方根,當(dāng)客戶向服務(wù)器提交一個(gè)實(shí)數(shù)后,由該類生成的對(duì)象負(fù)責(zé)計(jì)算平方根。def_class.jsp的運(yùn)行結(jié)果如圖8-6所示,在文本框中輸入99,單擊“送出”按鈕,運(yùn)行結(jié)果如圖8-7所示。

圖8-6JSP類聲明示例

圖8-7def_class計(jì)算99的平方根8.2.4JSP中的注釋

注釋可以增強(qiáng)JSP文件的可讀性,JSP中的注釋可分為兩種:

(1)

HTML注釋:在

<!--

-->

之間加入注釋內(nèi)容。即:

<!--注釋內(nèi)容-->

JSP引擎把HTML注釋交給客戶,客戶端通過瀏覽器查看JSP的源文件時(shí),能夠看到HTML注釋。

(2)

JSP注釋:在<%--

--%>之間加入注釋內(nèi)容。即:

<%--注釋內(nèi)容--%>

JSP引擎忽略JSP注釋,即在編譯JSP頁面時(shí)忽略該注釋,客戶端無法看到相應(yīng)的注釋內(nèi)容。

JSP指令主要用來提供整個(gè)JSP頁面的相關(guān)信息并指定JSP頁面的相關(guān)屬性。它們是通知JSP引擎的消息,不直接生成輸出。其語法格式如下:

<%@指令名屬性名=“屬性值”%>

常見的編譯指令有如下三個(gè):

page:該指令是針對(duì)當(dāng)前頁面的指令,用于定義頁面的全局屬性。

include:用于指定包含另一個(gè)靜態(tài)文件。

taglib:用于定義和訪問自定義標(biāo)簽。8.3JSP指令8.3.1page指令

Page指令通常位于JSP頁面的頂端,一個(gè)JSP頁面可以使用多條JSP指令。其語法格式如下:

<%@page屬性1=“值1”屬性2=“值2”…%>

Page指令的常用屬性如下表8-1所示。表8-1page指令的常用屬性上述屬性中除import可以指定多個(gè)屬性值外,其他屬性均只能指定一個(gè)值。示例如下:

<%@pagelanguage="java"import="java.util.*"pageEncoding="UTF-8"%>

<%@import="java.sql.*,java.lang.*"%>

page指令中的info屬性及顯示舉例(page_info.jsp)如下:

<%@pagelanguage="java"import="java.util.*"pageEncoding="UTF-8"%>

<%@pageinfo="測(cè)試page指令的info屬性"%>

<!DOCTYPEHTMLPUBLIC"-//W3C//DTDHTML4.01Transitional//EN">

<html>

<head>

<title>MyJSP'page_info.jsp'startingpage</title>

</head>

<body>

<%=getServletInfo()%><br>

</body>

</html>上述代碼中設(shè)置page指令的info屬性值為“測(cè)試page指令的info屬性”,其運(yùn)行效果如下圖8-8所示。

圖8-8測(cè)試page指令的info屬性

errorPage屬性的實(shí)質(zhì)是JSP的異常處理機(jī)制,JSP腳本不要求強(qiáng)制處理異常。如果JSP頁面在運(yùn)行中拋出未處理的異常,系統(tǒng)將自動(dòng)跳轉(zhuǎn)到errorPage屬性指定的頁面;如果errorPage沒有指定錯(cuò)誤頁面,系統(tǒng)則直接把異常信息呈現(xiàn)給客戶端瀏覽器。

下面的示例(errorPage_test.jsp)設(shè)置了page指令的errorPage屬性,指定了當(dāng)前頁面發(fā)生異常時(shí)的處理頁面。具體代碼如下:

<%@pagelanguage="java"pageEncoding="UTF-8"errorPage="error.jsp"%>

<!DOCTYPEHTMLPUBLIC"-//W3C//DTDHTML4.01Transitional//EN">

<html>

<head>

<title>MyJSP'errorPage_test.jsp'startingpage</title>

</head>

<body>

<%

int[]ints=newint[]{1,2,3,4};

out.write(ints[4]);

%>

</body>

</html>在上述代碼中指定errorPage_test.jsp頁面的錯(cuò)誤處理頁面是error.jsp。error.jsp頁面中將page指令的isErrorPage屬性設(shè)為“true”,具體代碼如下:

<%@pagelanguage="java"pageEncoding="UTF-8"isErrorPage="true"%>

<!DOCTYPEHTMLPUBLIC"-//W3C//DTDHTML4.01Transitional//EN">

<html>

<head>

<title>錯(cuò)誤提示頁面</title>

</head>

<body>

系統(tǒng)出現(xiàn)異常<br>

</body>

</html>

在瀏覽器中errorPage_test.jsp的運(yùn)行結(jié)果如圖8-9所示;如果去除errorPage屬性,其運(yùn)行結(jié)果如圖8-10所示。

圖8-9設(shè)置errorPage屬性的運(yùn)行結(jié)果

圖8-10沒有設(shè)置errorPage屬性的運(yùn)行結(jié)果8.3.2include指令

include指令用來在JSP頁面出現(xiàn)該指令的位置處,靜態(tài)插入一個(gè)文件(如JSP文件、HTML文件和txt文件等),不能插入用

<%=

%>

表達(dá)式代表的文件。被插入的文件必須是可訪問和可使用的,即該文件必須和當(dāng)前JSP頁面在同一Web服務(wù)目錄中。而靜態(tài)插入是指當(dāng)前JSP頁面和插入的部分合并成一個(gè)新的JSP頁面,然后JSP引擎再將這個(gè)新的JSP頁面轉(zhuǎn)譯成Java類文件。因此,插入文件后,必須保證新合并的JSP頁面符合JSP語法規(guī)則,即能夠成為一個(gè)JSP頁面文件。例如,最好不要在被插入的文件中出現(xiàn)

<html>、</html>、<body>

</body>

等結(jié)構(gòu)化標(biāo)簽。

include指令的語法格式如下:

<%@includefile="被插入文件URL"%>

下面的示例(static_include.jsp)采用include指令插入Register.html文件,具體代碼如下:

<%@pagelanguage="java"pageEncoding="UTF-8"%>

<!DOCTYPEHTMLPUBLIC"-//W3C//DTDHTML4.01Transitional//EN">

<html>

<head>

<title>MyJSP'static_include.jsp'startingpage</title>

</head>

<body><divalign="center">

注冊(cè)信息表<br>

<%@includefile="Register.html"%>

</div></body>

</html>

被插入頁面Register.html的代碼如下:

<formmethod="get"name="register">用戶名:<inputtype="text"maxlength="16"size="10"name="name">

<p>密碼:<inputtype="password"size="12"name="password"></p>

<p>密碼確認(rèn):<inputtype="password"size="12"name="password1"></p>

<p><inputtype="submit"name="button1"value="注冊(cè)">

<inputtype="reset"value="重置"name="button2"></p>

</form>

JSP文件static_include的運(yùn)行結(jié)果如圖8-11所示。

圖8-11include指令運(yùn)用示例注意:使用inlude指令插入含有中文的靜態(tài)文件時(shí),必須確保JSP文件和被插入文件的編碼方式一致,可以采用UTF-8、gbk和gb2312等方式;JSP文件可以采用page指令的pageEncoding屬性設(shè)置編碼方式;html文件在存儲(chǔ)的時(shí)候要選擇其編碼方式。8.3.3taglib指令

在JSP中taglib指令用來聲明此JSP文件使用的自定義標(biāo)簽,同時(shí)引用標(biāo)簽庫,并指定標(biāo)簽的前綴。語法格式如下:

<%@tagliburi="標(biāo)簽庫的URI"prefix="標(biāo)簽前綴"%>

taglib指令有兩個(gè)屬性值:

●uri:指明標(biāo)簽庫文件的存放位置。

●prefix:指明該自定義標(biāo)簽使用時(shí)的前綴。

舉例:在MyEclipse中建立名為Chapter8的Web工程中,新建一包,包名為mytag。

(1)在mytag下,新建一Java類,內(nèi)容如下:

packagemytag;

importjava.io.IOException;

importjavax.servlet.jsp.*;

importjavax.servlet.jsp.tagext.*;

publicclassHelloWorldTagextendsTagSupport{

publicintdoStartTag()throwsJspTagException{

returnEVAL_BODY_INCLUDE;

}

publicintdoEndTag()throwsJspTagException{

try{

pageContext.getOut().write("HelloWorld");

}catch(IOExceptionex){

thrownewJspTagException("Error!");

}

returnEVAL_PAGE;

}

}

(2)在WEB-INF下新建一目錄,目錄名為tlds,再在tlds下面新建一tld文件,命名為hello.tld,內(nèi)容如下:

<?xmlversion="1.0"encoding="ISO-8859-1"?>

<!DOCTYPEtaglib

PUBLIC"-//SunMicrosystems,Inc.//DTDJSPTagLibrary1.1//EN"

"/j2ee/dtds/web-jsptaglibrary_1_1.dtd">

<taglib>

<tlibversion>1.0</tlibversion>

<jspversion>1.1</jspversion>

<shortname>myTag</shortname>

<tag>

<name>hello</name>

<tagclass>mytag.HelloWorldTag</tagclass>

<bodycontent>empty</bodycontent>

</tag>

</taglib>

(3)在WebRoot中創(chuàng)建taglib_test.jsp頁面,代碼如下:

<%@pagelanguage="java"%>

<%@tagliburi="/WEB-INF/tlds/hello.tld"prefix="mytag"%>

<html>

<body>

<mytag:hello></mytag:hello>

</body>

</html>

上述代碼的運(yùn)行效果如圖8-12所示。

圖8-12taglib指令示例

JSP動(dòng)作標(biāo)簽在JSP頁面運(yùn)行時(shí)執(zhí)行服務(wù)器端的任務(wù)(如包含一個(gè)文件、頁面跳轉(zhuǎn)、傳遞參數(shù)等),不需要我們編寫Java代碼。而上一節(jié)提到的JSP指令標(biāo)簽則在將JSP編譯成Servlet時(shí)起作用。我們可以形象地將JSP動(dòng)作標(biāo)簽看成動(dòng)態(tài)的,JSP指令標(biāo)簽看成靜態(tài)的。

常用的JSP動(dòng)作標(biāo)簽如下表8-2所示。8.4JSP動(dòng)作表8-2JSP動(dòng)作標(biāo)簽列表

下面對(duì)前四個(gè)動(dòng)作標(biāo)簽進(jìn)行詳細(xì)講解,后面三個(gè)標(biāo)簽將在第十章JavaBean技術(shù)中進(jìn)行詳述。8.4.1include動(dòng)作

include動(dòng)作標(biāo)簽用來在JSP頁面中動(dòng)態(tài)包含一個(gè)文件。所謂動(dòng)態(tài),即包含頁面程序與被包含頁面的程序是彼此獨(dú)立的,互不影響,僅僅在JSP引擎運(yùn)行包含頁面時(shí)執(zhí)行到<jsp:include>標(biāo)簽,JSP引擎才會(huì)插入被包含頁面的body內(nèi)容。

include動(dòng)作標(biāo)簽的語法格式如下:

<jsp:includepage="{靜態(tài)URL|<%=表達(dá)式%>"flush="true|false"}/>

或者

<jsp:includepage="{靜態(tài)URL|<%=表達(dá)式%>"flush="true|false"}>

<jsp:paramname="參數(shù)名"value="{參數(shù)值|<%=表達(dá)式%>}"/>

</jsp:include>

page屬性表示被包含文件的存放位置,flush屬性用于指定輸出緩存是否轉(zhuǎn)移到被包含文件中。如果指定為true,則包含在被插入文件中;如果指定為false,則包含在原文件中。JSP1.1版本的文件只能設(shè)置為false。第二種語法格式中,可以在被包含文件中加入額外的請(qǐng)求參數(shù)。傳遞到被包含頁面的參數(shù)的值可以通過HttpServletRequest類的getParameter()方法獲得。

下面的示例(include_action.jsp)使用include動(dòng)作標(biāo)簽插入指定JSP頁面,具體代碼如下:

<%@pagelanguage="java"pageEncoding="UTF-8"%>

<!DOCTYPEHTMLPUBLIC"-//W3C//DTDHTML4.01Transitional//EN">

<html>

<head>

<title>include動(dòng)作標(biāo)簽</title>

</head>

<body>

<fontcolor="#0000ff"size="5"><strong>下面的內(nèi)容使用include動(dòng)作標(biāo)簽包含ShowServer

Time.jsp文件</strong></font><br>

<jsp:includepage="ShowServerTime.jsp"></jsp:include>

</body>

</html>

上述代碼執(zhí)行效果如圖8-13所示。

圖8-13include動(dòng)作標(biāo)簽運(yùn)行結(jié)果從運(yùn)行結(jié)果上看,include動(dòng)作標(biāo)簽和include指令沒有什么不同。但查看include_action.jsp生成的Servlet源代碼,可以發(fā)現(xiàn)不同之處:

out.write("<body>\n");

out.write("<fontcolor=\"#0000ff\"size=\"5\"><strong>下面的內(nèi)容使用include動(dòng)作標(biāo)簽包含ShowServerTime.jsp文件</strong></font><br>\r\n");

out.write("");

org.apache.jasper.runtime.JspRuntimeLibrary.include(request,response,"ShowServerTime.jsp",out,false);

out.write("\r\n");

上述代碼片段中黑體字代碼顯示了include動(dòng)作標(biāo)簽的原理:使用一個(gè)include方法來插入被包含頁面的內(nèi)容,而不是將目標(biāo)頁面完全融入本頁面中。

因此,靜態(tài)包含和動(dòng)態(tài)包含的區(qū)別如下:

(1)靜態(tài)包含是將被包含頁面的代碼完全導(dǎo)入,兩個(gè)頁面融合成一個(gè)整體Servlet;而動(dòng)態(tài)包含則在Servlet中使用include方法來引入被包含頁面的內(nèi)容。

(2)靜態(tài)包含時(shí)被包含頁面的編譯指令會(huì)起作用;而動(dòng)態(tài)包含時(shí)被包含頁面的編譯指令則失去作用,只是插入頁面的body內(nèi)容。

(3)動(dòng)態(tài)包含還可以向被包含頁面?zhèn)鬟f參數(shù)。

第二種語法格式的示例(include_param.jsp)如下:

<%@pagelanguage="java"pageEncoding="UTF-8"%>

<!DOCTYPEHTMLPUBLIC"-//W3C//DTDHTML4.01Transitional//EN">

<html>

<head>

<title>include動(dòng)作與param動(dòng)作嵌套使用</title>

</head>

<body>

使用param動(dòng)作標(biāo)簽向show_paramvalue.jsp傳遞參數(shù)<br>

<jsp:includepage="show_paramvalue.jsp">

<jsp:paramname="number"value="1000"/>

</jsp:include>

</body>

</html>

被包含頁面show_paramvalue.jsp的代碼如下:

<%@pagelanguage="java"pageEncoding="UTF-8"%>

<!DOCTYPEHTMLPUBLIC"-//W3C//DTDHTML4.01Transitional//EN">

<html>

<head>

<title>接收參數(shù)頁面</title>

</head>

<body>

由inlude動(dòng)作標(biāo)簽嵌套Param動(dòng)作標(biāo)簽傳遞過來的參數(shù)值為:

<%=request.getParameter("number")%>

</body>

</html>

include_param.jsp頁面的運(yùn)行結(jié)果如下圖8-14所示。

圖8-14傳遞參數(shù)的include動(dòng)作標(biāo)簽8.4.2forward動(dòng)作

forward動(dòng)作可以把請(qǐng)求轉(zhuǎn)發(fā)到同一Web應(yīng)用中的其他頁面,既可以是靜態(tài)的HTML頁面,也可以是JSP頁面,或一個(gè)Servl

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論