概念
JSP 是Java Server Page 的縮寫,是Servlet 的簡化。它是由Sun 公司提出的,并由許多公司參與制定的一種動態(tài)網(wǎng)頁標(biāo)準(zhǔn)。
其主要特點(diǎn)是在HTML 頁面中加入Java 代碼片段,或者使用各種JSP 標(biāo)簽,包括使用用戶標(biāo)簽,構(gòu)成JSP 網(wǎng)頁。
【早期使用JSP 頁面的用戶非常廣泛,一個Web 應(yīng)用可以全部由JSP 頁面組成,只輔以少量的JavaBean 即可。自J2EE 標(biāo)準(zhǔn)出現(xiàn)以后,人們逐漸認(rèn)識到使用JSP充當(dāng)過多的角色是不合適的Q 因此, JSP 慢慢發(fā)展成學(xué)一的表現(xiàn)層技術(shù),不再承擔(dān)業(yè)務(wù)邏輯組件及持久層組件的責(zé)任。】
JSP 是Servlet 的擴(kuò)展,在沒有JSP 之前,就已經(jīng)出現(xiàn)了Servlet 技術(shù)。Servlet 是利用輸出流動態(tài)生成HTML 頁面,包括每一個HTML 標(biāo)簽和每個在HTML 頁面中出現(xiàn)的內(nèi)容。
注釋
JSP 注釋用于表明在程序開發(fā)過程中的開發(fā)提示,它不會輸出到客戶端。
JSP 注釋的格式如下:
〈%--在注釋內(nèi)容--%>
與JSP 注釋形成對比的是HTML 注釋, HTML 注釋的格式是
<!--注釋內(nèi)容-->
JSP 頁面會編譯成一個Servlet 類,每個Servlet 在容器中只有一個實(shí)例:而在JSP 中聲明的變量是類的成員變量,成員變量只在創(chuàng)建實(shí)例時初始化,該變量的值將一直保存,直到實(shí)例銷毀。值得注意的是, infoO的值也可正常輸出。因?yàn)镴SP 聲明的方法其實(shí)是在JSP 編譯生成的Servlet 類的方法一Java 里的方法是不能獨(dú)立存在的,即使在JSP 頁面中也不行。
表達(dá)式
JSP 提供了一種輸出表達(dá)式值的簡單方法,輸出表達(dá)式值的格式如下:
〈%=表達(dá)式%〉
腳本
JSP 腳本的應(yīng)用非常廣泛,可通過Java 代碼鑲嵌在HTML 代碼中,即使用JSP 腳本。
因此,所有能在Java 程序中執(zhí)行的代碼,都可以通過JSP 腳本執(zhí)行。
看下面的代碼:
<! -- Java 腳本,這些腳本會對HTML 的標(biāo)簽產(chǎn)生作用一〉
〈%
for(int i = 0 ; i < 10 ; i++) {
%〉
<td><%=i%></td>
<%}%>
上面的JSP 頁面,其簡單的循環(huán)將導(dǎo)致<tr/>標(biāo)簽循環(huán)10 次,即生成一個10 行
的表格,并在表格中輸出表達(dá)式值
三個編譯指令
JSP 的編譯指令是通知JSP 引擎的消息,它不直接生成輸出。編譯指令都有默認(rèn)值,因此開發(fā)人員無須為每個指令設(shè)置值。
常見的編譯指令有三個。
page: 該指令是針對當(dāng)前頁面的指令。
include: 用于指定如何包含另一個頁面。
tablib: 用于定義和訪問自定義標(biāo)簽。
編譯指令的格式如下:
<%@ 編譯指令名 屬性名="屬性值"…%>
page 指令
page 指令,通常位于JSP 頁面的頂端,對同一個頁面可以有多個page 指令。
page指令的語法格式如下:
〈%@ page
[language="Java"]
[extends="package.class"]
[import= "package. class | package. *},…"]
[session=true | false"]
[buffer="none | 8kb | size kb"]
[autoFlush="true | false"]
[isThreadSafe="true | false"]
[info="text"]
[errorPage="relativeURL"]
[contentType=mimeType[ ;charset=characterSet]" | "text/html;charSet= ISO-8859-1"]
[isErrorPage=" true | false"]
%〉
下面依次介紹page 的各個屬性。
language: 聲明當(dāng)前JSP 頁面使用的腳本語言的種類,因?yàn)轫撁媸荍SP 頁面,該屬性的值通常都是java 。
extends: 確定JSP 程序編譯時所產(chǎn)生的Java 類,需要繼承的父類,或者需要實(shí)現(xiàn)的接口的全限定類名。
import: 用來導(dǎo)入包,下面幾個包是默認(rèn)自動導(dǎo)入的,不需要顯式導(dǎo)入。默認(rèn)導(dǎo)入的包有: java .lang.* javax.servlet.* javax.servlet.jsp.* javax.servlet. http
session: 設(shè)定這個JSP 頁面是否需要HTIP session 。
buffer: 指定輸出緩沖區(qū)的大小。輸出緩沖區(qū)的JSP 內(nèi)部對象: out 用于緩存JSP頁面對客戶瀏覽器的輸出,默認(rèn)值為8k,可以設(shè)置為none ,也可以設(shè)置為其他的值,單位為kb 。
autoFlush: 當(dāng)輸出緩沖區(qū)即將溢出時,是否需要強(qiáng)制輸出緩沖區(qū)的內(nèi)容。設(shè)置為true 時為正常輸出:如果設(shè)置為false ,會在buffer 溢出時產(chǎn)生一個異常。
info: 設(shè)置該JSP 程序的信息,也可以看做其說明,可以通過Servlet. getServletInfo
方法獲取該值。如果在JSP 頁面中,可直接調(diào)用getServletInfo方法獲取該值,因?yàn)镴SP 頁面的實(shí)質(zhì)就是Servlet 。
errorPage: 指定錯誤處理頁面。如果本程序產(chǎn)生了異常或者錯誤,而該JSP 頁面沒有對應(yīng)的處理代碼,則會自動調(diào)用該指令所指定的JSP 頁面。使用JSP 頁面時,可以不處理異常,即使是checked 異常。
isErroePage: 設(shè)置本JSP 頁面是否為錯誤處理程序。如果該頁面本身己是錯誤處理頁面,則無須使用errorPage 屬性。
contentType: 用于設(shè)定生成網(wǎng)頁的文件格式和編碼方式,即MIME 類型和頁面宇符集類型,默認(rèn)的MIME 類型是textlhtml; 默認(rèn)的字符集為ISO-8859-1。
include 指令
使用include 指令,可以將一個外部文件嵌入到當(dāng)前JSP 文件中,同時解析這個頁面
中的JSP 語句(如果有的話)。這是個靜態(tài)的include 語旬,不會檢查所包含JSP 頁面的變化。
include 既可以包含靜態(tài)的文本,也可以包含動態(tài)的JSP 頁面。靜態(tài)的編譯指令
include ,是將被包含的頁面加入進(jìn)來,生成一個完整的頁面。
include 編譯指令的語法:
〈%@ include file="relativeURLSpec" %〉
如果被嵌入的文件經(jīng)常需要改變,建議使用<jsp:include>操作指令,因?yàn)樗莿討B(tài)的include 語句。
JSP 的7 個動作指令
動作指令與編譯指令不間,編譯指令是通知Servlet 引擎的處理消息,而動作指令只
是運(yùn)行時的腳本動作。編譯指令在將JSP 編譯成Servlet 時起作用:處理指令通常可替換
成Java 腳本,是JSP 腳本的標(biāo)準(zhǔn)化寫法。
JSP 動作指令主要有如下7 個。
jsp:forward: 執(zhí)行頁面轉(zhuǎn)向,將請求的處理轉(zhuǎn)發(fā)到下一個頁面。
jsp:param: 用于傳遞參數(shù),必須與其他支持參數(shù)曲標(biāo)簽一起使用。
jsp:include: 用于動態(tài)引入一個JSP 頁面。
jsp:p1ugin: 用于下載JavaBean 或Applet 到客戶端執(zhí)行。
jsp:useBean: 使用JavaBean 。
jsp:setProperty: 修改JavaBean 實(shí)例的屬性值。
jsp:getProperty: 獲取JavaBean 實(shí)例的屬性值。
【forward 指令】
forward 指令用于將頁面響應(yīng)控制轉(zhuǎn)發(fā)給另外的頁面。既可以轉(zhuǎn)發(fā)給靜態(tài)的HTML
頁面,也可以轉(zhuǎn)發(fā)到動態(tài)的JSP 頁面,或者轉(zhuǎn)發(fā)到容器中的Servlet
JSP 的forward 指令的格式如下:
對于JSP 1. 0 ,使用如下語法:
<jsp: forward page=" {relativeURL | <%=expression%>}"/>
對于JSP 1. 1 以上,可使用如下語法:
<jsp:forward page=" { relativeURL | <%=expression %>}">
{<jsp:param.../>}
</jsp:forward>
<jsp:forward page="forward-result.jsp">
<jsp:param name="age" value="29"/>
</jsp:forward>
【include 指令】
include 指令是一個動態(tài)include 指令,也用于導(dǎo)入某個頁面,它的導(dǎo)入會每次檢查
被導(dǎo)入頁面的改變。下面是include 指令的使用格式:
<jsp: include page=" {relativeURL I <%=expression%>}" flush= “true” />
或者
<jsp:include page="{relativeURL I <%=expression%>}" flush="true 與
<jsp:param name="parameterName" value="patameterValue"l>
</jsp:include>
flush 屬性用于指定輸出緩存是否轉(zhuǎn)移到被導(dǎo)入文件中。如果指定為true,則包含在被導(dǎo)入文件中:如果指定為false,則包含在原文件中。對于JSP 1.1舊版本,只能設(shè)置為false。
對于第二種格式,可用于在導(dǎo)入頁面中加入?yún)?shù)值。
【useBean, setProperty, getProperty 指令】
這三個都是與JavaBean 相關(guān)的指令,其中第一個指令用于在JSP 頁面中初始化一個Java 實(shí)例; setProperty 指令用于修改JavaBean 實(shí)例的屬性; getProperty 用于獲取JavaBean實(shí)例的屬性。
useBean 的語法格式如下:
<jsp:useBean id="name" class="classname" scope="page | request | session | application" />
id 屬性是JavaBean 的實(shí)例名, class 屬性確定JavaBean 的實(shí)現(xiàn)類。
其中scope 屬性用于確定JavaBean 實(shí)例的生存范圍,該范圍有以下四個值。
page: 該JavaBean 實(shí)例僅在該頁面有效。
request: 該JavaBean 實(shí)例在本次請求有效。
session: 該JavaBean 實(shí)例在本次session 內(nèi)有效。
application: 該JavaBean 實(shí)例在本應(yīng)用內(nèi)一直有效。
setProperty 的語法格式如下:
<jsp:setProperty name="BeanName" proterty="propertyName" value="value"/>
其中name 屬性確定需要設(shè)定JavaBean 的實(shí)例名; property 屬性確定需要設(shè)置的屬性名; value 屬性則確定需要設(shè)置的屬性值。
getProperty 的語法格式如下:
<jsp:setProperty name="BeanName" proterty="propertyName" />
其中name'屬性確定需要輸出的JavaBean 的實(shí)例名; property 屬性確定需要輸出的屬性名。
【plugin 指令】
plugin 指令主要用于下載服務(wù)器端的JavaB ean 或Applet 到客戶端執(zhí)行。由于程序在
客戶端執(zhí)行,因此客戶端必須安裝虛擬機(jī)。
plugin 的語法格式如下:
<jsp:plugin type=bean | applet"
code="classFileName"
codebase="classFileDiretoryName"
[name=" instanceName"]
[archive="URLtoArchive"]
algin= "bottom 1 top I middle 1 left 1 right"]
[heigh="displayPixels"]
[width="displayPixels"]
[hspace="leftRightPixels"]
[vspace="topBottomPiexels"]
[jreversion=JREVersionNumber11.2"]
[nspluginurl="URLToPlugin"]
[iepluginurl="URLToPlugin"]>
[<jsp:parames>
[jsp:param name="parameterName" value="parameterValue"I>]
</jsp:params>]
[<jsp:fallback>text message for user that can no see the plugin
</jsp:fallback> ]
</jsp:plugin>
關(guān)于這些屬性的說明如下。
type: 指定被執(zhí)行的Java 程序的類型。
code: 指定被執(zhí)行的文件名,該屬性值必須以" .class" 擴(kuò)展名結(jié)尾。
codebase: 指定被執(zhí)行文件所在的目錄。
name: 給該程序起一個名字用來標(biāo)識該程序。
archive: 指向一些要預(yù)先載入的將要使用到的類的路徑。
hspace,vspace: 顯示左右,上下的留白。
jreversion: 能正確運(yùn)行該程序必需的JRE 版本,默認(rèn)值是1.2
nsplugin,ieplugin:Netscape Navigator, Internet Exploer下載運(yùn)行所需JRE 的地址。
<jsp:fallback>指令:當(dāng)不能正確顯示該Applet 時,代替顯示的提示信息。
【pararn 指令】
可以與以下三個指令結(jié)合使用:
jsp:include
jsp:forward
jsp:plugin
當(dāng)與include 指令結(jié)合使用時, pararn 指令用于將參數(shù)值傳入被導(dǎo)入的頁面:當(dāng)與
forward 指令結(jié)合使用時, pararn 指令用于將參數(shù)值傳入被轉(zhuǎn)向的頁面:當(dāng)與plugin 指令
結(jié)合使用時,則用于將參數(shù)傳入頁面中的JavaBean 實(shí)例或Applet 實(shí)例。
pararn 指令的語法格式如下:
<jsp:param name="pararnName" value="paramValue"/>
9 個內(nèi)置對象
application: javax.servlet. ServletContext 的實(shí)例,該實(shí)例代表JSP 所屬的Web 應(yīng)用
本身,可用于JSP 頁面,或者Servlet 之間交換信息。
常用的方法有
getAttribute(String attNarne) , setAttribute(String attNarne , String attValue)
和getInitParameter(String paramNarne)等。
config: javax.servlet. ServletConfig 的實(shí)例,該實(shí)例代表該JSP 的配置信息。
常用的方法有
getInitPararneter(String paramNarne) 及getInitPararneternarnes() 等方法。事實(shí)上, JSP 頁面通常無須配置,也就不存在配置信息。因此,該對象更多地在Servlet 中有效。
exception: java.lang.Throwable 的實(shí)例,該實(shí)例代表其他頁面中的異常和錯誤。只有當(dāng)頁面是錯誤處理頁面,即編譯指令page 的isErrorPage 屬性為true 時,該對象才可以使用。常用的方法有g(shù)etMessageO和printStackTrace等。
out: javax.servlet.jsp.JspWriter 的實(shí)例,該實(shí)例代表JSP 頁面的輸出流,用于輸出內(nèi)容,形成HTML 頁面。
page: 代表該頁面本身,通常沒有太大用處。也就是Servlet 中的this ,其類型就是生成的Servlet 。
pageContext: javax.servlet.jsp.PageContext 的實(shí)例,該對象代表該JSP 頁面上下文,使用該對象可以訪問頁面中的共享數(shù)據(jù)。常用的方法有g(shù)etServletContext和getServletConfig等。
request: javax.servlet. http:HttpServletRequest 的實(shí)例,該對象封裝了一次請求,客
戶端的請求參數(shù)都被封裝在該對象里。這是一個常用的對象,獲取客戶端請求參
數(shù)必須使用該對象。常用的方法有g(shù)etPararneter(String paramNarne),
getPararneterValues(String paramName),
setAttribute(String atttibuteName,Object attributeValue),
getAttribute(String attributeName)和setCharacterEncoding(String env)等。
response: javax.servlet.http.HttpServletResponse 的實(shí)例,代表服務(wù)器對客戶端的響應(yīng)。通常,也很少使用該對象直接響應(yīng),輸出響應(yīng)使用out 對象,而response 對象常用于重定向。常用的方法有sendRedirect(j ava.lang.String location)等。
session: javax.servlet.http.HttpSession 的實(shí)例,該對象代表一次會話。從客戶端瀏覽器與站點(diǎn)建立連接起,開始會話,直到關(guān)閉瀏覽器時結(jié)束會話。常用的方法有:
getAttribute(String attName), setAttribute(String attName, String attValue)等。
JSP 定義
JSP 屬性定義使用<jsp-property-group/>元素配置,主要包括如下四個方面。
·是否允許使用表達(dá)式語言:使用<el-ignored/>元素確定,默認(rèn)值為false 。
·是否允許使用Java 腳本:使用<scripting-invalid/>元素確定,默認(rèn)值為false 。
·聲明JSP 頁面的編碼:使用<page-encoding/>元素確定。
·使用隱式包含:使用<include-prelude/>和<include-codal>元素確定。
看下面的配置文件:
<?xm1 version="1.0" encoding="ISO-8859-1"?>
<!--Serv1et2.4 以上版本的Web 應(yīng)用配置的根元素->
<web-app xm1ns=''http://java.sun.com/xml/ns/j2ee"
xmlns:xsi=''http://www.w3.org /2 001/XMLSchema-instance''
xsi:schemaLocation=''http://java.sun.com/xml/ns/j2ee http://java.sun.com
/xml/ns/j2ee/web-app_2_4.xsd"
version="2.4">
<1-- 關(guān)于JSP 的配置信息-->
<jsp-config>
<]sp-property-group>
<!-- 對哪個文件應(yīng)用配置-->
<url-pattern>/test1.jsp</url-pattern>
<!--忽略表達(dá)式語言-->
<el-ignored>true</el-ignored>
<'--頁面編碼方式-->
<page-encoding>GBK</page-encoding>
<'--不允許使用Java 腳本-->
<scripting-invalid>true</scripting-invalid>
<'--隱式導(dǎo)入頁面頭-->
〈工nclude-prelude>/inc/top.jspf</inc1ude-prelude>
<'--隱式導(dǎo)入頁面尾-->
<include-coda>/inc/bottom.jspf</include-coda>
</jsp-property-group>
<]sp-property-group>
<1- 對哪個文件應(yīng)用配置->
<url-pattern>/test2.jsp</url-pattern>
<el-ignored>false</el-ignored>
<!-- 頁面編碼方苯-->
<page-encoding>GBK</page-encoding>
<!一允許使用Java 腳本一〉
<scripting-invalid>false</scripting-invalid>
</jsp-property-group>
</jsp-config>
</web-app>
注意:如果在不允許使用Java 腳本的頁面中使用Java 腳本,則頁面將出現(xiàn)錯誤。
即test1 .jsp 頁面中不允許出現(xiàn)Java 腳本。
表達(dá)式語言的內(nèi)置對象
使用表達(dá)式語言可以直接獲取請求參數(shù),可獲取頁面中某個JavaBean 的屬性值,獲取請求頭及獲取session 屬性值等,這些都得益于表達(dá)式語言的內(nèi)置對象。
表達(dá)式語言包含如下11 個內(nèi)置對象。
pageContext: 代表該頁面的pageContext 對象,與JSP 的pageContext 內(nèi)置對象相同。
pageScope: 用于獲取page 范圍的屬性值。
requestScope: 用于獲取request 范圍的屬性值。
sessionScope: 用于獲取session 范圍的屬性值。
applicationScope: 用于獲取application 范圍的屬性值。
param: 用于獲取請求的參數(shù)值。
paramValues: 用于獲取請求的參數(shù)值,與param 的區(qū)別在于,該對象用于獲取屬
性值為數(shù)組的屬性值。
header: 用于獲取請求頭的屬性值。
headerValues: 用于獲取請求頭的屬性值,與header 的區(qū)別在于,該對象用于獲取屬性值為數(shù)組的屬性值。
initParam: 用于獲取請求Web 應(yīng)用的初始化參數(shù)。
cookie: 用于獲取應(yīng)用的Cookie 值。
表達(dá)式語言的自定義函數(shù)
表達(dá)式語言除了可以使用基本的運(yùn)算符外,還可以使用自定義函數(shù)。通過使用自定
義函數(shù),加強(qiáng)了表達(dá)式語言的功能。
自定義函數(shù)的用法非常類似于標(biāo)簽的用法,同樣需要定義函數(shù)處理類和使用標(biāo)簽庫。
下面介紹定義函數(shù)的開發(fā)過程。
(1)開發(fā)函數(shù)處理類:函數(shù)處理類就是普通類,這個普通類中包含若干個靜態(tài)方法,
每個靜態(tài)方法都可定義成一個函數(shù)。
public class Functions{
//對字符串進(jìn)行反轉(zhuǎn)
public static String reverse( String text ){
return new StringBuffer(text).reverse().toString();
}
//統(tǒng)計字符串的個數(shù)
public static int countChar( String text) {
return text.length();
}
}
(2) 使用標(biāo)簽庫定義函數(shù),定義函數(shù)方法與定義標(biāo)簽庫方法相同。下面是定義函的配置文件:
<?xml version="l.O" encoding="UTF-8" ?>
<1 一標(biāo)簽庫配置文件的根元素一〉
<taglib xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/200l/XMLSchema-instance"
xsi:schemaLocation="http://j ava.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"
version="2.0">
<jsp-version>2.0</jsp-version>
<tlib-version>l.O</tlib-version>
<1-- 定義第一個函數(shù)>
<function>
<!- 定義第一個函數(shù):reverse-->
<name>reverse</name>
<!一定義函數(shù)的處理類>
<function-class>lee.Functction/function-class>
<!- 定義函數(shù)的對應(yīng)的方法-->
<function-signature>java.lang.String reverse( java.lang.String )
</function-signature>
</function>
<function〉
<!-- 定義第二個函數(shù): countChar-->
<name>countChar</name>
<!一定義函數(shù)的處理類->
<function-class>lee.Functions</function-class>
<1- 定義函數(shù)的對應(yīng)的方法->
<function-signature>int countChar( java.lang.String )</function-signature>
</function>
</taglib>
版權(quán)所有,轉(zhuǎn)載請注明出處 本文出自:
版權(quán)所有,歡迎轉(zhuǎn)載,轉(zhuǎn)載請注明出處,謝謝
posted on 2012-01-29 14:49
hoojo 閱讀(1678)
評論(1) 編輯 收藏 所屬分類:
JavaEE 、
Jsp/Servlet