jsp頁面元素和內建物件
一、jsp頁面元素的構成
1.jsp指令
三大指令元素為 page include taglib 可沒有import哦,import是page的屬性
①page指令
通常位於jsp頁面頂端,同一個頁面可以有多個page指令
語法:
<%@ page 屬性1="屬性值" 屬性2="屬性值1,屬性值2" … 屬性n="屬性值" %>
常用屬性值:
屬性 | 描述 | 預設 |
---|---|---|
language | 指定jsp頁面使用的指令碼語言 | java |
import | 引用指令碼語言中用到的類檔案 | / |
contentType | 指定jsp頁面所採用的編碼方式 | text/html,ISO-8859-1 (不支援中文) |
例:
<%@ page language="java" import="java.util.*" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
②include指令
將外部檔案(如jsp、html等)嵌入到當前的jsp檔案中,同時解析這個頁面中的jsp語句
例:
<%@ include file="copyright.html"%>
file是include指令唯一的屬性 前面不加/表示當前目錄下(絕對路徑),加了/時表示應用程式文件根目錄
③taglib指令
使用標籤庫定義新的自定義標籤,在jsp頁面中啟用定製行為
在之前的文章中曾經講過:jsp標籤技術——自定義標籤開發
2.jsp註釋
註釋一般有如下幾種方法:
1.<!-- html註釋 -->
客戶端通過檢視原始碼可見
2.<%-- jsp註釋 --%>
客戶端不可見
3.<%//java註釋(jsp指令碼註釋)%>
客戶端也不可見
3.jsp指令碼——在jsp頁面中執行的java程式碼
語法:
<%
java程式碼
%>
不能在小指令碼中宣告方法,因為java語言中不能在方法中定義方法。(方法的宣告放到jsp聲明裡)
4.jsp宣告——定義變數或方法
語法:<%! java程式碼 %>
,注意宣告語句要以分號結束。
注:宣告的變數只在頁面第一次載入時初始化一次,而小指令碼在每次訪問頁面時都會被執行
例:輸出頁面被訪問次數的程式碼:
<%@ page contentType="text/html; charset=utf-8" %>
<%! int count = 0; %>
<html><body>
<%
count++;
%>
該頁面已被訪問<%= count %>次。
</body></html>
5.jsp表示式
語法:<%= 表示式%>
注:表示式不以分號結束,且百分號和等號之間不能有空格
例:
<%! String s="張三"; %>
你好,<%=s %><br/>
二、jsp內建物件
內建物件是web容器建立的,不需要new就可以直接使用。
例如下文的out就是內建物件之一:
<%
int[] value = {60,70,80};
for(int i:value)
{
out.println(i);
}
%>
jsp內建物件:out、request、response、session、application、page、pageContext、exception、config
web程式的請求與響應模式:客戶端向伺服器提交請求,伺服器響應。
out物件
out物件常用方法:
方法 | 說明 |
---|---|
void println() | 向客戶端列印字串 |
void clear() | 清除緩衝區內容,如果在flush後呼叫會丟擲異常 |
void clearBuffer() | 清除緩衝區內容,在flush後呼叫不會產生異常 |
void flush() | 將緩衝區的內容輸出到客戶端 |
int getBufferSize() | 返回緩衝區的大小(位元組數計),不設緩衝區則為0 |
int getRemaining() | 返回緩衝區剩餘可用容量 |
boolean isAutoFlush() | 返回緩衝區滿時,是自動清空還是丟擲異常 |
void close() | 關閉輸出流 |
關於flush:
out.println("1");
out.println("2");
和
out.println("1");
out.flush();
out.println("2");
上面兩段程式碼的顯示結果並沒有什麼差別,只是後一種其實是1先輸出的(輸出後緩衝區裡只剩了2),而前面那種是兩者在緩衝區然後一起輸出的(輸出後1和2都還在緩衝區裡),所以再分別寫getRemaining的話後者的值比前者的大。
<br/>
而以下這段程式碼:
<%
out.println("床前明月光");
out.flush();
out.clear();
out.println("疑是地上霜");
%>
瀏覽器中輸出床前明月光 後臺跳異常(clear用在flush之後了)
以下程式碼:
<%for(int i = 0;i < 3;i++){ %>
out.print(i*2);
<%} %>
//輸出out.print(i*2);out.print(i*2);out.print(i*2);
//而以下程式碼:
<%for(int i = 0;i < 3;i++){ %>
out.print(<%=i %>*2);
<%} %>
//輸出out.print(0*2);out.print(1*2);out.print(2*2);
會這樣是因為out.println沒有被含在尖括號內,所以直接輸出了。而且在<% %>
內宣告的變數也只能在其中使用,比如說像上面第二段程式碼一樣。在html頁面中是無法直接使用的。
request物件
客戶端的請求資訊被封裝在request物件中
常用方法:
方法 | 說明 |
---|---|
String getParameter(String name) | 返回name指定引數的引數值 這個name就是html表單上name屬性值 |
String[] getParameterValues(String name) | 返回包含引數name的所有值的陣列(一般用於複選按鈕) |
void setAttribute(String name,Object) | 儲存此請求中的屬性,儲存屬性之後其他的jsp頁面也可用,不需要再次getParameter |
object getAttribute(String name) | 返回指定屬性的屬性值 這裡的name對應上面儲存時的name |
String getContentType() | 得到請求體的MIME型別 |
String getProtocol() | 返回請求用的協議型別及版本號 |
String getServerName() | 返回接受請求的伺服器主機名 |
int getServerPort() | 返回伺服器接受此請求所用的埠號 |
String getCharacterEncoding() | 返回字元編碼方式 |
void setCharacterEncoding() | 設定請求的字元編碼方式 |
int getContentLenth() | 返回請求體的長度(以位元組數) |
String getRemoteAddr() | 返回傳送此請求的客戶端ip地址 |
String getRealPath(String path) | 返回以虛擬路徑的真實路徑 |
String request.getContextPath() | 返回上下文路徑 |
關於getParameter——不僅僅是表單可以用,url也是可以用的(get和post方法都使用)
例:<a href="request.jsp?username=ll">url傳遞引數</a>
也是可以用reques.getParameter("username");
的
解決中文亂碼問題:在表單之前新增request.setCharacterEncoding("utf-8")
但是上面這種並不能解決url傳遞的中文亂碼問題,只能解決表單的。要解決URL傳遞;亂碼的話需要修改Tomcat伺服器的配置文件/tomcat根目錄/conf/server.xml
<Connecter port="…" …>
在最後加上一個屬性URIEncoding="utf-8"
即<Connecter port="…" … URIEncoding="utf-8">
(更改埠就是改這裡的port)
get與post區別:
get:以明文方式通過url提交資料,資料在url中可以看到。提交的資料最多不超過2kb。安全性較低,但效率比post高,適合提交資料量不大,安全性不高的資料,比如搜尋、查詢功能。
post:將使用者提交的資訊封裝在HTML HEADER內。適合提交資料量大,安全性高的使用者資料。比如註冊、修改、上傳。
提交使用者名稱和密碼用get的話位址列上會有顯示。
response物件
reponse物件包含了響應客戶請求的有關資訊,但在jsp頁面中很少直接用到它。
response物件具有頁面作用域,即訪問一個頁面時,該頁面內的response物件只能對這次訪問有效,且其他頁面的response物件對當前頁面無效。
response物件常用方法:
方法 | 說明 |
---|---|
String getCharacterEncoding() | 返回響應所用的字元編碼 |
String setContentType(String type) | 設定響應的MIME型別 |
PrintWriter getWriter() | 返回可以向客戶端輸出字元的一個物件 |
sendRedirect(String location) | 重新定向客戶端的請求 |
關於getWriter:
例:
PrintWriter outer = response.getWriter();
outer.println() ;
其輸出總是提前於內建out物件,就算先寫out.println 再寫outer.println也是一樣的。除非在out之後寫out.flush()強制先將快取中的內容輸出。
sendRedirect和getRequestDispatcher的區別:
重定向是一種客戶端行為,從本質上講等同於兩次請求,前一次請求的物件不會儲存,位址列的url會改變
而請求轉發(request.getRequestDispatcher().forward(req,resp);)是一次請求,轉發後請求物件會儲存,位址列的url不變
比如在一個頁面提交資料 提交到了1.jsp 而要從1轉去2進行處理,就要用請求轉發,如果是請求重定向,則2.jsp沒法接收到表單資料。
session物件
session表示客戶端與伺服器的一次會話(用於區分使用者身份),在伺服器的記憶體中儲存著不同使用者的session。
如果<%@ page session="false" %>
則該容器不會宣告session變數,對它的使用將會產生錯誤。
session物件常用方法:
方法 | 說明 |
---|---|
long getCreation Time() | 返回session建立時間 |
public String getID() | 返回session建立時jsp引擎為它設的唯一ID號 |
public void setAttribute(String name,Object value) | 使用指定名稱將物件繫結到此會話 |
public Object getAttribute(String name) | 返回此會話中與指定名稱繫結在一起的物件,若沒有則返回null |
String[] getValueNames() | 返回一個包含此session中所有可用屬性的陣列 |
int getMaxInactiveInterval() | 返回兩次請求間隔多長時間此session被取消(以秒為單位) |
int setMaxInactiveInterval() | 設定兩次請求間隔多長時間此session被取消(以秒為單位) |
session的生命週期:
1.建立。當客戶端第一次訪問某個jsp或servlet時,伺服器會為當前會話建立一個sessionId,每次客戶端向客戶端傳送請求時都會攜帶這個Id,伺服器會進行校驗
2.活動。當把所有相關頁面都關閉再重新訪問某個jsp或servlet時才會建立新的會話(在其中一個頁面還在的時候就算換瀏覽器也沒用)。但是注意此時舊的會話依舊在伺服器中存在,等到超時了它才會結束。
3.銷燬。三種方式:①呼叫session.invalidate()方法 ②session超時(過期)③伺服器重啟(銷燬所有會話)
application物件
application物件是ServletContext類的例項,開始於伺服器的啟動,終止於伺服器的關閉
在使用者的前後連線後不同使用者的連線中,可以對application物件的同一屬性進行操作。因此它實現了使用者間資料的共享,可存放全域性變數。
在任何地方對application物件屬性的操作都將影響到其他使用者對此的訪問
常用方法:
方法 | 說明 |
---|---|
public void setAttribute(String name,Object value) | 使用指定名稱將物件繫結到此會話 |
public Object getAttribute(String name) | 返回此會話中與指定名稱繫結在一起的物件,若沒有則返回null |
Enumeration getAttributeNames() | 返回所有可用屬性名的列舉 |
String getServerInfo() | 返回jsp(servlet)引擎名及版本號 |
Enumeration的例子:
Enumeration attributes = application.getAttributeNames();
while(attributes.hasMoreElements())
{
out.println(attributes.nextElements()+" ");
}
且
String path = application.getRealPath("/XX");
application.log("絕對路徑為:"+path);
等價於
String path = getServletContext().getRealPath("/XX");
getServletContext().log("絕對路徑為:"+path);
page物件
page物件指當前jsp頁面本身,有點像類中的this指標,是java.lang.Object類的例項
即 page.XXX 就相當於this.XXX
常用方法:(和Object類的常用方法一致)
方法 | 說明 |
---|---|
class getClass() | 返回此Object的類 |
int hashCode() | 返回此Object的hash碼 |
boolean equals(Object obj) | 判斷此Object是否與指定的Object物件相等 |
void copy(Object obj) | 把此Object拷貝到指定的Object物件中 |
Object clone() | 克隆此Object物件 |
String toString() | 把此Object物件轉換為String類的物件 |
void notify() | 喚醒一個等待的執行緒 |
void notifyAll() | 喚醒所有等待的執行緒 |
void wait(int timeout) | 使一個執行緒處於等待直到timeout結束或被喚醒 |
void wait() | 使一個人執行緒處於等待直到被喚醒 |
pageContext物件
pageContext物件提供了對jsp頁面內所有的物件及名字空間的訪問,因此它可以訪問到本頁的session,也可以獲取本頁面所在的application的某一屬性值。
常用方法:
方法 | 說明 |
---|---|
JspWriter getOut() | 返回當前客戶端響應被使用的JspWriter流(out) |
HttpSession getSession() | 返回當前頁中的HttpSession物件(session) |
Object getPage() | 返回當前頁的Object物件(page) |
ServletRequest getRequest() | 返回當前頁的ServletRequest(request) |
ServletResponse getResponse() | 返回當前頁的ServletResponse(response) |
void setAttribute(String name,Object attribute) | 設定屬性及屬性值 |
Object getAttribute(String name,int scope) | 在指定範圍內取屬性的值 |
int getAttributeScope(String name) | 返回某屬性的作用範圍 |
void forward(String relativeUrlPath) | 使當前頁面重導到另一頁面 |
void include(String relativeUrlPath) | 在當前位置包含另一檔案 |
在Servlet中將請求轉發到另一個資源需要request.getRequestDipatcher(“XX.jsp”).forward(request,response);
而在jsp頁面中:pageContext.forward(“XX.jsp”);
config物件
用於一個Servlet初始化時jsp向其傳遞資訊,此資訊包括Servlet初始化時所要用到的引數(通過屬性名和屬性值構成)以及伺服器的有關資訊(通過傳遞一個ServletContext物件)
常用方法:
方法 | 說明 |
---|---|
ServletContext getServletContext() | 返回含有伺服器相關資訊的ServletContext物件 |
String getInitParameter(String name) | 返回初始化引數的值 |
Enumeration getInitParameterNames() | 返回Servlet初始化所需所有引數的列舉 |
Exception物件-異常物件
當一個頁面在執行過程中發生了異常,就產生exception物件。如果jsp頁面要應用該物件,則需把page指令屬性isErrorPage值設為true,否則無法編譯
<%@page errorPage="XX.jsp"%>
->錯誤交由XX.jsp處理
然後XX.jsp中 <%@page isErrorPage="true"%>
然後可以在其中使用exception呼叫方法
常用方法:
方法 | 說明 |
---|---|
String getMassage() | 返回描述異常的訊息 |
String toString() | 返回關於異常的簡短描述訊息 |
void printStackTrace() | 顯示異常及其棧軌跡 |
Throwable FillInStackTrace() | 重寫異常的執行棧軌跡 |
三、指令與動作
include動作
語法:
<jsp:include page="url" flush="true/false" />
flush表示被包含的頁面是否從緩衝區讀取,預設為false
include指令和動作的比較:
區別 | include指令 | include動作 |
---|---|---|
發生作用的時間 | 頁面轉換期間 | 請求期間 |
包含的內容 | 檔案的實際內容 | 頁面的輸出 |
轉換成的servlet | 主頁面和包含頁面轉換為一個servlet | 主頁面和包含頁面轉換為獨立的servlet |
編譯時間 | 較慢——資源必須被解析 | 較快 |
執行時間 | 稍快 | 較慢——每次資源必須被解析 |
include指令靜態包含如果亂碼,html頁面中也要寫<@page pageEndcoding=”utf-8”>
forward動作
語法:<jsp:forward page="url" />
等同於 request.getRequestDispatcher(“/url”).forward(request,response);
param動作常作為
<jsp:forward page="xx.jsp">
<jsp:param name="name1" value="value1" />
<jsp:param name="name2" value="value2" />
</jsp:forward>
可以用來強制修改表單提交過來的值 也可以新增傳遞值