1.JSP
1.1 JSP概述
jsp全稱java serverpages(java服務器頁面),本質是一個servlet,它是在傳統的網頁HTML文件(*.htm,*.html)中插入Java程序段(Scriptlet)和JSP標記(tag),從而形成JSP文件,後綴名爲(*.jsp)。
1.2 JSP原理
1.3 JSP腳本
JSP有三個基本的腳本元素,作用是使JAVA代碼可以直接插入到HTML代碼中
(1)聲明標籤
格式:<%! inta = 1; %>
作用:聲明的變量在類的成員位置上
(2)腳本片斷
格式:<% inta = 1; out.println(a); %>
作用:內容會生成在_jspService()方法中
(3)腳本表達式
格式:<%="hello " + a %>
作用:它就相當於是out.println()將內容直接輸出到頁面中,注意表達式不能以分號結尾
1.4 JSP註釋
在jsp頁面中可以使用三種註釋
(1)可以使用html中註釋
<!-- html的註釋 -->
(2)可以對jsp腳本內容使用java註釋
//單行註釋 /* 多行註釋 */ /**文檔註釋*/
(3)可以使用jsp註釋(會被編譯系統忽略)
<%-- jsp註釋 --%>
2. JSP指令
2.1 JSP指令概述
JSP的編譯指令是通知JSP引擎的消息,它不直接生成輸出,用於指示JSP執行某些步驟和指示JSP表現特定行爲。
2.2 JSP指令格式
語法:<%@ 指令的名稱 屬性名=”屬性值” 屬性名=”屬性值”%>
2.3 JSP指令分類
JSP中有三大指令,分別是以下三個:
Page:設置JSP的屬性
Include:包含頁面(頁面佈局
Taglib:引入標籤庫文件
2.4. page指令
language :JSP的語言的屬性.現在只能是java.
contentType :設置瀏覽器默認的打開的時候的編碼.
pageEncoding :設置JSP文件保存到硬盤,以及翻譯成Servlet保存到硬盤的編碼格式.
import :設置JSP中引入其他的類.import屬性可以出現多次的.
extends :設置JSP被翻譯成Servlet後繼承的類:默認值:org.apache.jasper.runtime.HttpJspBase.修改這個值得話一定要使這個類是一個Servlet纔可以.
autoFlush :設置自動刷出緩存
buffer :JSP的緩衝區的大小。默認8kb
session :默認值是true.設置JSP的頁面中是否可以直接使用session對象.
isELIgnored :設置JSP是否忽略EL表達式.默認值false 不忽略.可以在JSP中寫EL表達式.
isErrorPage :設置JSP頁面中出現錯誤信息應該如何處理的.
errorPage :設置JSP頁面中出現錯誤信息應該如何處理的.
設置全局錯誤頁面:
<error-page>
<error-code>404</error-code>
<location>/404.jsp</location>
</error-page>
<error-page>
<error-code>500</error-code>
<location>/500.jsp</location>
</error-page>
2.5. include指令
include指令表示靜態包含!即目的是把多個JSP合併成一個JSP文件!
include指令只有一個屬性:file,指定要包含的頁面,例如:<%@includefile=”b.jsp”%>。
靜態包含:當a.jsp頁面包含了b.jsp頁面後,在編譯ajsp頁面時,需要把a.jsp和b.jsp頁面合併成一個文件,然後再編譯成Servlet(Java文件)。
2.6 taglib指令
在JSP頁面中使用第三方的標籤庫時,需要使用taglib指令來“導包”。例如:<%@ taglibprefix="c" uri="http://java.sun.com/jsp/jstl/core" %>,其中uri是由第三方標籤庫定義的,prefix表示標籤的前綴,這個名稱可以隨便起。
3. JSP內置對象
request HttpServletRequest getParameter(),setAttribute(),getAttribute();
response HttpServletResponse setStatus(),sendRedirect(),getOutputStream();
session HttpSession setAttribute(),getAttribute(),removeAttribute();
application ServletContext setAttribute(),getAttribute(),removeAttribute();
page Object toString(),wait(),
pageContext PageContext setAttribute(),getAttribute(),removeAttribute();
out JspWriter write(),print(),
config ServletConfig getInitParamter(),getInitParameterNames(),
exception Throwable getMessage(),getCause()
* out對象:先將自身緩存區中的內容輸出到response的緩衝區中,由response向頁面作出響應.
out :JspWriter
response.getWriter() :PrintWriter
* pageContext:
一類:用pageContext對象獲得其他的8個內置對象. 用來編寫一個通用性高的或者框架的時候.
二類:用來存取數據.向四個域中存取數據.
3.1九個內置對象及其相應類型
內置對象 | 類型 |
request | HttpServletRequest |
response | HttpServletResponse |
session | HttpSession |
application | ServletContext |
config | ServletConfig |
page | this(Servlet) |
pageContext | PageContext |
exception | Throwable |
out | JspWriter |
3.2獲取其他內置對象
通過pageContext對象可以獲取jsp中其他的內置對象.PageContext類中定義瞭如下八個方法:getPage()、getRequest()、getResponse()、getServletConfig()、getServletContext()、getException()、getSession()等方法,其中getOut()放是在其父類中定義的,有了這些方法,pageContext對象自然能夠獲取其他八個內置對象了。
3.3 JSP中的域對象
pageContext pageScope 頁面範圍
request requestScope 請求範圍
session sessionScope 會話範圍
application applicationScope 應用範圍
pageContext是一個域對象,常用方法:
void setAttribute(Stringname,Object value)
Object getAttribute(Stringname);
Void removeAttribute(Stringname);
操作其他域中的對象的方法:
Object getAttribute(Stringname, int scope):
該方法的第一個參數是域屬性的名稱,第二個參數指定是從那個域中取出域屬性;
在PageContext中已經定義瞭如下幾個靜態常量作爲scope的可選值:
int APPLICATION_SCOPE:表示從application域中獲取數據;
int PAGE_SCOPE:表示從pageContext域中獲取數據;
int REQUEST_SCOPE:表示從request域中獲取數據;
int SESSION_SCOPE:表示從session域中獲取數據。
void setAttribute(String name,Objectvalue,int scope):
該方法的第一個參數指的是域屬性的名稱,第二參數指的是域屬性的值,第三個參數指定域屬性保存的域,scope的取值同上;
void removeAttribute(Stringname,int scope):
該方法的第一個參數指的是域屬性的名稱,第二個參數指的是將指定域屬性從哪個域中移出,scope的取值同上;
4. jsp動作標籤
4.1 jsp動作標籤概述
JSP標籤也稱之爲Jsp Action(JSP動作)元素,它用於在Jsp頁面中提供業務邏輯功能,避免在JSP頁面中直接編寫java代碼,造成jsp頁面難以維護。
4.2 常用的jsp標籤
jsp:forward
<jsp:forward>標籤是用來做請求轉發,它與RequestDispatcher接口的forward()方法一樣,唯一不同的是它是在jsp頁面中使用。
jsp:include
<jsp:include>標籤的作用使用來包含其他jsp頁面,之前學習的include指令屬於靜態包含,而include動作標籤是動態包含,它和RequestDispatcher接口的include()方法一樣,是運行級別的包含
jsp:param
<jsp:param>標籤作爲<jsp:forward>標籤和<jsp:include>標籤的子標籤,用來給轉發或包含的頁面傳遞數據。
靜態包含與動態包含的區別
include標籤與inclue指令區別:
(1)include指令是靜態包含,包含文件中包含了被包含文件的內容.
include標籤是動態包含,它包含的是被包含文件執行後的結果.
(2)include指令不能帶參數
include標籤是可以帶參數的
5. EL表達式
5.1 EL表達式概述
EL是Expression Language的縮寫,它是jsp內置的表達式語言,從jsp2.0開始,就不讓再使用java腳本,而是使用el表達式或動態標籤來代替java腳本。
EL表達式的格式:${表達式}
EL表達式代替的是java腳本中的<%= …%>,也就是說EL表達式也是向瀏覽器端輸出數據。例如${1+2}會向瀏覽器端輸出3。
5.2 EL表達式的作用
爲了使JSP寫起來更加簡單,更加安全,可以通過EL表達式來替換jsp頁面上的腳本
EL主要作用:
(1)獲取數據:
EL表達式主要用於替換JSP頁面中的腳本表達式,以從各種類型的web域中檢索java對象、獲取數據。(某個web域中的對象,訪問javabean的屬性、訪問list集合、訪問map集合、訪問數組)
(2)執行運算:
利用EL表達式可以在JSP頁面中執行一些基本的關係運算、邏輯運算和算術運算,以在JSP頁面中完成一些簡單的邏輯運算。${user==null}
(3)獲取web開發常用對象
EL 表達式定義了一些隱式對象,利用這些隱式對象,web開發人員可以很輕鬆獲得對web常用對象的引用,從而獲得這些對象中的數據。
(4)調用Java方法
EL表達式允許用戶開發自定義EL函數,以在JSP頁面中通過EL表達式調用Java類的方法。
5.3 EL表達式之域查找
1.pageContext--------------------${pageScope.xxx}
2.request--------------------------${requestScope.xxx}
3.session--------------------------${sessionScope.xxx}
4.application---------------------${applicationScope.xxx}
通過el獲取時,如果沒有查找到,會返回"".除了上面的獲取方式外還有一種,例如
${requestScope[“xxx”]}
關於.與[]區別
[]與.在使用方式上是一樣的.但是如果名稱中包含了"."等特殊字符,就必須使用[]來獲取. 例如
request.setAttribute("login.message","登錄失敗");
${requestScope.login.message}<br>錯誤的
${requestScope["login.message"]}正確的
如果沒有寫範圍,會默認從page,request,session.application依次查找
5.4 EL表達式獲取複雜數據
獲取數組中數據
例如:${數組名稱[索引] }
獲取List中數據
例如:${集合名稱[索引]}
獲取Map中數據
例如:${集合名稱.key名稱}
5.5 EL表達式運算
運算符 | 說明 | 範例 | 結果 |
+ | 加 | ${17+5} | 22 |
- | 減 | ${17-5} | 12 |
* | 乘 | ${17*5} | 85 |
/或div | 除 | ${17/5}或${17 div 5} | 3 |
%或mod | 取餘 | ${17%5}或${17 mod 5} | 2 |
==或eq | 等於 | ${5==5}或${5 eq 5} | true |
!=或ne | 不等於 | ${5!=5}或${5 ne 5} | false |
<或lt | 小於 | ${3<5}或${3 lt 5} | true |
>或gt | 大於 | ${3>5}或${3 gt 5} | false |
<=或le | 小於等於 | ${3<=5}或${3 le 5} | true |
>=或ge | 大於等於 | ${3>=5}或${3 ge 5} | false |
&&或and | 並且 | ${true&&false}或${true and false} | false |
!或not | 非 | ${!true}或${not true} | false |
||或or | 或者 | ${true||false}或${true or false} | true |
empty | 是否爲空 | ${empty “”},可以判斷字符串、數據、集合的長度是否爲0,爲0返回true。empty還可以與not或!一起使用。${not empty “”} | true |
6. EL表達式內置對象
EL隱式對象引用名稱 | 類型 | JSP內置對象名稱 | 說明 |
pageContext | javax.servlet.jsp.PageContext | pageContext | 一樣的 |
pageScope | java.util.Map<String,Object> | 沒有對應的 | pageContext範圍中存放的數據,頁面範圍 |
requestScope | java.util.Map<String,Object> | 沒有對應的 | 請求範圍數據 |
sessionScope | java.util.Map<String,Object> | 沒有對應的 | 會話範圍數據 |
applicationScope | java.util.Map<String,Object> | 沒有對應的 | 應用範圍數據 |
param | java.util.Map<String,String> | 沒有對應的 | 一個請求參數 |
paramValues | java.util.Map<String,String[]> | 沒有對應的 | 重名請求參數 |
header | java.util.Map<String,String> | 沒有對應的 | 一個請求消息頭 |
headerValues | java.util.Map<String,String[]> | 沒有對應的 | 重名請求消息頭 |
initParam | java.util.Map<String,String> | 沒有對應的 | web.xml中全局參數 |
cookie | java.util.Map<String,Cookie> | 沒有對應的 | key:cookie對象的name值 |
6.1pageContext內置對象
EL表達式的11個內置對象中,有10個內置對象的類型是Map類型,只有pageContext的類型是PageContext。它的使用類似於jsp的內置對象pageContext,. 通過pageContext對象可以獲取其他內置對象的任意的屬性值。
常用操作:${pageContext.request.contextPath}
6.2請求參數相關內置對象
請求參數相關的內置對象是:
param:該內置對象的類型是Map<String,String>,可以用來獲取值爲單值的請求參數,其中key指的是請求參數的名稱,value指的是請求參數的值,使用param獲取請求參數與request.getParameter()方法一樣。
paramValues:該內置對象的類型是Map<String,String[]>,可以用來獲取值爲多值的請求參數,其中key是參數名,value是多個參數值組成的字符串數組。
注意,在使用EL獲取參數時,如果參數不存在,返回的是空字符串,而不是null。這一點與使用request.getParameter()方法是不同的。
6.3請求頭相關內置對象
與請求頭相關的內置對象是:
header:該內置對象的類型是Map<String,String>,用來獲取值爲單值的請求頭信息,其中key代表的是請求頭名稱,value代表的是請求頭的值;
headerValues:該內置對象的類型是Map<String,String[]>,用來獲取值爲多值的請求頭信息,key代表的是請求頭名稱,value代表的是請求頭的多個值。
6.4全局初始化參數的內置對象
EL表達式中內置了一個與初始化參數相關的對象:
initParam:該內置對象的類型是Map<String,String>,用來獲取web.xml文件中<context-param>標籤的參數值,其中key代表的是參數名,value代表的是參數值。
6.5 cookie相關內置對象
EL表達式也內置一個名爲cookie的對象,該內置對象與cookie相關,如下:
cookie:該內置對象的類型爲Map<String,Cookie>,其中key是Cookie的名字,value是Cookie對象本身。