一、jsp的三大指令
1>jsp中有三大指令:page、include、taglib
2>jsp指令的格式:
<%@指令名稱 屬性=“值” 屬性=“值”.......%>--------->特殊的標籤
jsp的指令可以放在jsp頁面的任何位置,但是一般都會把jsp指令放到jsp文件的最上方
3>jsp的任何指令在一個jsp文件中都是可以重複出現的:如
<%@ page language = "java"%>
<%@ page import = "java.util.*"%>
<%@ page pageEncoding = "UTF-8"%>
而用一個page指令也是可以搞定的:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
1.page指令
page指令沒有必須屬性,都是可選屬性。即使沒有出席那任何屬性也是可以的,如:
<%@ page %>
1>page指令的pageEncoding和contentType屬性:
1)pageEncoding屬性:它用於指定當前jsp頁面的編碼格式,
只要當前指定的編碼格式和右鍵點擊當前jsp文件Properties屬性看到的當前jsp文件的
編碼文件的編碼格式一致就不會出現亂碼問題(但只要一個文件編輯的編碼格式)和
打開的編碼格式一致就不會出現亂碼)
而服務器需要以pageEncoding的編碼格式將jsp編譯成.java的否則不能正確編譯。
2)contentType屬性:與response.setContentType()方法的作用相同
一是設置響應內容的編碼格式
二是設置content-type響應頭,告訴瀏覽器服務器響應協議的編碼格式。
如,<%@ page contentType = "text/html;charset=utf-8"%>
在jsp頁面對應的Servlet中就是以response.setContentType("text/html;charset=utf-8");
存在的。
注意:無論是page指令的pageEncoding屬性contentType屬性,默認值都是ISO8859-1
是不支持中文的,所以jsp頁面存在中文的話一定要設置這兩個屬性。
1)以上兩個屬性如果只提供了一個,那麼另一個屬性的值就默認爲設置的那一個屬性的值。
2)所以jsp爲了支持中文,以上兩個屬性至少要設置一個。
2>page指令的import屬性:
import屬性的本質就是jsp頁面對應的Servlet中的import關鍵字導包。
import屬性是唯一可以重複出現的屬性,如:
<%@ page import = "java.util.*" import = "java.io.*"%>,還可以使用“,”分隔
<%@ page import="java.util.*,java.io.*"%>,但是一般會使用多個page指
令來導入多個包:
<%@ page import="java.util.*"%>
<%@ page import="java.io.*"%>
3>page指令的errorPage屬性和isErrorPage屬性:
1)errorPage屬性:我們知道,當請求的jsp頁面出錯拋出異常後,服務器會給瀏覽器響應錯誤信息
那麼就可以使用page指令的errorPage屬性來自定義錯誤頁面。如:
<%@ page errorPage ="xxx.jsp"%>,那麼當前jsp頁面出錯時,就會請求轉發到xxx.jsp,並且響應
200狀態碼,表示請求成功。
2)isErrorPage屬性:如果希望給客戶端響應的狀態碼爲500,那麼就還需要使用isErrorPage屬性指定
通過errorPage屬性請求轉發的jsp頁面爲錯誤頁面。當isErrorPage屬性的值爲True時,說明當前jsp
頁面爲錯誤頁面,即專門處理錯誤的頁面,那麼在這個jsp頁面中就可以使用內置對象exception了,
其它的頁面時不能使用exception內置對象的。
3)web.xml中也可以配置錯誤頁面
使用jsp的page指令的errorPage屬性和isErrorPage屬性可以配置錯誤頁面,還可以在web.xml
中配置錯誤頁面。
<!--
服務器給客戶端響應404狀態碼,即客戶端訪問的資源不存在時,請求轉發到error404.jsp頁面
-->
<error-page>
<error-code>404</error-code>
<location>/error/error404.jsp</location>
</error-page>
<!--
服務器給客戶端瀏覽器響應500狀態碼,即客戶端請求服務器的資源出錯拋出
異常時,請求轉發到error500.jsp頁面
-->
<error-page>
<error-code>500</error-code>
<location>/error/error500.jsp</location>
</error-page>
<!--
上面的配置表示,當服務器響應500狀態碼,即客戶端請求服務器的資源出錯
拋出異常時,請求轉發到指定頁面,而500狀態碼錶示的是服務器資源拋出任何
異常.如果需要指定對具體的異常進行處理的話就使用以下配置,表示當請求的
服務器資源拋出空指針異常時,就請求轉發到nullPoint.jsp
-->
<error-page>
<exception-type>java.lang.NullPointerException</exception-type>
<location>/error/nullPoint.jsp</location>
</error-page>
4>page指令的autoFlush屬性和buffer屬性
1)buffer屬性:表示當前jsp的輸出流(out內置對象)的緩衝區大小,默認爲8KB.
(一般不需要修改)
2)autoFlush屬性:指定當前jsp的輸出流(out內置對象)緩衝區滿時,是否自動刷新。
默認爲true,自動刷新,表示當緩衝區滿時自動把緩衝區數據輸出到客戶端。
如果改爲false時,那麼在緩衝區滿時拋出異常。(一般也不需要修改)
5>page指令的isELlgnored屬性:
表示當前jsp是否忽略EL表達式,默認值爲false,表示不忽略,即支持。
(一般不需要修改)
6>page指令一些基本沒用的屬性:
1)language屬性:指定當前jsp編譯後的語言類型,默認值爲java。(目前只支持java)
2)info屬性:當前jsp的說明信息
3)isThreadSafe屬性:當前jsp是否支持併發訪問,默認值爲false,支持。當改爲true時,
jsp生成的servlet會去實現一個過時的標記接口SingleThreadModel,這時jsp就只能單線程訪問。
(一般不需要修改)
4)session屬性:當前jsp頁面是否支持session,默認爲true,表示當前jsp可使用內置對象
session;如果改爲false,表示當前jsp不能使用內置對象session(一般不需要修改)
5)extends屬性:讓當前jsp生成的servlet去繼承該屬性指定的類。(一般不需要修改)
2、include指令:
include指令表示靜態包含,其目的是把多個jsp合併成一個jsp;
include指令只有一個屬性file,指定所包含的頁面,如:<%@ include file = x.jsp"%>
include指令靜態包含reuqest.getRequestDispacher().include()的請求包含的功能相似,但是
1>request.getRequestDispatcher().include()是請求包含,包含和被包含的是兩個servlet,即
兩個.class,只是把兩個servlet的響應內容在運行時合併了,再統一
響應給客戶端。
2>include指令是在jsp編譯成java文件時完成的。它是把兩個jsp合併成一個jsp然後編譯成一個java
文件(也就是一個servlet),最終生成一個class文件
在jsp頁面被編譯成java文件之前,還是jsp的時候就合併了。
注意:include指令靜態包含,包含頁面和被包含頁面不能出現相同內容部分,
因爲兩個jsp頁面會被合併成一個jsp,進而再被編譯成一個servlet,
不可能出現重複定義內容。
應用:把頁面分解了,使用include指令組合在一起。頁面中不變的且重複使用的部分就是一個獨立的jsp
而我們只需要處理變化的頁面部分。
3、taglib指令:
在jsp頁面中使用第三方標籤庫時,需要使用taglib指令來導入標籤庫。兩個屬性:
1>prefix:指定標籤庫在當前jsp頁面使用的前綴。
自定義命名,類似於xml的名稱空間。
2>uri:指定標籤庫的位置。一般是由第三方標籤庫定義好的。
3>指定標籤庫的標籤的使用:<前綴:標籤名>
如:<%@ taglib prefix = "c" uri = "http://java.sun.com/jsp/jstl/core" %>
使用該標籤庫的text標籤時,是<c:text>
二、jsp的九大內置對象:
每個jsp頁面服務器都會將其編譯成對應的一個.java(即一個servlet)文件,
而jsp頁面的內容的“真身”在對應的servlet的jspService()方法中,
而在jspService()方法的開頭部分已經創建了九大內置對象,
所以在jsp頁面可以直接使用這九大內置對象。
1、out:是JspWriter的對象,等同於servlet的PrintWriter out = response.getWriter();
獲取的PrintWriter的對象,作用就是向客戶端響應輸出文本數據。
2、config:他就是ServletConfig的對象。在servlet中ServletConfig對象就代表當前
<servlet>
<servlet-name></servlet-name>
<servlet-class></servlet-class>
</servlet>
的內容
而jsp我們不需要在web.xml中配置,所以config內置對象在jsp中幾乎沒用。
3、page:當前jsp對象(this),但其在jsp編譯的servlet中是以
Object page = this;
存在的,屬於多態思想,所以子類對象this的很多屬性和功能父類引用page都無法使用。
而在jsp的<%%>java腳本中能直接用this去操作當前jsp對象絕不用page,
所以page內置對象在jsp中也幾乎不用。
4、exception:異常對象,只有在錯誤頁面中纔可以使用該對象。
5、request:HttpServletRequest的對象,請求對象。
6、response:HttpServletResponse的對象,響應對象。
7、application:ServletContext的對象,服務器會爲每個web應用程序創建唯一的
一個ServletContext對象,其作用就是在整個web應用的動態資源之間共享數據,即多個servlet
和jsp之間就都可以通過獲取這個唯一的ServletContext對象來傳遞數據。
8、session:HttpSession的對象,服務器會爲每個會話創建一個session對象,多個動態資源
即多個servlet和jsp就可以使用session對象在同一會話中共享數據。
9、pageContext對象:域對象
在javaWeb中一共有四大域對象,其中servlet中可以使用request、session、ServletContext
三個對象,在jsp中可以使用pageContext、request、session、application(ServletContext)
四大域對象:
1>application(ServletContext):在整個web應用中共享數據
2>session:在一個會話中共享數據
3>request:在一個請求鏈中共享數據
4>pageContext:在一個jsp頁面中共享數據。這個域是指在當前jsp頁面和當前jsp頁面中使用
的標籤之間共享數據。
1>pageContext域對象功能:
pageContext域對象是四個域對象中範圍最小的,在當前jsp頁面和當前jsp頁面中使用的標籤之間
共享數據:
1>void | setAttribute(String name,Object value)
2>Object | getAttribute(String name)
3>void | removeAttribute(String name)
2>pageContext獲取其它內置對象:
拿到了pageContext內置對象就等同於拿到了所有的內置對象,因爲pageContext對象
可以獲取其它8個內置對象:
1>JspWriter | getOut()獲取out內置對象
2>ServletConfig | getServletConfig()獲取config內置對象
3>Object | getPage()獲取page內置對象
4>ServletRequest | getRequest()獲取request內置對象
5>ServletResponse | getResponse()獲取response內置對象
6>HttpSession | getSession()獲取session內置對象
7>Throwable | getException()獲取exception內置對象
8>ServletContext | getServletContext()獲取application內置對象
3>pageContext代理其他域對象
因爲pageContext對象可以拿到其它8個內置對象,所以可以使用pageContext域對象
來代理其它3個域對象,也就是說可以使用pageContext對象向request、session、
application域對象中存儲數據和獲取數據。
1>void | setAttribute(String name,Object value,int scope)向指定的域對象中添加數據
2>Object | getAttribute(String name,int scope)從指定的域對象中獲取數據
3>void | removeAttribute(String name,int scope)移除指定域對象中的數據
如:
1>pageContext.setAttribute("uname","mmy");默認向pageContext域中存儲數據
2>pageContext.setAttribute("uname","mmy",PageContext.REQUEST_SCOPE)向
request域對象中存儲數據
3>pageContext.setAttribute("uname","mmy",PageContext.SESSION_SCOPE)向
session域對象中存儲數據
4>pageContext.setAttribute("uname","mmy",PageContext.APPLICATION_SCOPE)向
application域對象中存儲數據
4>全域查找
pageContext全域查找:Object | findAttribute(String name)
1>會從小到大,依次在pageContext,request,session,
application域對象中查找名爲name的數據的值,如果找到則返回結果,沒有則返回null。
2>如果在在多個域對象中存在同名的屬性,那麼依據優先級別,範圍最小的域對象的優先
級別最高。所以存儲同名的屬性時,爲了進行區別都加上前綴,如:
pageContext.setAttribute("uname","mmy");
pageContext.setAttribute("request_uname","mmy",PageContext.REQUEST_SCOPE)
pageContext.setAttribute("session_uname","mmy",PageContext.SESSION_SCOPE) pageContext.setAttribute("application_uname","mmy",PageContext.APPLICATION_SCOPE)
三、jsp的動作標籤:
1>jsp的動作標籤的作用是用來簡化java腳本的,因爲其內部封裝的就是java腳本。
2>jsp的動作標籤和html的標籤的區別:
A>html的標籤是由瀏覽器來解析執行的。
B>jsp的動作標籤它封裝的就是java代碼,和java代碼一樣都是由服務器解析執行的。
3>jsp動作標籤的格式:<jsp:標籤名>
4>jsp的動作標籤是javaWeb內置已經定義好的動作標籤,供於我們直接使用。
1><jsp:forward>動作標籤:
<jsp:forward>動作標籤的作用就是請求轉發,和
servlet的request.getRequestDispatcher("").forward(request, response);
的作用是一樣的。
2><jsp:include>動作標籤:
<jsp:include>動作標籤的作用就是請求包含,和
servlet的request.getRequestDispatcher("").include(request,response);
的作用是一樣的。
<jsp:include>動作標籤和<%@include%>指令的區別:
1><%@include%>能夠是靜態包含,是指在兩個jsp頁面在被編譯成servlet之前,
合併成一個jsp頁面,然後在被編譯成一個servlet。
2><jsp:include>動作標籤,也叫動態包含,它於servlet的request.getRequestDispatcher("").include
(request,response);
一樣都是請求包含的作用。即表示當前jsp和被包含的jsp頁面都被編譯成各自對應的servlet後,在運
行時當前jsp頁面時請求包含到被包含的jsp頁面,合併兩個jsp頁面的響應體,共同向瀏覽器完成
完整的一個響應。
3><jsp:param>動作標籤:
還可以在<jsp:forward>和<jsp:include>動作標籤之間使用<jsp:param>動作標籤,向被請求轉發和
請求包含的jsp頁面傳遞參數。
<jsp:forword page="b.jsp">
<jsp:param name="uname" value="aaa"/>
</jsp:forword>
等價於:
request.getRequestDispatcher("/b.jsp?uname=aaa").forword(request,response);
4<jsp:useBean>如果javaBean對象存在,則從指定域對象中獲取javaBean對象;
如果不存在,在當前jsp頁面創建javaBean對象,並保存到指定域對象中。
默認域對象時pageContext,
可以使用scope屬性來指定保存到的域對象,或指定獲取javaBean的域對象
5><jsp:setProperty>和<jsp:getProperty>
<jsp:setProperty>標籤的作用是給指定的javaBean對象的javaBean屬性賦值,
<jsp:getProperty>標籤時獲取指定javaBean對象的javaBean屬性的值: