標籤:轉移 規範 亂碼 path 負數 字串 err ati new
01.頁面編碼格式
001.jsp頁面本身的編碼 page指令中的 pageEncoding屬性!
002.瀏覽器渲染頁面採用的編碼 contentType屬性
003.伺服器儲存資料採用的編碼(request) 預設為 ISO-8859-1
注意:
01.--前兩種(pageEncoding/contentType),一旦指定了一種,另一種如果不指定的話 預設採用已指定的編碼!
--request.setCharacterEncoding(String charset)用來設定request內部儲存資料的格式!(不包括URL!)
02.contentType和pageEncoding的區別:
contentType定義的是響應的資源類型,也可以包含jsp頁面和響應內容的字元集;
pageEncoding指定jsp檔案的字元集以及預設的contentType字元集!
02.JSP 九個內建對象!
out : JspWriter類的執行個體!
常用方法:01.void print(Object); ==》輸出各種類型!
02.void println(Object);==》輸出各種類型!
03.void write(charset); ==》輸出字元類型! 不能列印 null String str=null!
response: 最常用重新導向! void sendRedirect(String location)
session:會話!(HttpSession類的執行個體)
瀏覽器與web伺服器之間使用http協議進行通訊的!
HTTP協議是一種基於請求/響應模式的 無狀態 訪問協議!
“無狀態”是指每一個HTTP請求都是獨立的!伺服器不會儲存以往的請求和會話!
因此,當一個用戶端發送請求到web伺服器時,無論是否是第一次來訪,伺服器都當他是第一次來訪!
作為伺服器來說,必須有一種機制來唯一標識每一個請求使用者(不然不能確定每一次操作是否是同一使用者!),同時記錄該使用者的狀態資訊!==》會話跟蹤機制!
該機制可以儲存每個請求使用者的會話資訊!
session 一詞指 有始有終的一系列動作!
session執行過程:
01.會話機制是一種伺服器端的機制!當使用者第一次向伺服器發送請求時,伺服器會為該使用者建立唯一的會話,會話將一直持續到使用者訪問結束!
02.當伺服器接收到用戶端請求時,伺服器端會首先判斷是否建立了與該用戶端對應的會話!
如果已建立,就將該請求與此會話相關聯!反之,就建立一個新的會話!
03.伺服器端是否建立了相關會話,是通過一個唯一的標識 sessionid來實現的!
如果在用戶端的請求中包含了一個sessionid。則說明在此前已經為該用戶端建立了會話!
伺服器就根據這個sessionid將之前的session對象讀取出來!
否則就建立一個新的會話對象並產生一個sessionid!
並將sessionid在本次響應中 “返回給用戶端儲存” !(sessionid是儲存在 用戶端cookie中!)
sessionid會返回用戶端,那麼在用戶端sessionid儲存在哪??
在用戶端儲存資訊使用 cookie,在cookie中,儲存sessionid的名稱是JESEEIONID!(由一串複雜的字串組成!)
session和瀏覽器視窗:
通過超連結開啟的新視窗,新視窗與其父視窗的sessionid相同!
(目前針對與Google/IE8以上的瀏覽器,多個視窗為同一個sessionid!共用同一個緩衝!儲存在本地的cookie中!)
會話的失效:
01.會話逾時:兩次請求的時間間隔超過了伺服器允許的最大時間間隔!
001.通過session對象的setMaxInactionInterval(單位秒)設定session的 “非啟用時間”!(瀏覽器最後依次訪問伺服器開始計算!)
002.在項目的web.xml中設定!
<session-config>
<session-timeout>10(單位分鐘)</session-timeout>
</session-config>
003.在應用伺服器中的web.xml中設定!
這裡引入一個概念:
項目中web.xml和tomcat伺服器中的web.xml
01.tomcat-web.xml + 項目-web.xml = 合并的xml
02.如果這兩個中出現重複的配置,項目中的優先!(就近原則)
03.tomcat伺服器中為全域配置!項目中是局部的!只針對本項目有效!
02.手動調用方法使其失效
session.invalidate():設定session對象失效!主要應用於 使用者登出登入的功能!
如果只想清空會話中的某個資料對象,使用session.removeAttribute(String key)!會話仍然有效!
注意:session.setAttribute(String key,Object value) value值為Object類型,get擷取時需要向下轉型!
request:將url和data封裝成request請求!
請求中的中文亂碼問題:
01. post請求方式: tomcat對請求資料預設採用ISO-8859-1的編碼!
request.setCharacterEncoding("utf-8"); 頁面中
頁面本身的編碼要和請求沒編碼一致!<%@page contentType="text/html;charset=utf-8"%>
02. get請求方式:
因為get請求時,提交的資料作為查詢字串被附加到url的末尾發送至伺服器!
對於這部分資料,使用request.set..是不起作用的!
解決方式1:
得到請求的參數後進行編碼轉換!
String name = request.setParameter("name");
name = new String(name.getBytes("ISO-8859-1"),"utf-8");
其中,getBytes()按照ISO-8859-1的編碼格式把name轉化為 byte數組!
在通過new String()使用指定的utf-8將 byte數組狗造成一個新的String!
解決方式2:
方式1中,如果存在多個參數,則要對每個參數都進行操作!繁瑣,效率不高!
可以通過tomcat目錄結構\conf\server.xml 檔案
設定<Connector>節點!
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000" redirectPort="8443"
URIEncoding="UTF-8"/>
application : 類似於系統的全域變數!同一個應用內的所有使用者之間的資料共用!
常用方法:String getRealPath();返回相對路徑的真實路徑!
e:\apache-tomcat-7.0.73\webapps\...
經常應用於統計訪問人數!
Integer count = (Integer)application.getAttribute("count");
if(count != null){
count = count+1;
}else{
count =1;
}
application.setAttribute("count",count);
page :當前jsp頁面執行個體化的對象 (this)
這裡說明下 兩個 include的區別:
01.include指令:
<%@include file="**.jsp"%>
例如 a.jsp include b.jsp
過程:
將a.jsp+b.jsp= c.jsp (合并後產生 c.jsp) c 是我們類比的,實際沒有 c.jsp檔案!
c.jsp--c.java--c.calss--執行!
所以說 兩個pageContext在同一個範圍中!
02.pageContext.include("**.jsp");
例如 a.jsp include b.jsp
過程:
01.先執行 b.jsp--b.java--b.class--執行!--得到結果 c(null)
02.將結果 c(null) 與 a.jsp合并成新的c.jsp! --c.java--c.class--執行!--得到結果
所以說 兩個pageContext分別在 a和b 兩個範圍中!
a.jsp頁面:
String name = "haha";
pageContext.setAttribute("name",name);
a中內容:<%=pageContext.getAttribute("name")%>
<%=pageContext.include("b.jsp")%>//在 a頁面中 引入b頁面
b.jsp頁面:
b中內容:<%=pageContext.getAttribute("name")%>
運行a.jsp得到結果為:haha null
config :指定jsp頁面初始化配置(servlet中會使用!)
exception :異常一般使用java代碼處理!此對象很少使用!
該對象只有在 page指令中設定 isErrorPage為true的頁面中使用!
pageContext :內建對象的集大成者!通過pageContext 可以擷取其他8個內建對象! pageContext.getRequest()...
Object getAttribute();//返回Object類型value值!
void include();//請求指定的資源,並將目標資源的響應結果包含在調用頁面的響應中!
JSP內建對象不需要執行個體化?
所謂內建對象就是由Web容器載入的一組ServletAPI的執行個體,這些執行個體由JSP規範進行了預設的初始化操作!(_jsp.java中!)
內建對象名均為JSP的保留字!
03.JSP四大範圍
page;對應一個jsp頁面的運行
request:一次請求
session: 會話有效期間內
application:整個應用上下文
範圍 : application > session > request > page
04.轉寄和重新導向!
轉寄過程:
web容器內部將一個request請求的處理權交給了另外一個資源,屬於同一個請求/響應的過程!request對象的資訊不會丟失!
轉寄是在 伺服器端發揮作用!通過RequestDispatcher對象的forward()將提交資訊在多個頁面間進行傳遞!
轉寄是在伺服器內部進行控制權的轉移!用戶端瀏覽器地址欄不會顯示出轉寄後的地址!(可以共用請求中的資料!)
重新導向過程:
web容器向瀏覽器返回一個響應,瀏覽器接收這個響應後再發送一個新的http請求到伺服器(屬於兩次不同的請求!第一次請求request對象的資訊將丟失!)
重新導向是在用戶端發揮作用!通過請求新的地址實現頁面跳轉!(瀏覽器重新請求地址!地址欄中顯示轉向後的地址!)
注意:如果想在重新導向下 傳遞少量的參數,可以將參數追加至url末尾!
response.sendRedirect("welcome.jsp?userName="+name+"&pwd="+pwd);
在使用超連結<a>進行資料傳遞時,採用的是get方式!
(除了form中指定post和ajax指定post,其他情況都預設採用get方式提交請求!)
05.include指令!
通過include指令引用公用代碼檔案,從而緩解代碼冗餘問題!
<%@include file="檔案路徑"%>
01.在JSP編譯階段 插入一個包含文本或代碼的檔案,這個包含的過程是 靜態!(可包含JSP HTML 文字檔等...)
02.include指令只有 一個屬性 file! 被包含的檔案路徑!
06.cookie
cookie 由Netscape公司發明,是最常用的 跟蹤使用者會話的方式!
是由伺服器端產生 並發送給用戶端瀏覽器!瀏覽器會將其儲存在某目錄下的文字檔!
應用情境:
01.判斷使用者註冊使用者是否已經登入,儲存資訊以便下次簡化登入!
02.最近瀏覽的商品
03.統計網站瀏覽次數
04.實現個人化服務,針對使用者喜好展示不同內容
注意:
cookie會將使用者資訊儲存在用戶端,安全性上cookie存在一定風險!不建議將敏感資訊儲存在cookie中!
01.建立cookie
Cookie cookie = new Cookie(String name,String value);
02.寫入cookie
response.addCookie(cookie);
03.讀取cookie
Cookie[] cookies = request.getCookies();//該方法返回http請求中的coookie數組!
遍曆此數組,通過getName()和getValue() 擷取!
04.驗證sessionid以cookie的形式儲存在用戶端之中!
建立會話
session.setAttribute("str","haha");
response.sendRedirect("getCookie.jsp");
//此處如果為轉寄,則得不到cookie中的JSESSIONID!
因為轉寄是一次請求,用戶端沒有得到響應!故沒有向用戶端寫入cookie!
在getCookie.jsp中進行擷取
out.print("sessionid="+session.getId());
Cookie[] cookies = request.getCookies();
if(cookies!=null){
for(Cookie cookie:cookies){
out.print("cookieName="+cookie.getName())
out.print("cookieValue="+cookie.getValue());
}
}
得到結果 sessionid 和 cookieValue 的值一致!
05.cookie的有效期間
cookie是有生命週期的!
cookie.setMaxAge(int expiry); 以秒為單位!
注意:
如果設定expiry=0 則表示從用戶端刪除該cookie!
如果設定expiry為負數/不設定 則表示cookie會在當前視窗關閉後失效!
07.cookie 和 session
session的範圍是在伺服器端儲存使用者資訊,cookie是在用戶端!
session範圍中儲存的值是Obejct類型,cookie儲存的值是String類型!
session範圍隨會話的結束而將其儲存的資料銷毀,cookie可以長期儲存在用戶端!
session通常儲存重要的資訊,而cookie通常儲存不重要的資訊!
例如 儲存使用者登入名稱/密碼 不能使用cookie!
電商網站中的“最近瀏覽過的商品”可以使用cookie儲存!
JavaWeb02-JSP資料互動