1. 程式人生 > >JavaWeb02-JSP數據交互

JavaWeb02-JSP數據交互

應用服務器 變量 通過 多個 ont 重定向 訪問服務器 個數 簡化

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相同!
(目前針對與谷歌/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數據交互