獲取表單提交的數據:
JSP(Java Server Pages)
從瀏覽器到服務器是瀏覽器發送請求(request)
從服務器到瀏覽器是瀏覽器接收響應(response)
【通過JSP來實現】
request對象:
主要用於處理客戶端請求
request對象常用方法:
方法名稱 |
說明 |
String getParameter(String name) |
根據表單組件名稱獲取提交數據 |
String[ ] getParameterValues(String name) |
獲取表單組件對應多個值時的請求數據 |
Void setCharacterEncoding(String charset) |
指定每個請求的編碼 |
RequestDispatcher getRequestDispatcher(String path) |
返回一個RequestDispatcher對象,該對象的forward( )方法用於轉發請求 |
URL getContextPath() |
獲得上下文路徑的路徑指的就是到WebRoot |
示例彙總:
1. 請求對象:request
request作用域:請求的範圍,在一次請求的範圍內
public String getParameter(String name)
HTML代碼:
<input type= "text" name= "userName" >
JSP代碼:
String userName =request.getParameter("userName );
注:有快捷鍵Ctrl+Alt+向下的箭頭就能複製上一行
2. 獲取同名的多個參數
HTML代碼:
<input type="checkbox" name="mailId" value=" 10001"/>
<input type="checkbox" name="mailId" value="10002"/>
<input type="checkbox" name="mailId" value="10003"/>
<input type="checkbox" name="mailId" value="10004" />
<input type="checkbox" name="mailId" value="10005" />
JSP代碼:
String[ ] mailId=request.getParameterValues("mailId ");
if(mailId!=null& mailId.length!=0){
//循環mailds訪問提交的數據
}else{
//未提交與參數maild相關的數據
}
表單提交到JSP,中文亂碼問題解決方法:
編碼方式 |
收錄的字符 |
gb2312 |
常用簡體漢字 |
Gbk |
簡體和繁體漢字 |
utf-8 |
所有國家需要的字符 |
不同表單提交方式,解決方法不同:
get與post區別:
比較項 |
get |
post |
參數出現在URL中 |
是 |
否 |
長度限制 |
有 |
無 |
安全性 |
低 |
高 |
URL可傳播 |
是 |
否 |
1. get提交方式的中文亂碼解決辦法:
方法一:治標
語法:
字符串.getBytes("ISO-8859-1"),"utf-8"
示例:
String userName = request.getParameter("username");
userName=new String(userName.getBytes("ISO-8859-1"),"utf-8");
方法二:治本
配置tomcat\conf\server.xmI文件
<Connector connectionTimeout " 20000" port="8080"
protocol="HTTP/1.1" redirectPort="8443" URIEncoding="UTF-8"/>
2. post提交方式的中文亂碼解決辦法:
在提交的JSP頁面填入一句代碼
語法:
request.setCharacterEncoding("utf-8");
3. 使用request轉移信息中中文亂碼解決辦法:
語法:
傳遞部分使用URLEncoder.encode()來設置編碼
現字符串 = URLEncoder.encode(原字符串, "UTF-8");
接收部分使用URLDecoder.decode()來解碼
現字符串= URLDecoder.decode(原字符串, "UTF-8");
在請求中存取屬性:
1. 在請求中保存屬性:
public void setAttribute(String name,Object o)
request.setAttribute("mess", "註冊失敗");
request.setAttribute()的作用域僅限於一次請求
2. 在請求中獲取屬性
public Object getAttribute(String name)
注:
3. 在使用屬性值的時候要做非空判斷,否則會出現空指針異常
示例:
String mess=request.getAttribute(" mess");
mess.length();
這麼寫是錯的,應該先判斷:
String mess=(String)request.getAttribute("mess");
if(mess!=null){
//在請求中取到"mess"屬性對應的屬性值,正常使用mess數據
}else{
//在請求中沒有取到"mess"屬性對應的屬性值,使用備選方案
}
4. 它的返回值類型是Object類型,需要做數據類型的轉換
JSP內置對象response:
response對象用於響應客戶請求並向客戶端輸出信息
頁面重定向(見下方詳細說明):
- void sendRedirect(String location)
- 客戶端將重新發送請求到指定的URL
轉發與重定向:
1. 轉發(頁面實現跳轉了,請求的信息也一起轉移)
用戶進行一次請求,但是服務器內部自動完成了跳轉,服務器的行爲無形中延長了request作用域;所以用戶看到的地址欄並不是應該的最後的跳轉地址,依然是上一個地址。
RequestDispatcher對象
forward()方法
示例:
- request.getRequestDispatcher("url"),forward(request,response)
- <jsp;forward page="url" />
2. 重定向(頁面實現跳轉了,但是請求的信息不一起轉移)
用戶進行一次請求,服務器只是提示用戶要跳轉但是自己沒有進行跳轉,所以不會轉移信息。
將用戶請求重新定位到一個新的URL
response.sendRedirect("url")
如果想讓重定向也能傳遞信息要使用如下方法:
String mess = "成功";
mess = URLEncoder.encode(mess, "UTF-8");
response.sendRedirect(request.getContextPath()+"/index.jsp?mess="+mess);
在轉到頁面要使用如下方法:
String mess = request.getParameter("mess");
mess = URLDecoder.decode(mess, "UTF-8");
out.println(mess);
其中:?參數=的語法結構就是在傳遞參數;但是在傳遞中文時會出現亂碼的情況,詳細介紹請看前面的“中文亂碼的解決”。
3. 轉發與重定向的區別
轉發:
- 轉發是在服務器端發揮作用,將同一請求在服務器資源之間進行傳遞
- 客戶端瀏覽器的地址欄不會顯示轉向後的地址
重定向:
- 重定向是在客戶端發揮作用,通過發送一個新的請求實現頁面轉向
- 在地址欄中可以顯示轉向後的地址
比較項 |
轉發 |
重定向 |
URL變化 |
否 |
是 |
重新發出請求 |
不會 |
會 |
是否攜帶請求 |
是 |
否 |
目標URL要求 |
僅本Web應用 |
任意URL |
重定向是客戶端行爲,轉發是服務器行爲
內置對象:
JSP已經準備好的,可以直接使用的對象(其中前五個比較重要):
1. 請求對象:request :主要用於處理客戶端請求的數據信息
2. 輸出對象:out :用於向客戶端輸出數據
用來輸出和System.print不同,不用點出來
3. 響應對象:response :用於響應客戶端請求並向客戶端輸出信息
4. 應用程序對象:application :類似於系統的全局變量,用於實現Web應用中的資源共享
5. 會話對象:session :用於記錄會話狀態的相關信息
6. 頁面上下文對象:pageContext
7. 頁面對象:page
8. 配置對象:config
9. 異常對象:exception
其中的page可以理解成this(當前對象,作用域最小) 作用域僅限於當前頁面,只能在當前頁面訪問到attribute
session中的setAttribute()作用域是一次會話:
會話:一個會話就是瀏覽器和服務器之間的一次通話;會話可以在多次請求中保存和使用數據;一個會話就是在一段時間內,一個客戶端與Web服務器的一連串相關的交互過程;會話可以在多次請求中保存和使用數據:
public void setAttribute(String name, Object value);
用法:session.setAttribute("userName","張三丰");
public Object getAttribute(String name);
用法:String username=(String) session.getAttribute("userName");
session與窗口的關係:
- 每個session對象都與一個瀏覽器窗口對應 ,重新開啓一個瀏覽器窗口,可以重新創建一個session對象(不同版本瀏覽器可能有所差別)
- 通過超鏈接打開的新窗口,新窗口的session與其父窗口的session相同
session是一種機制,是服務器端使用的用來記錄同一個客戶端狀態的一個機制—sessionId來判斷哪個客戶端:session.getId(); public String getId(); 【得到當前客戶端的編號,每一個session有一個唯一的sessionId】
同一個瀏覽器不管打開多少次都會顯示同一個客戶ID;不同的瀏覽器的到的客戶ID不同
session是單用戶、多頁面可共享,session是保存在服務器端的
session對象常用方法:
方法名稱 |
說明 |
String getId() |
獲取sessionid |
void setMaxInactiveInterval(int interval) |
設定session的非活動時間 |
int getMaxInactiveInterval() |
獲取session的有效非活動時間(以秒爲單位) |
void invalidate() |
設置session對象失效 |
void setAttribute(String key, Object value) |
以key/value的形式保存對象值 |
Object getAttribute(String key) |
通過key獲取對象值 |
void removeAttribute(String key) |
從session中刪除指定名稱(key)所對應的對象 |
會話的清除和過期:
Session的數據是在服務器端的,服務器保存的會話數據量會越來越大,從而導致性能問題;所以若沒有清理機制,會導致性能問題或服務器崩潰:
1. 程序主動清除session數據
手動設置失效:session.invalidate() 【程序裏最常用的方法】
移除會話的一個屬性:
public void setAttribute(String name);
用法:session.removeAttribute("userName");
2. 服務器主動清除長時間沒有再次發出請求的session
設置會話過期時間超時失效:
方法一:通過setMaxInactiveInterval( )方法,單位是秒
public void setMaxInactiveInterval (int Interval);
示例:
<%
session.setAttribute("login","admin");
session.setMaxInactiveInterval(600);
response.sendRedirect("admin.jsp");
%>
方法二:通過設置項目的web.xml或Tomcat目錄下的/conf/web.xml文件,單位是分鐘
<session-config>
<session-timeout>10</session-timeout>
</session-config>
include指令:
除了首頁面,其它頁面中同樣需要加入登錄驗證,有沒有辦法避免冗餘代碼的出現?
可以將一些共性的內容寫入一個單獨的文件中,然後通過include指令引用該文件
方法一:
創建登錄驗證文件 loginControl.jsp
示例:
<%
String login = (String) session.getAttribute("login");
if (login == null) {
response.sendRedirect("index.jsp");
return;
} %>
方法二:
在後臺首頁面中使用include指令引用登錄驗證文件
示例:
<%@ include file="loginControl.jsp" %>
JSP內置對象application:
application實現用戶之間的數據共享
application對象的常用方法
方法名稱 |
說 明 |
void setAttribute(String key,Object value) |
以key/value的形式保存對象值 |
Object getAttribute(String key) |
通過key獲取對象值 |
String getRealPath(String path) |
返回相對路徑的真實路徑 |
示例:統計網站訪問次數的實現:
一個用戶進行多次刷新頁面
多個用戶訪問頁面
分析:
- 每個用戶都需要使用訪問次數
- application可在整個項目中共享使用數據
- 使用application實現計數器
- 每次訪問該頁面,計數器加1
解決方法:
public void setAttribute(String name, Object object)
application.setAttribute(String name, Object object);
public Object getAttribute(String name)
application.getAttribute(String name);
統計頁:
<%
Integer count = (Integer) application.getAttribute("count");
if (count != null) {
count = 1 + count;
} else {
count = 1;
}
application.setAttribute("count", count);
%>
顯示頁:
<%
Integer i = (Integer) application.getAttribute("count");
out.println("您好,您是第 " + i + " 位訪問本網站的用戶");
%>
但是服務器停了之後重新啓動就會重新計數
三個對象對比:
request、session、application
相同點:都可以存儲屬性
不同點:
- request中存儲的數據僅在一個請求中可用
- session中存儲的數據在一個會話的有效期內可用
- application中存儲的數據在整個Web項目中可用
JSP常用內置對象的作用域:
1. page作用域:
對應的作用域訪問對象爲pageContext 對象
page的作用域指本JSP頁面的範圍:
pageContext.setAttribute(鍵,值)
pageContext.getAttribute(鍵)
2. request作用域:
對應的作用域訪問對象爲request 對象
request的作用域內的對象則是與客戶端的請求綁定在一起
3. session作用域:
對應的作用域訪問對象爲session 對象
session的作用域是一次會話
4. application作用域:
對應的作用域訪問對象爲application 對象
application的作用域是面對整個Web應用程
cookie:
跟蹤用戶的整個會話
cookie通過在客戶端記錄信息;給客戶端發送一個通行證,每一個客戶一個
cookie的本質:
Web服務器保存在客戶端的一小段文本信息
cookie的作用:
- 對特定對象的追蹤
- 實現各種個性化服務
- 簡化登錄
安全性能:容易泄露信息
cookie以文件方式保存數據:
創建cookie對象:
Cookie newCookie = new Cookie(String key, String value);
添加數據:
public void addCookie(Cookie cookie)
response.addCookie(newCookie);
獲取數據:
public Cookie[] getCookies() 【返回值是一個數據】
Cookie[] cookies = request.getCookies();
設置有效期:
public void setMaxAge(int expiry)
只要打開一個瀏覽器訪問一個服務器時默認會發回來一個cookie名字是JsessionID,內容是一串數字和字母合起來。所以可以知道session是基於cookie的。
cookie對象的常用方法:
方法名稱 |
說 明 |
void setMaxAge(int expiry) |
設置cookie的有效期,以秒爲單位 |
void setValue(String value) |
在cookie創建後,對cookie進行賦值 |
String getName() |
獲取cookie的名稱 |
String getValue() |
獲取cookie的值 |
int getMaxAge() |
獲取cookie的有效時間,以秒爲單位 |
setPath("/") |
設置返回值,加上setPath("/");這句話說明cookie對於整個工程是可見的,如果不加這句話cookie只對當前這個路徑和它的子目錄可見; |
當在cookie中使用中文的時候會出現中文亂碼,此時要使用encode設置編碼和decode解碼來實現:
示例:
1. encode設置編碼
userName = URLEncoder.encode(userName, "UTF-8");
Cookie cookie = new Cookie("username",userName);
2. decode解碼
username = cookies[i].getValue();
username = URLDecoder.decode(username, "UTF-8");
cookie與session的對比:
1. session:
- 在服務器端保存用戶信息
- session中保存的是Object類型
- 隨會話的結束而將其存儲的數據銷燬
- 保存重要的信息
2. Cookie
- 在客戶端保存用戶信息
- cookie保存的是 String類型
- cookie可以長期保存在客戶端
- 保存不重要的用戶信息
JavaBean:
- 就是一個Java類
- 封裝業務邏輯
- 封裝數據
JavaBean的優勢:
- 解決代碼重複編寫,減少代碼冗餘
- 功能區分明確
- 提高了代碼的維護性
從JavaBean的功能上可以分爲:
- 封裝數據
- 封裝業務
封裝數據的JavaBean:
技巧:
使用工具自動生成getter/setter方法:
Alt+Shift+S ---> Generate Getters and Setters
除了要建立的util包之外一般還有service包:
名字都是:***Service:接口 <--- 業務邏輯
Dao(接口)---> DaoImpl(接口實現類):數據庫的數據操作
一般一個Dao對應一張數據表(*******)
總結: