1. 程式人生 > >JSP技術的總結

JSP技術的總結

JSP概述

JSP(Java Server Page)和Servlet是JavaEE規範的兩個基本成員。
JSP和Servlet的本質一樣。
JSP慢慢發展成單一的表現層技術,不再承擔業務邏輯元件及持久層元件的責任。

Web應用和web.xml檔案

1、構建Web應用

<webDemo>---這是Web應用的名稱,可以改變
|--WEB-INF
|      |-classes(儲存單個*.class檔案)
|      |-lib(儲存打包後的JAR檔案)
|      |-web.xml——配置描述符
|-<a.jsp>——此處可存放任意多個JSP頁面

JSP的4種基本語法

1、JSP註釋:<%--註釋內容--%> HTML註釋:<!--註釋內容-->
JSP註釋不會發送到客戶端
2、JSP宣告:<%!宣告部分%>
JSP頁面的宣告部分將轉換成對應的Servlet成員變數或方法
3、輸出JSP 表示式:<%=表示式>
4、JSP指令碼:<% %>
所有可執行Java程式碼都可通過JSP指令碼嵌入HTML頁面
JSP腳本里不能定義方法

JSP的3個編譯指令

JSP的編譯指令是通知JSP引擎的處理訊息

page:針對當前頁面的指令
include:用於指定包含另一個頁面
taglib:用於定義和訪問自定義標籤

編譯指令語法:<%@編譯指令 屬性名=:"屬性值"...%>
1、page指令

extends:指定JSP頁面編譯所產生的Java類所繼承的父類,或所實現的介面
import、session、buffer、errorPage、isErrorPage、language、autoFLush
info:設定該JSP程式的資訊,可以看做為說明,在JSP頁面中,呼叫getServletInfo()方法獲取該值
contentType:用於設定生成網頁的檔案格式和編碼字符集。

2、include指令:<%@include file="relativeURLSpec"%>


靜態的include語句:包含頁面在編譯時將完全包含了被包含頁面的程式碼

JSP的7個動作指令

執行時的動作
與編譯指令區別:編譯指令在將JSP編譯成Servlet時起作用,而處理指令通常可替換成JSP指令碼,是JSP指令碼的標準化寫法。

jsp:forward:執行頁面轉向,將處理請求的處理轉發到下一個頁面
jsp:param:用於引數傳遞,必須與其他支援引數的標籤一起使用
jsp:include:動態引入一個JSP頁面
jsp:plugin:下載JavaBeann或Applet到客戶端執行
jsp:useBean:建立一個JavaBean的例項
jsp:serProperty:設定JavaBean例項的屬性值
jsp:getProperty:輸出JavaBean例項的屬性值

1、jsp:forward:

<jsp:forword page="{relativeURL|<%=expression%>}">
 {<jsp:param.../>}
</jsp:forward>

執行forward指令時,使用者請求的地址依然沒有發生改變
2、include指令:

">      <jsp:param name="parameterName" value="patameterValue"/>
   </jsp:include>

靜態匯入和動態匯入的區別
(1)靜態匯入是將被匯入頁面的程式碼完全融入,兩個頁面融合成一個整體Serlvet;動態匯入則在Serlvet中使用include方法來引入被匯入頁面的內容
(2)靜態匯入時被匯入頁面的編譯指令會起作用;動態匯入時被匯入頁面的編譯指令則失去作用,只是插入被匯入頁面的body內容
(3)動態包含可以增加引數

forward與include區別
forward拿目標頁面代替原有頁面,include則拿目標頁面插入原有頁面

3、useBean、setProperty、getProperty指令
useBean:
<jsp:useBean id="name" class="classname" scope="page|request|session|application"/>
setProperty:<jsp:setProperty name="BeanName" property="propertyName" value="value"/>
getProperty:<jsp:getProperty name="BeanName" property="propertyName"/>

JSP指令碼中的9個內建物件

9個內建物件都是ServletAPI介面的例項,它們已經是物件,可以直接使用

application:JSP所屬的Web應用本身
config:JSP的配置資訊(JSP頁面通常無需配置)
exception:代表其他頁面中的異常和錯誤
out:JSP頁面的輸出流
page:頁面本身
pageContext:代表JSP頁面的上下文
request:封裝了一次請求,客戶端的請求引數都被封裝在該物件裡
response:代表伺服器對客戶端的相應
session:代表一次會話。客戶端瀏覽器與站點建立連線,會話開始。客戶端關閉瀏覽器時,會話結束

JSP內建物件的 實質:_jspService*()方法的形參(request、response),或區域性變數。所以只能在JSP指令碼,JSP輸出表達式中使用,不能在宣告中使用(會找不到變數)

1、application物件
在整個Web應用的多個JSP、Servlet之間共享資料
訪問Web應用的配置引數
(1)多個JSP、Servlet共享資料
通過setAttribute(String attrName,Object value)方法將一個值設定成application的attrName屬性,對整個Web應用有效,訪問該屬性方法:getAttribute(String attrName)
(2)獲得Web應用配置引數(web.xml)getInitParameter(String paramName)和getInitParameter()

2、config物件
當前JSP配置資訊,較少使用該物件,config是ServletConfig的例項,獲取配置引數:getInitParameter(String paramName)

