1. 程式人生 > >jsp頁面元素和內建物件

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()+"&nbsp; &nbsp;");
}

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>

可以用來強制修改表單提交過來的值 也可以新增傳遞值