程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> JSP編程 >> 關於JSP >> Jsp開發基礎知識+九大隱式對象+11個內置對象+標簽庫(實際web開發中的典型)

Jsp開發基礎知識+九大隱式對象+11個內置對象+標簽庫(實際web開發中的典型)

編輯:關於JSP

一、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規范中的內容,不需要引入第三方標簽庫
用來替代request.getRequestDispatcher().include()
用來替代request.getRequestDispatcher().forward()
配合前兩個標簽使用,可以在包含或轉發時,帶一些參數過去

在指定域中搜尋名字為id設置值的bean,如果沒有就在該域中創建一個
{
property="propertyName" value="{string | <%= expression %>}" |
property="propertyName" [ param="parameterName" ] |
property= "*"
}/> 用於為bean的屬性負值name指定bean的名字,property指定要設定的屬性的名字,value指定設定的屬性的值,param用來指定使用哪個請求參數設定該屬性,property可以設置為*,用來將所有的請求參數自動設置懂啊bean對應的屬性上

用於獲取屬性的值輸出到輸出流中,其中name指定bean的名字,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文件中配置方法信息

encodeURLel在調用時所使用的方法名
cn.itheima.util.EncodeURL靜態方法所在的類全路徑名

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核心標簽庫
標簽用於輸出一段文本內容到pageContext對象當前保存的“out”對象中。
標簽用於把某一個對象存在指定的域范圍內,或者設置Web域中的java.util.Map類型的屬性對象或JavaBean類型的屬性對象的屬性。
標簽用於刪除各種Web域中的屬性
標簽用於捕獲嵌套在標簽體中的內容拋出的異常,其語法格式如下:nested actions
標簽可以構造簡單的“if-then”結構的條件表達式
標簽用於指定多個條件選擇的組合邊界,它必須與標簽一起使用。使用三個標簽,可以構造類似 “if-else if-else” 的復雜條件判斷結構。
標簽用於對一個集合對象中的元素進行循環迭代操作,或者按指定的次數重復迭代執行標簽體中的內容。
用來浏覽一字符串中所有的成員,其成員是由定義符號所分隔的
標簽 在JSP頁面進行URL的相關操作時,經常要在URL地址後面附加一些參數。標簽可以嵌套在標簽內,為這些標簽所使用的URL地址附加參數。
標簽,實現include操作
標簽用於在JSP頁面中構造一個URL地址,其主要目的是實現URL重寫。URL重寫就是將會話標識號以參數形式附加在URL地址後面
標簽用於實現請求重定向


4.自定義標簽

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved