java-jsp內建物件
JSP中預先定義了9個這樣的物件,request,response,session,application,out,pageContext,config,page和exception。
request物件
request物件是javax.servlet.http.HttpServletRequst型別的物件,該物件代表了客戶端的請求資訊,主要用於接收通過HTTP協議傳送到服務端的資料(包括頭資訊,系統資訊,請求方式以及請求引數等)request物件的作用域為一次請求。
獲取請求引數中傳遞的值
可以通過
String id = request.getParameter("id" );
獲取引數的值。如果不存在此引數,那麼該方法返回null。
使用request物件獲取請求引數值
在web中建立index.jsp頁面,在其中加入一個超連結按鈕用來請求show.jsp頁面,並在請求後增加一個引數id
<body>
<a href = "show.jsp?id=001">獲取請求引數的值</a>
</body>
新建show.jsp頁面,其中通過getParameter()方法來獲取id引數和name的值,並將其輸出到頁面中
<body>
id引數的值為:<%=request .getParameter("id") %><br>
name引數的值為:<%=request.getParameter("name") %>
</body>
結果
獲取Form表單資訊
對於文字元素,單選按鈕,下拉列表框都可以使用getParameter()方法來獲取其具體的值
但對於複選框和多選列表別選定的內容就要使用getParameterValue()方法來獲取,該方法會返回一個字串陣列,通過迴圈遍歷這個陣列就可以得到使用者選定的所有內容。
建立index.jsp頁面,在該頁面建立一個form表單,在表單中分別加入文字框,下拉列表框,單選按鈕和複選框
<body>
<form action="show.jsp"method="post">
<ul style="list-style:none;line-height:30px">
<li>輸入使用者姓名:<input type="text"name="name"/><br></li>
<li>選擇性別:
<input name = "sex"type="radio"value="男"/>男
<input name = "sex"type="radio"value="女"/>女
</li>
<li>
選擇密碼提示問題:
<select name = "question">
<option value = "母親生日">母親生日</option>
<option value ="寵物名稱">寵物名稱</option>
<option value = "電腦配置">電腦配置</option>
</select>
</li>
<li>請輸入問題答案:<input type ="text" name = "key"/></li>
<li>
請選擇個人愛好:
<div style="width:400px">
<input name="like" type="checkbox"value="唱歌跳舞"/>唱歌跳舞
<input name="like"type="checkbox"value="上午衝浪"/>上網衝浪
<input name="like"type="checkbox"value="戶外登山"/>戶外登山
<input name="like"type="checkbox"value="體育運動"/>體育運動<br/>
<input name="like"type="checkbox"value="讀書看報"/>讀書看報
<input name="like"type="checkbox"value="欣賞電影"/>欣賞電影
</div>
</li>
<li><input type="submit"value="提交"/></li>
</ul>
</form>
</body>
編寫show.jsp頁面,該頁面是用來處理請求的,在其中分別使用getParameter()方法與getParameterValues()方法將使用者提交的表單資訊顯示在頁面中
<body>
<ul style="list-style:none;line-height:30px">
<li>輸入使用者名稱:<%=new String(request.getParameter("name")) %></li>
<li>選擇性別:<%=new String(request.getParameter("sex")) %></li>
<li>選擇密碼提示問題:<%=new String(request.getParameter("key")) %></li>
<li>請輸入問題答案:<%=new String(request.getParameter("key")) %></li>
<li>請選擇個人愛好:
<%
String[] like = request.getParameterValues("like");
for(int i = 0;i<like.length;i++){
%>
<%=new String(like[i])+" " %>
<%
}
%>
</li>
</ul>
</body>
結果
獲取請求客戶端資訊
在request物件中通過相應的方法還可以獲取客戶端的相關資訊,如HTTP報頭資訊,客戶資訊提交方式,客戶端主機IP地址,埠號等
<body>
<ul style="line-height:24px">
<li>客戶使用協議:<%=request.getProtocol() %>
<li>客戶端傳送請求的方法:<%=request.getMethod() %>
</ul>
</body>
結果
在作用域中管理屬性
通過使用setAttribute()方法可以在request物件的屬性列表中新增一個屬性,然後在request物件的作用域範圍內通過getAttribute()方法將其屬性取出,此外,還可使用removeAttribute()方法將一個屬性刪除掉。
//首先將date屬性加入到request屬性列表中,然後輸出這個屬性的值,接下來使用removeAttribute()方法將date屬性刪除,最後再次輸出date屬性
<%
request.setAttribute("date",new Date());//新增一個屬性
%>
<body>
<ul style="line-height:24px;">
<li>獲取date屬性:<%=request.getAttribute("date") %></li>
<!-- 降屬性刪除 -->
<%request.removeAttribute("date"); %>
<li>刪除後再獲取date屬性<%=request.getAttribute("date") %></li>
</ul>
</body>
request物件作用域為一次請求,超出作用域後屬性列表中的屬性即會失效。
cookie管理
cookie是小段的文字資訊,通過使用cookie可以標識使用者身份,記錄使用者名稱及密碼,跟蹤重複使用者。
cookie在伺服器端生成傳送給瀏覽器,瀏覽器將cookie的key/value儲存到某個指定的目錄中,伺服器的名稱和值可以由伺服器端定義。
通過cookie的getCookies()的方法可以獲取到所有的cookie物件集合,然後通過cookie物件的getName()方法獲取到指定名稱的cookie,再通過getValue()方法即可獲取到cookie物件的值。另外,將一個cookie物件傳送到客戶端使用了response物件的addCookie()方法。
建立index.jsp頁面檔案,在其中建立form表單,用於讓使用者輸入資訊,並且從request物件中獲取cookie,判斷是否含有此伺服器傳送過的cookie。如果沒有,則說明該使用者第一次訪問本站,如果有,則直接將值讀取出來,並賦給對應的表單。
<%
String welcome = "第一次訪問";
String[] info = new String[]{"","",""};
Cookie[] cook = request.getCookies();
if(cook!=null){
for(int i = 0;i < cook.length;i++){
if(cook[i].getName().equals("mrCoolInfo")){
info = cook[i].getValue().split("#");
welcome=",歡飲回來!";
}
}
}
%>
<%=info[0]+welcome %>
<form action="show.jsp"method="post">
<ul style = "line-height:23">
<li>姓 名:<input name="name"type ="text"value="<%=info[0] %>"></li>
<li>出生日期:<input name ="birthday"type="text"value = "<%=info[1] %>"></li>
<li>郵箱地址:<input name="main"type="text"value="<%=info[2] %>"></li>
<li><input type="submit" value="提交"></li>
</ul>
</form>
建立show.jsp頁面檔案,在該頁面中通過request物件將使用者輸入的表單資訊提取出來,建立一個cookie物件,並通過response物件的addCookie()方法將其傳送到客戶端。
<%
String name = request.getParameter("name");
String birthday = request.getParameter("birthday");
String mail = request.getParameter("mail");
Cookie myCook = new Cookie("mrCookInfo",name+"#"+birthday+"#"+mail);
myCook.setMaxAge(60*60*24*365); //設定cookie有效期
response.addCookie(myCook);
%>
表單提交成功
<ul style ="line-height:24px">
<li>姓名:<%=name %>
<li>出生日期:<%=birthday %>
<li>電子郵箱:<%=mail %>
<li><a href="index.jsp">返回</a>
</li>
response物件
response代表的是對客戶端的響應,主要是將JSP容器處理過的物件傳回到客戶端。response物件也是有作用域,它只是JSP頁面內有效。response物件的常用方法:
重定向網頁
使用sendRedirect()方法,將響應傳送到另一個指定的位置進行處理,進行重定向操作後,request中的屬性全部失效,並且進入一個新的request物件的作用域。
response.sendRedirect("www.mingribook.com")
處理HTTP檔案頭
setHeader()方法通過兩個引數——頭名稱與引數值的方式來設定HTTP檔案頭
例如:設定網頁每5秒自動重新整理一次
response.setHeader("refresh","5");
例如:設定2秒鐘後自動跳轉至指定頁面
response.setHeader("refresh","2;URL=welcome.jsp")
例如:設定響應型別
response.setContentType("text/html");
設定輸出緩衝
通常,伺服器要輸出到客戶端的內容不會直接寫到客戶端,而是先寫到一個輸出緩衝區;只有在以下3種情況下,才會把緩衝區的內容寫入緩衝區
JSP頁面的輸出資訊已經全部寫入緩衝區
緩衝區已滿在JSP頁面中呼叫flushbuffer()方法或out物件的flush()方法
setBufferSize()方法可以設定緩衝區大小。例如設定緩衝區大小為0KB,
response.setBufferSize(0);
使用isCommitted()方法來檢測伺服器端是否已經把資料寫入到了客戶端。
session物件
session物件是由伺服器自動建立的與使用者請求相關的物件。session儲存該使用者資訊,跟蹤使用者的操作狀態,內部使用Map類來儲存資料,因此儲存資料的格式為key/value
建立及獲取session資訊
session是與請求有關的會話物件,是java.servlet.http.HttpSession物件。
setAttribute()方法可以實現將資訊儲存在session範圍內,語法格式
setAttribute(String key,Object obj)
key:儲存在session範圍內的關鍵字
obj:儲存在session範圍內的物件
getAttribute()方法可以實現獲取儲存在session範圍內的資訊
getAttribute(String key)
key:指定儲存在session範圍內的關鍵字
在index.jsp頁面中,實現將文字資訊儲存在session範圍內
<%
String sessionMessage = "session練習";
session.setAttribute("message", sessionMessage);
out.print("儲存在session範圍內的物件為:"+sessionMessage);
%>
在default.jsp頁面中,獲取儲存在 session範圍內的資訊並在頁面中顯示
<body>
<%
String message=(String)session.getAttribute("message");
out.print("儲存在session範圍內的值為"+message);
%>
</body>
從會話中移除指定的繫結物件
removeAttribute(String key)
key:儲存在session範圍內的關鍵字
removeAttribute(“message”)
銷燬session
當呼叫session物件的invalidate()方法後,表示session物件被刪除,即不可以再使用session物件
session.invalidate();
呼叫後,再呼叫session物件的任何其他方法時都會報出Session already invalidated異常。
會話超時的管理
在應用session物件時應該注意session的生命週期,一般在20-30分鐘。
在session物件中提供了設定會話生命週期的方法
getLastAccessedTime():返回客戶端最後一次與會話相關聯的請求時間
getMaxInactiveInterval():以秒為單位返回一個會話內兩個請求最大時間間隔
setMaxInactiveInterval():以秒為單位設定session的有效時間
例如
session.setMaxInactiveInterval(10000);
session物件的應用
在index.jsp頁面中,提供了使用者輸入使用者名稱文字框,在session.jsp頁面中,將使用者輸入的使用者名稱儲存在session.jsp頁面中,將使用者輸入的使用者名稱儲存在session物件中,使用者在該頁面中可以新增最喜歡去的地方;在result.jsp頁面中,將使用者輸入的使用者名稱與最想去的地方在頁面中顯示。
(1)index.jsp
<body>
<form id = "form1"name="form1"method="post"action="session.jsp">
<div align="center">
<table width="23%"border="0">
<tr>
<td width="36%"><div align="center">您的名字</div></td>
<td width="64%">
<label>
<div align="center">
<input type = "text" name ="name"/>
</div>
</label>
</td>
</tr>
<tr>
<td colspan="2">
<label>
<div align="center">
<input type="submit"name="Submit"value="提交"/>
</div>
</label>
</td>
</tr>
</table>
</div>
</form>
</body>
(2)在session.jsp頁面中,將使用者在index.jsp頁面中輸入的使用者名稱儲存在session物件中,併為使用者提供用於新增最想去的地址的文字框
<body>
<%
String name = request.getParameter("name"); //獲取使用者填寫的使用者名稱
session.setAttribute("name",name); //將使用者名稱儲存在session物件中
%>
<div align="center">
<form id="form1"name="form1"method="post"action="result.jsp">
<table width="28%"border="0">
<tr>
<td>您的名字是:</td>
<td><%=name %></td>
</tr>
<tr>
<td>您最喜歡去的地方是:</td>
<td><label>
<input type="text"name="address"/>
</label></td>
</tr>
<tr>
<td colspan="2"><label>
<div align="center">
<input type="submit"name="Submit"value="提交"/>
</div>
</label></td>
</tr>
</table>
</form>
</div>
</body>
(3)在result.jsp頁面中,實現將使用者輸入的使用者名稱,最喜歡去的地方在頁面中顯示
<body>
<%
String name=(String)session.getAttribute("name");//獲取儲存在session範圍內的物件
String solution = request.getParameter("address");//獲取使用者輸入的最喜歡去的地方
%>
<form id="form1"name="form1"method="post"action="">
<table width = "28%"border="0">
<tr>
<td colspan="2"><div align="center"><strong>顯示答案</strong></div></td>
</tr>
<tr>
<td width="49%"><div align="left">您的名字是</div></td>
<td width="51%"><label>
<div align ="left"><%=name %></div>
</label></td>
</tr>
<tr>
<td><label>
<div align="left">您最喜歡去的地方</div>
</label></td>
<td><div align="left"><%=solution %></div></td>
</tr>
</table>
</form>
</body>
結果:
application物件
application物件可將資訊儲存在伺服器中,直到伺服器關閉,否則application物件中儲存的資訊會在整個應用中都有效,生命週期更長。
訪問應用程式初始化引數
application提供了對應用程式環境屬性訪問的方法。
application物件訪問應用程式初始化引數的方法
getInitParameter(String name):返回一個已命名的引數值
getAttributeNames():返回所有已定義的應用程式初始化名稱的列舉
管理應用程式環境屬性
getAttributeNames():獲得所有application物件使用的屬性名
getAttribute(String name):從application物件中獲取指定物件名
setAttribute(String key,Object obj):使用指定名稱和指定物件在application物件中進行關聯
removeAttribute(String name):從application物件中去掉指定名稱的屬性
out物件
out物件用於在Web瀏覽器內輸出資訊,並且管理應用伺服器上的輸出緩衝區。
管理相應緩衝
clear()方法清除緩衝區,如果相應內容已經提交,則報出IOException異常
clearBuffer()方法,即使內容已經提交給客戶端,也能夠訪問該方法
向客戶端輸出資料
向客戶端寫入資料
print():在頁面中列印字串資訊,不換行
println():在頁面中列印字串資訊,,並且換行。
其他內建物件
獲取會話範圍內的pageContext物件
pageContext物件的作用是取得任何範圍的引數,通過他可以獲取JSP頁面的out,request,response,session,application等物件。
讀取web.xml配置資訊的config物件
config物件主要作用是取得伺服器的配置資訊。
應答或請求的page物件
獲取異常資訊的exception物件
只有在isErrorPage=“true”的頁面中才能被使用
獲取異常資訊的exception物件
(1)建立index.jsp頁面,在該頁面中編寫程式碼,並通過errorPage屬性指定有異常資訊時系統將轉發至error.jsp頁面
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"errorPage="error.jsp"%>
<body>
<%
int apple=Integer.parseInt("ad");
out.println("蘋果每斤"+apple+"元");
%>
</body>
(2)編寫error.jsp頁面,用於接收傳遞過來的異常資訊
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"isErrorPage="true"%>
<body>
錯誤提示為:<%=exception.getMessage() %>
</body>
參考書籍:《Java Web開發實戰》作者:軟體開發技術聯盟