3、exception物件
exception物件是Throwable的例項
JSP的異常處理機制對JSP宣告不起作用

4、out物件
代表一個頁面輸出流
<%=…%>表示式的本質就是out.write(…);

5、pageContext物件
作用:訪問JSP之間的共享資料,可以訪問page、request、session、application範圍的變數
(setAttribute)getAttribute(String name):取得page範圍內的name屬性
getAttribute(String name,int scope):取得指定範圍內name屬性,
scope:PageContext.Page_SCOPE/REQUEST_SCOPE/SESSION/APPLICATION
getAttributesScope(String)返回變數所在的生存範圍
可以通過pageContext物件獲取其他內建物件(getRequest()/getResponse()/getServletConfig()/getServletContext()/getSession())

6、request物件
(1)獲取請求頭/請求引數
Web應用是請求/響應架構
request是HttpServletRequest介面的例項
方法:

String getParameter(String paramName):獲取paramName請求引數的值
Map getParameter():獲取所有請求引數名和引數值所組成的Map物件
Enumeration getParameterNames():獲取所有請求引數名所組成的Enumeration物件
String[]getParameterValues(String name):paramName請求引數的值,當該請求引數有多個值時,該方法將返回多個值所組成的陣列

HttpServletRequest所提供訪問請求頭的方法

String getHeader(String name):根據指定請求頭的值
java.util.EnumerationgetHeaderNames():獲取所有請求頭的名稱
java.util.EnumerationgetHeaders(String name):獲取指定請求頭的多個值
int getIntHeader(String name):獲取指定請求頭的值,並將該值轉為整數值

請求頭:通常由瀏覽器自動新增,一次請求總是包含若干請求頭
請求引數:需要開發人員控制新增,讓客戶端傳送請求引數通常分兩種情況。

GET方式的請求:在瀏覽器位址列輸入訪問地址所傳送的請求/提交表單傳送請求時,form元素沒有設定method屬性,或method屬性為get,請求資料量較小,一般不大於2kb
POST方式的請求:通常使用提交表單的方式,method屬性為post。資料量更大,安全性相對較高(位址列看不到請求引數值)

表單中有name屬性的表單域才生成請求引數
若多個表單域有相同的name屬性,則多個表單域只生成一個請求引數,只是該引數有多個值
POST:若請求引數中包含非西歐字元,則必須在獲取請求引數之前先呼叫setCharacterEncoding()方法設定編碼的字符集

GET:若請求引數包含非西歐字元

String rawName=request.getParameter("name");
byte[] rawBytes=rawName.getBytes("ISO-8859-1");//將請求引數值使用IOS-8859-1分解成位元組陣列
String name=new String(rawBytes,"UTF-8");//將位元組陣列重新編碼成字串

(2)操作request範圍的屬性
HttpServletRequest包含如下方法,用於設定和獲取request範圍的屬性

setAttribute(String attName,Object attValue):將attvalue設定成request範圍的屬性
Object getAttribute(String attName):獲取request範圍的屬性

(3)執行forward或include
方法:**getRequestDispatcher(String path) path必須以斜線開頭(“/a.jsp”)**path為forward和include的目標路徑,返回RequestDispatcher,該物件兩個方法:

forward(ServletRequest request,ServletResponse response):執行forward
include(ServletRequest request,ServletResponse response):執行include

7、response物件
代表伺服器對客戶端的響應
(1)response響應生成非字元響應(圖、PDF…)
方法:getOutputStream()方法,返回響應輸出位元組流
(2)重定向
與forward區別:丟失所有請求引數和request範圍的屬性
方法:sendRedirect(String path)執行redirect後生成第二次請求,URL改變
(3)增加Cookie
Cookie通常用於網站記錄客戶的某些資訊
與session區別:session會隨瀏覽器關閉而失效,Cookie會一直存放在客戶端機器上。=
方法:void addCookie(Cookie cookie):增加Cookie
步驟:

建立Cookie例項,Cookie的構造器為Cookie(String name,String value)
設定Cookie的生命期限Cookie.setMaxAge()
向客戶端寫Cookie

客戶端Cookie使用request物件,提供了getCookies()方法,返回Cookie陣列
獲得引數值:Cookie.getValue();
值為中文的Cookie需要藉助 java.net.URLEncoder.encode(“中文”,”編碼字符集”)先對中文字元進行編碼,編碼後的結果設為Cookie,讀取Cookie,應先讀取,再使用 java.net.URLEncoder.encode(cookie.getValue())對其進行解碼

8、Session物件
一次會話含義:從客戶端瀏覽器連線伺服器開始,到客戶端瀏覽器與伺服器斷開為止
session通常用於跟蹤使用者的會話資訊,可以在多個頁面的跳轉之間共享
session物件是HttpSession的例項,方法:

setAttribute(String attName,Object attValue):設定session範圍內attName屬性的值
getAttribute(String attName):返回session範圍內attName屬性的值

session機制通常用於儲存客戶端的狀態資訊,需要儲存到Web伺服器的硬碟上,session裡的屬性值必須是可序列化的,否則將會引起不可序列化的異常(session屬性值可以使任何可序列化的Java物件