JSP常用的幾個內建物件
JSP內建物件的含義是可以直接在JSP頁面中使用的物件,使用前不需要宣告它,。可以不加宣告和建立就可以在JSP頁面指令碼(Java程式片和Java表示式)中使用的成員變數。常用的JSP的幾個內建物件為request、response、session。
一.request物件
使用者每訪問一個頁面,就會產生一個HTTP請求。這些請求中一般包含了請求所需的引數值或者資訊,如果將request物件看作是客戶請求的一個例項,那麼這個例項就包含了客戶請求的所有資料。因此,可以通過request來獲取客戶端和服務端的資訊,如IP地址、傳遞引數名和引數值、應用系統名,伺服器主機名等。
request物件的常用的方法
方法 | 描述 |
getParameter() | 該方法是取得請求中指定的引數值,返回String型別值 |
getParameterValues() | 該方法是將同名稱的引數一次性地讀入到String型別的陣列中 |
getParameterNames() | 獲取引數名稱,它返回的是列舉型別 |
getMethod() | 獲取客戶提交資訊的方式,是post還是get |
getServletPath() | 獲取JSP頁面檔案的目錄 |
getHeader() | 獲取HTTP標頭檔案中指定值,例如:accept、user-agent、content-type、content-length等 |
getRemoteAddr() | 獲取客戶的IP地址 |
getServerName() | 獲取伺服器的名稱 |
getServerPort() | 獲取伺服器埠 |
getHeaders() | 獲取標題資訊 |
-
使用request物件接收請求引數
request物件有兩種方法獲得請求引數值,一個是getParameter(),另一個是getParameterValues()。
前端如下所示:
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<html>
<head>
</head>
<body>
<form action="demo1_controller.jsp" method="post">
<div>
<input type="text" name="uname">
</div>
<div>
<input type="password" name="upsw">
</div>
<div>
<input type="radio" name="sex" value="1" checked="checked" >男
<input type="radio" name="sex" value="0" >女
</div>
<div>
<input type="checkbox" name="km" value="0" />數學
<input type="checkbox" name="km" value="1" />語文
<input type="checkbox" name="km" value="2" />外語
</div>
<div>
<select name="address">
<option value="0" selected="selected">南京</option>
<option value="1">北京</option>
<option value="2">上海</option>
</select>
</div>
<div>
<input type="submit" value="提交檢視">
</div>
</form>
</body>
</html>
使用getParameter獲得請求中指定引數值和使用getParameterValues獲得陣列
如下所示:
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<html>
<head>
</head>
<body>
<%
//單值使用getParameter方法獲取使用者資料
String c_name=request.getParameter("uname");
String c_upsw=request.getParameter("upsw");
String c_sex=request.getParameter("sex");
//多值使用getParameterValues方法獲取使用者資料,返回值是個字串陣列
String[] c_km=request.getParameterValues("km");
String c_address=request.getParameter("address");
if(c_sex.trim().equals("0")){
c_sex="女";
}else{
c_sex="男";
}
for(int i=0;i<c_km.length;i++){
if(c_km[i].trim().equals("0")){
c_km[i]="數學";
}else if(c_km[i].trim().equals("1")){
c_km[i]="語文";
}else if(c_km[i].trim().equals("2")){
c_km[i]="外語";
}
}
if(c_address.trim().equals("0")){
c_address="南京";
}else if(c_address.trim().equals("1")){
c_address="北京";
}else if(c_address.trim().equals("2")){
c_address="上海";
}
//字串緩衝類,通常適用於N多次連線操作,比如輸入流操作,
StringBuffer sb=new StringBuffer();
sb.append("使用者名稱"+c_name+",密碼"+c_upsw+",性別"+c_sex);
for(int i=0;i<c_km.length;i++){
if(i==0){
sb.append(",所選科目:"+c_km[i]);
}else{
sb.append("、"+c_km[i]);
}
}
sb.append(",地址是:"+c_address);
out.print(sb.toString());
out.print("<br/>");
out.print("專案名:"+request.getContextPath()+"<br>");
out.print("URL:"+request.getRequestURI()+"<br>");
out.print("ip:"+request.getServerName()+"<br>");
out.print("埠:"+request.getServerPort()+"<br>");
out.print("伺服器路徑:"+request.getServletPath()+"<br>");
//請求轉發
//設定請求編碼
request.setCharacterEncoding("utf-8");
//設定請求引數
request.setAttribute("param1", sb.append(""));
//獲取Disptcher類
RequestDispatcher disptcher= request.getRequestDispatcher("demo1_result.jsp");
//執行轉發
disptcher.forward(request, response);
%>
</body>
</html>
執行結果如下所示:
在URL引數傳遞時,在頁面地址後使用“?”連線請求引數,引數由“=”相連線表示引數名和引數值,一個請求攜帶多個引數用“&”連線。
2.get和post區別
在form中,有個非常重要的屬性method。method有兩個值,分別是get和post。
get:以明文的方式通過URL提交資料,資料在URL中可以看到。提交的資料最多不超過2KB。安全性較低但效率比post方式高。適合提交資料量不大,安全性不高的資料。如:搜尋、查詢等功能。
post:將使用者提交的資訊封裝在HTML HEADER內。適合提交資料量大,安全性高的使用者資訊。比如:註冊、修改、上傳等功能。
3.請求亂碼問題的處理
1.在接收請求的頁面中規定請求字元編碼的程式碼,如下所示:
//設定請求編碼
request.setCharacterEncoding("utf-8");
2.第二種方法是在取得引數值後,通過轉碼的方式將引數值轉為合適的字符集,如下所示:
String name=new String(request.getParameter("name").getBytes("ISO-8859-1"),"utf-8")
String city=new String(request.getParameter("city").getBytes("ISO-8859-1"),"utf-8");
3.通過編寫一個Servlet過濾器來解決中文亂碼問題,並可以通過配置過濾器解決所有請求處理字符集的問題,請求處理頁面就不用關心字符集的處理了。第三種方法可以有效的防止上述的問題且移植性強。
二.response物件
當用戶訪問一個頁面時,就產生一個HTTP請求,伺服器做出響應時呼叫的是response響應包。response響應包實現的是介面javax.servlet.http.HttpServletResponse。
reponse常用的方法
方法 | 說明 |
addHeader(String arg0,String arg1) | 向頁面種新增頭和對應的值 |
addCookie(Cookie arg0) | 新增Cookie資訊 |
sendRedirect(String arg0) | 實現頁面重定向 |
setStatus(int arg0) | 設定頁面的響應狀態碼 |
setContentType(String arg0) | 設定頁面的MIME型別和字符集 |
setCharacterEncoding(arg0) | 設定頁面響應的編碼型別 |
1.設定頭資訊
設定頭資訊包括設定頁面返回的MIME型別、返回的字符集、頁面中的meta等資訊。其中設定MIME型別和返回的字符集尤為重要,因為它關係到頁面的顯示是否會出現亂碼,有兩種方法設定MIME型別和返回的字符集,分別如下:
response.setContentType(String type);//其中type的值為“text/html;charset=utf-8",當然可以為其他的MIME型別和字符集。
用page指令。基本固定格式是:
<%@ page contentType="text/html;charset=utf-8" language="java" %>
setContentType的用法
setContentType.jsp用來設定MIME型別和字符集,MIME設定為"text/html",字符集設定為"UTF-8",其原始碼如下:
<%
response.setContentType("text/html;charset=UTF-8"); //設定字符集和MIME型別
String str=new String("這是測試例子".getBytes("ISO-8859-1"),"utf-8");
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>setContentType.jsp</title>
</head>
<body>
<p>這裡是一段中文字元</p>
</br>
<%=str %>
</body>
</html>
執行結果如下所示:
從執行結果可以看出,指令碼中經過轉碼的文字顯示正常,而在HTML中的字是亂碼。
使用page指令設定字符集,在寫法和處理上都相對簡單些,HTML中的中文字不需要轉碼,而且指令碼中的中文字也不需要轉碼。
用page指令設定頁面字符集
<%@page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String str="這是測試例子";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>setContentType.jsp</title>
</head>
<body>
<p>這裡是一段中文字元</p>
</br>
<%=str %>
</body>
</html>
執行結果如下所示:
JSP中頁面設定字符集會破壞JSP容器自身的頁面編碼處理,所以不建議設定。但可以在Servlet中設定。用page指令設定字符集相對簡單,所以在開發中一般採用這種模式
設定頭meta資訊是指HTML頁面中存在於<head></head>之間的資訊。例如:
(1)<meta http-equiv="pragma" content="no-cache">:設定禁止瀏覽器從本地機的快取中呼叫頁面內容,設定後離開網頁就不能從Cache中再呼叫。
(2)<meta http-equiv="cache-control" content="no-cache">:請求和響應遵循的快取機制策略。
(3)<meta http-equiv="expires" content="0">:用於設定網頁的到期時間,一旦過期則必須到伺服器上重新呼叫。
(4)<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">:向搜尋引擎說明網頁的關鍵字。
(5)<meta http-equiv="description" content="This is my page">:向搜尋引擎說明網頁的主要內容。
頁面請求重定向和請求轉發的區別
請求重定向:客戶端行為,response.sendRedirect(),從本質上講等同於兩次請求,前一次的請求物件不會儲存,位址列的URL地址會改變。
請求轉發:伺服器行為,request.getRequestDispatcher().forward(request,response);是一次請求,轉發後請求物件會儲存,位址列的URL地址不會改變。
三.Session物件
在web開發中,session物件同樣佔據著極其重要的位置,在開發中它是一個非常重要的物件,可以用來判斷是否是同一使用者,還可以用來記錄客戶的連線資訊等。HTTP協議是一種無狀態的協議(即不儲存連線狀態的協議),每次使用者請求在接收到伺服器的響應後,連線就關閉了,伺服器端與客戶端的連線就被斷開。因此,當用戶的瀏覽器沒關閉,這個時候又發起請求,那麼網站就應該識別出該使用者的情況。這種情況下,session物件就起到了關鍵作用。
session相關概念
名稱 | 說明 |
會話 | 當用戶開啟瀏覽器連線到一個Web應用時或者某個介面,當關閉瀏覽器這個過程稱為一個會話。其實一開啟一個瀏覽器就意味著打開了一個會話物件 |
session物件生命週期 | 當用戶訪問某個頁面到關閉瀏覽器,這段時間稱之為session物件的生命週期。也可以說是會話開始到結束這段時間稱為session物件的生命週期 |
session物件與執行緒 | 一個使用者一個執行緒,這樣保證了多個使用者單擊同一頁面時的session物件唯一性 |
session物件與Cookie物件 | session物件與Cookie物件是一 一對應關係。JSP引擎會將建立好的session物件存放在對應的Cookie中 |
session物件常用方法
方法 | 說明 |
void setAttribute(String arg0,String arg1) | 將引數名和引數值存放在session中 |
Object getAttribute(String arg0) | 通過arg0中的引數獲取引數值 |
Enumeration getAttribteName() | 一個使用者一個執行緒,這樣保證了多個使用者單擊同一頁面時的session物件唯一性 |
String getID() | 獲取session物件的ID值 |
void removeAttribute(String arg0) | 移除指定中的引數 |
long getCreateTime() | 獲取物件建立的時間,返回結果是long型的毫秒數 |
int getMaxInactiveInterval() | 獲取session物件的有效時間 |
void setMaxInactiveInterval() | 設定session物件的有效時間 |
Boolean isNew() | 用於判斷是否是一個新客戶 |
void invalidate() | 使session物件不合法即失效 |
程式碼如下所示:
session_save.jsp
<%@page import="com.stujy.UserInfo"%>
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<html>
<head>
</head>
<body>
<%
session.setAttribute("param1", "這是session的資料!");
UserInfo ui = new UserInfo();
ui.setNc("暱稱");
session.setAttribute("ui", ui);
//response.sendRedirect("session_test.jsp");
%>
<button onclick="tiaozhuan()">跳轉</button>
<script type="text/javascript">
function tiaozhuan() {
location.href = "session_test.jsp";
}
</script>
</body>
</html>
執行如下所示:
當點選跳轉按鈕會跳轉至session_test.jsp頁面
session_test.jsp:
<%@page import="com.stujy.UserInfo"%>
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%
%>
<html>
<head>
</head>
<body>
<%
String param1=(String)session.getAttribute("param1");
UserInfo ui=(UserInfo)session.getAttribute("ui"); //
out.print(param1+"</br>");
out.print(ui.getNc());
%>
</body>
</html>
執行結果如下所示:
session預設在伺服器上的儲存時間為30分鐘,當客戶端停止操作30分鐘後,session中儲存的資訊會自動失效。此時呼叫getAttribute()等方法將出現異常。