一、jsp基礎
1.JSP概念
Servlet是j2ee提供的動態資源開發技術,是以java的程序的形式進行開發,在java中書寫HTML標簽是一件十分頭疼的事情,所以人們開發出了JSP,看起來像是HTML一樣,但是通過服務器的編譯最終可以生成Servlet
2.JSP的組成部分
2.1模版元素
直接書寫在JSP中的HTML內容,看起來就像寫HTML一樣的方便,但是最終會在被翻譯成Servlet的過程中 out.write()直接輸出
2.2腳本表達式
<%= 表達式%> 接受的是一段java表達式,在JSP翻譯到Servlet的過程中,將會計算表達式的值,利用out.write()輸出出去
2.3腳本片段
<% %>直接可以在腳本片段中書寫java源代碼,其中的源代碼將會直接拷貝到翻譯過來的servlet中的響應位置上。
2.4JSP聲明
<%! %>在其中可以寫java代碼,其中的源代碼會被拷貝到servlet中的service方法之外,可以利用它來為servlet增加成員方法、成員變量、靜態代碼塊
2.5JSP注釋
<%-- --%>被jsp注釋包圍起來的內容將不會被服務器翻譯到servlet之中,要注意區分html注釋和java注釋的區別
jsp注釋不會被翻譯到servlet中,會在翻譯時遺棄
java注釋不會被編譯到class文件中,會在編譯時遺棄
html注釋將會當作模版元素,直接輸出到浏覽器中,浏覽器將不會顯示html注釋中的內容
2.6JSP指令
2.6.1page指令
用來通知翻譯引擎,如果翻譯當前的JSP
[ language="java" ] 當前JSP使用的開發語言
[ extends="package.class" ] 當前jsp翻譯成servlet後要繼承的類,注意此值必須是一個servlet的子類,一般情況下不要改
[ import="{package.class | package.*}, ..." ] 導入需要使用到的包 java.lang.*;javax.servlet.*;javax.servlet.jsp.*;javax.servlet.http.*;
[ session="true | false" ] 用來指定當前頁面是否使用session,如果設置為true,則翻譯過來的servlet中將會有對session對象的引用,於是可以直接在jsp中使用session隱式對象。但是這將導致一旦訪問jsp就會調用request.getSession()方法,可能導致不必要的空間浪費。如果確定jsp中不需要session可以設為false
[ buffer="none | 8kb | sizekb" ] out隱式對象所使用的緩沖區的大小
[ autoFlush="true | false" ] out隱式對象是否自動刷新緩沖區,默認為true,不需要更改
[ isThreadSafe="true | false" ] 翻譯過來的servlet是否實現SingleThreadModel
[ errorPage="relative_url" ] 如果頁面出錯,將要跳轉到的頁面,除了在jsp中使用此屬性指定錯誤頁面外也可以在web.xml中配置整個web應用的錯誤頁面,如果兩個都設置則jsp中的此屬性起作用
[ isErrorPage="true | false" ] 如果設置此屬性為true,翻譯過來的servlet中將含有Exception隱式對象,其中封裝的就是上一個頁面中拋出的異常對象
[ contentType="mimeType [ ;charset=characterSet ]" | "text/html ; charset=ISO-8859-1" ] 和jsp亂碼相關的指令,用來指定jsp輸出時,設置的Content-Type響應頭用來指定浏覽器打開的編碼
[ pageEncoding="characterSet | ISO-8859-1" ] 服務器翻譯jsp時使用的編碼集.如果向防止jsp亂碼,應該保證文件的保存編碼和jsp翻譯成servlet用的編碼以及輸出到浏覽器後浏覽器打開的編碼一致.此屬性一旦設置好,翻譯引擎會間接幫我們設置content-type屬性.
[ isELIgnored="true | false" ] 當前頁面是否使用el表達式,設置為false時表示啟用el,j2ee4.0開始默認支持,j2ee4.0一下做開發時,如果要使用el表達式,需將此屬性設置為fals
2.6.2include指令
<%@ incluede file=""%> 靜態引入其他頁面的內容
*靜態引入:在源文件級別進行合並,多個jsp生成一個servlet,最終由這一個servlet生成響應。推薦使用。
*動態引入:在運行時將多個輸出進行合並,多個jsp分別生成多個servlet,最終由這多個servlet生成響應,組成一個輸出流,提供響應。執行效率沒有靜態引入高。
2.6.3taglib指令
<%@ taglib uri="" prefix=""%>用來引入標簽庫。
uri指定被引入.tld文件的名稱空間
prefix 對該名稱空間的一個縮寫
2.7九大隱式對象
config
application
request
response
session
out
page
pageContext
Exception
2.7.1out對象
可以將他理解成response.getWriter()獲得的PrintWriter.
它自帶一個緩沖區,其大小收page指令中的buffer的設定限制。當緩沖區滿或緩沖區被關閉或當前jsp頁面結束,則此緩沖區中的內容將被刷新到response.getWriter()的緩沖區中。
2.7.2PageContext對象
(1)獲取其它八大隱式對象,可以認為是一個入口對象。
(2)獲取其所有域中的數據
pageContext操作所有域中屬性的方法
public java.lang.Object?getAttribute(java.lang.String?name,int?scope)
public void setAttribute(java.lang.String?name, java.lang.Object?value,int?scope)
public void?removeAttribute(java.lang.String?name,int?scope)
pageContext中代表域的常量
PageContext.APPLICATION_SCOPE
PageContext.SESSION_SCOPE
PageContext.REQUEST_SCOPE
PageContext.PAGE_SCOPE
findAttribute方法,在四大域中搜尋屬性,搜尋的順序是page域、request域、session域、application域,從小域到大域開始搜索,如果搜索到就直接獲取該值,如果所有域中都找不到,返回一個null(與el表達式不同,此處返回null,對網頁是不友好的)
(3)作為域對象使用
作用的范圍:真個jsp頁面,是四大作用域中最小的一個。
生命周期:當對jsp的請求開始時生成,當響應結束時銷毀。
(4)跳轉到其他資源
其身上提供了forward和include方法,簡化重定向和轉發的操作
========================================================================================================
二、標簽:JSP既可以用來生成HTML頁面,也可以直接書寫java源碼處理邏輯,這就導致了很多開發者在JSP出現初期,只用JSP做開發,這個JSP頁面十分龐大、充滿了java源碼和HTML標簽、許多百分號,邏輯結構混亂,不宜調試程序和頁面美化。於是人們希望將java源碼從JSP頁面中盡量抽離,但是把所有java源碼都抽走是不現實的,最基本的獲取屬性、簡單的頁面邏輯還是需要的,於是,sun公司就提供了JSP中的標簽開發技術,以一個標簽代表一種功能的java代碼,是整個jsp看起來更像一個HTML,並且不丟失JSP進行邏輯處理的功能。
1.JSP標簽:由sun公司提供,屬於jsp規范中的內容,不需要引入第三方標簽庫
property="propertyName" value="{string | <%= expression %>}" |
property="propertyName" [ param="parameterName" ] |
property= "*"
}/> 用於為bean的屬性負值name指定bean的名字,property指定要設定的屬性的名字,value指定設定的屬性的值,param用來指定使用哪個請求參數設定該屬性,property可以設置為*,用來將所有的請求參數自動設置懂啊bean對應的屬性上
2.el表達式:替代<%= %>腳本表達式,在j2ee1.4以前默認是不支持el,如果需要需要指定page指令[isELIgnored="true | false" ]為false,j2ee4.0後默認支持el
2.1獲得域中的屬性
${propName}在四個域中搜尋proName屬性,輸出該值到輸出流中
${pageScope/requestScope/sessionScope/applicationScope.proName}獲取指定域中的屬性
${attr[0]}獲取域中的集合的指定元素
${list[0]}獲取list中的指定位置元素
${map.keyName}獲取map中指定鍵的值
${bean.propName}獲取javaBean的屬性,可以認為是調用了javaBean的getXXX方法,
~最重要的一個應用場景:在寫路徑的時候最好不要把web應用名稱寫死,java中應該用request.getContextPath去獲取。jsp中就用el獲取:${pageContext.request.contextPth}
~.和[]區別使用點的地方都可以用中括號,如果屬性名是數字或包含特殊符號(.-)就必須使用中括號。例子:${map["first.name"]}
2.2進行簡單運算
(1)算數運算:所有參與元算的元素都會被轉成數字,如果不能轉就報錯,空元素參與運算當作沒參與。
(2)關系運算:
(3)邏輯運算:
(4)empty/not empty判斷一個對象或集合或數組是否為空或長度為0
(5)三元表達式 name == null ? "張三" : name;
2.3獲取web開發常用對象
pageContext:代表pageContext對象,注意和pageScope進行區分
pageScope:代表page域,可以用來獲取page域中的屬性
reqeustScope:代表reqeust域,可以用來獲取reqeust域中的屬性
sessionScope:代表session域,可以用來獲取session域中的屬性
applicationScope:代表application域,可以用來獲取application域中的屬性
param 代表請求參數組成的map集合${param.userName}
paramValues 代表請求參宿組成的map集合,但是此集合的value是String[],用來獲取一名多值的param
header 獲取請求頭組成的map
headerValues 獲取請求頭組成的map但是value是一個String[],用來獲取一名多值的head
cookie 獲取cookie組成的map對象,此map的值是一個cookie對象${cookie.cookieName.cookieValue}
initParam 以map封裝的web.xml中配置的整個web應用的初始化參數
2.4調用java方法
el表達式可以調用java中的靜態方法,分如下步驟完成:
(1)編寫一個類,其中應該包含要使用el調用的靜態方法
(2)編寫一個tld文件,描述該方法的調用,在創建tld文件時應選用2.0版本的jsp配置,指定名稱空間uri和縮寫prefix
(3)在tld文件中配置方法信息
java.lang.String EncodURL( java.lang.String )//對該方法的描述:返回值類型 方法名(參數類型)
(4)在jsp中使用<%@ taglib uri="" prefix="ppp"%>引入tld文件
(5)在jsp中使用${ppp:encodeURL("xxxx")}調用
2.5SUN提供的EL函數庫,基本上都是對字符串進行操作的函數,請參考張老師寫的《第8章 標准標簽庫_0519.doc》
==========================================
3.JSTL標簽庫,在javaee4.0需要導入JSTL相關的jar包,在javaee5.0開始,默認已經包含了此jar包。還要需要用<%@ taglib%>指令引入標簽庫
3.1介紹
JavaServer Pages Standard Tag Library
由JCP(Java Community Process)指定標准
提供給 Java Web 開發人員一個標准通用的標簽函數庫
和 EL 配合來取代傳統直接在頁面上嵌入 Java 程序(Scripting)的做法,以提高程序可讀性、維護性和方便性
一般我們使用JSTL1.1以上的版本,應為從這個版本開始支持EL表達式
JSTL1.0默認不支持el表達式,不建議使用
3.2JSTL標簽庫
****核心標簽庫 (core) --- c
國際化標簽 fmt
數據庫標簽 sql --Servlet
XML標簽 xml
JSTL函數(EL函數) el
3.3JSTL核心標簽庫
4.自定義標簽