版權(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年版高校專利技術(shù)轉(zhuǎn)讓合同
- 2024-2030年中國大棗飲料行業(yè)銷售模式及投資盈利預(yù)測(cè)報(bào)告
- 2024-2030年中國城市電視臺(tái)行業(yè)發(fā)展策略及投資運(yùn)作模式分析報(bào)告
- 2024年農(nóng)業(yè)產(chǎn)業(yè)投資合同擔(dān)保協(xié)議3篇
- 2024年校園水電設(shè)施改造與維護(hù)服務(wù)合同3篇
- 馬鞍山師范高等??茖W(xué)?!段锫?lián)網(wǎng)應(yīng)用概論》2023-2024學(xué)年第一學(xué)期期末試卷
- 2024年創(chuàng)新創(chuàng)業(yè)項(xiàng)目投資評(píng)估與咨詢服務(wù)協(xié)議3篇
- 2024年度自動(dòng)駕駛汽車勞動(dòng)合同與聘用合同3篇
- 2024年標(biāo)準(zhǔn)化信息技術(shù)外包服務(wù)合同一
- 2024年度行政合同科技創(chuàng)新合同糾紛救濟(jì)與保障協(xié)議2篇
- 機(jī)器學(xué)習(xí)(山東聯(lián)盟)智慧樹知到期末考試答案章節(jié)答案2024年山東財(cái)經(jīng)大學(xué)
- 德勤公司概況簡(jiǎn)介
- DB32∕T 2156-2012 電梯能耗測(cè)試及能效分級(jí)
- 瀝青路面日常養(yǎng)護(hù)及維修施工要點(diǎn)(大量附圖共143頁)
- 《色彩基礎(chǔ)知識(shí)》PPT課件(詳解)
- 《保健按摩師》(二級(jí))理論知識(shí)鑒定要素細(xì)目表
- 甘蔗制糖簡(jiǎn)介
- 三秦出版社五年級(jí)上冊(cè)綜合實(shí)踐教案
- 屋頂分布式光伏項(xiàng)目安全文明施工控制措施
- 水泥保證供應(yīng)實(shí)施方案及服務(wù)承諾書
- 2022機(jī)要密碼工作總結(jié)機(jī)要室工作總結(jié).doc
評(píng)論
0/150
提交評(píng)論