Java EE入門教程系列第二章JSP(四)——內建物件
2.4 內建物件
2.4.1 常用的內建物件
在JSP頁面中已經預先定義好了9個內建物件,可以在Web應用中直接使用。內建物件的構建基於HTTP協議,所以它們可以完成收集瀏覽器請求發出的資訊、響應瀏覽器請求以及儲存客戶資訊等工作,極大簡化了Web開發工作。
JSP內建列表如下圖所示:
1.request物件
request物件是javax.servlet.http.HttpServletRequest的例項,包含所有請求的資訊,如請求的來源、標頭、Cookies和請求相關的引數值等。該物件封裝了使用者提交的資訊,通過呼叫該物件相應的方法可以獲取封裝資訊,也就是使用該物件可以獲取使用者提交的資訊。
request物件可以請求有效的屬性操作;獲取HTT Header資訊;獲取HTTP請求引數,一般是HTML表單提交的引數資訊;獲取伺服器端相關資訊,包括伺服器的名稱、地址和埠等;獲取協議版本。
常用的方法如下表:
1)獲取使用者輸入資訊
使用getParameter(String s)方法可以獲取表單所提交的資訊,括號裡代表引數名。
舉例:在jsprequest.jsp輸入資訊,提交給show.jsp並顯示剛才輸入的資訊
jsprequest.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>request的getParameter方法</title> </head> <body> <form action="show.jsp" method="post" name="form"> 姓名:<input type="text" name="name"><p> 性別:<input type="text" name="sex"><p> 年齡:<input type="text" name="age"><p> <input type="submit" name="submit" value="提交"> </form> </body> </html>
show.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <body> <%--在這裡設定request得到的引數的字元編碼 ,否則會出現中文亂碼 --%> <%request.setCharacterEncoding("UTF-8"); %> 得到輸入的使用者資訊:<p> 姓名:<%=request.getParameter("name") %><p> 性別:<%=request.getParameter("sex") %><p> 年齡:<%=request.getParameter("age") %><p> 獲取按鈕標記名:<%=request.getParameter("submit") %> </body> </html>
結果截圖:
2)獲取客戶端、伺服器等的相關資訊
舉例:getinfo.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ page import="java.util.*" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<br>使用者使用的協議是:
<%= request.getProtocol() %>
<br>獲取接受客戶提交資訊的頁面:
<%= request.getServletPath() %>
<br>接受客戶提交資訊的長度:
<%= request.getContentLength() %>
<br>客戶提交資訊的方式:
<%= request.getMethod() %>
<br>獲取HTTP標頭檔案中User-Agent的值:
<%= request.getHeader("User-Agent") %>
<br>獲取HTTP標頭檔案中Host的值:
<%= request.getHeader("Host") %>
<br>獲取HTTP標頭檔案中accept-encoding的值:
<%= request.getHeader("accept-encoding") %>
<br>獲取客戶的IP地址:
<%= request.getRemoteAddr() %>
<br>獲取客戶機的名稱:
<%= request.getRemoteHost() %>
<br>獲取伺服器的名稱:
<%= request.getServerName() %>
<br>獲取伺服器的埠號:
<%= request.getServerPort() %>
</body>
</html>
結果為:
2.reponse物件
代表伺服器對客戶端的響應,通常我們要實現這種功能時更多選擇out——頁面輸出流,直接使用out生成響應更簡單。但是out是JspWriter的例項,JspWriter是Writer的子類,Writer是字元流,無法輸出非字元內容,比如我們需要在JSP頁面動態生成點陣圖時,就只能使用response。
response物件可以對HTTP Header資訊進行處理;設定資料內容的型別和長度;獲取輸出流;進行本地化操作;緩衝控制;瀏覽器重定向;響應狀態控制;向瀏覽器傳送Cookie。
常用方法如下:
1)根據contentType屬性動態響應
頁面內容不僅僅有HTML格式,也可能是Word、Excel等,這就需要用到response的setCcontentType(String s)方法改變屬性值來完成,s可以取text/html(標準HTML檔案)、application/x-msexcel(Excel檔案)、application/x-msword(Word檔案)、text/plain(純文字檔案)等格式。
舉例:將頁面內容指定為Word格式
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ page import="java.util.*" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="application/maword; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
</body>
</html>
2)自動重新整理頁面
使用response物件的setHeader()方法,語句格式為:
response.setIntHeader("Refresh",等待重新整理時間);
也可以設定瀏覽器載入新頁面:
response("Refresh",等待重新整理時間,URL=要載入新頁面的路徑);
舉例:每隔5秒自動重新整理頁面,獲取當前時間
response.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ page import="java.util.*" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
當前時間:
<%
response.setHeader("Refresh","5");
out.println(new java.util.Date());
%>
</body>
</html>
截圖:
3)response重定向
使用sendRedirect(URL)方法可以實現重定向,URL不僅可以訪問本伺服器的資源,也可以訪問其他伺服器的資源。
舉例:Redirect.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ page import="java.util.*" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
String address=request.getParameter("position");
if(address!=null){
if(address.equals("CSDN"))
response.sendRedirect("http://www.csdn.net");
else if(address.equals("MS"))
response.sendRedirect("http://www.microsoft.com");
else if(address.equals("IBM"))
response.sendRedirect("http://www.ibm.com");
}
%>
<b>請選擇要定位的路徑</b><br>
<form action="Redirect.jsp" name="form" method="post">
<select name="position">
<option value="CSDN" selected>to CSDN
<option value="MS" >to MS
<option value="IBM" >to IBM
</select>
<input type="submit" value="提交" name="submit">
</form>
</body>
</html>
3.out物件
out是向客戶端輸出的PrinterWriter物件,帶有緩衝特性。緩衝區容量可以通過page指令的buffer屬性設定或者關閉。out物件主要方法為:
舉例:使用out物件輸出一個HTML表格(這個好像教材又有小錯誤,以後我覺得教材有錯的就不貼教材的程式碼了~~~照書上程式碼敲出來執行不正確抓狂呀-> ->)
out.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ page import="java.util.*" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
int BufferSize=out.getBufferSize();
int Available=out.getRemaining();
%>
<%
String[] str=new String[5];
str[0]="out";
str[1]="輸出";
out.println("<html>");
out.println("<head>");
out.println("<title>使用out輸出表格</title>");
out.println("</head>");
out.println("<body>");
out.println("<table cellspacing=1 bgcolor=pink border=1 width=200>");
out.println("<tr>");
out.println("<td align=center>陣列序列</td>");
out.println("<td align=center>陣列值</td>");
out.println("</tr>");
out.println("<html>");
for(int i=0;i<2;i++)
{
out.println("<tr>");
out.println("<td>str["+i+"]</td>");
out.println("<td>"+str[i]+"</td");
out.println("</tr>");
}
out.println("<tr>");
out.println("<td>BufferSize:</td>");
out.println("<td>"+BufferSize+"</td>");
out.println("</tr>");
out.println("<tr>");
out.println("<td>Available:</td>");
out.println("<td>"+Available+"</td>");
out.println("</tr>");
out.println("</table>");
out.println("</body>");
out.println("</html>");
%>
</body>
</html>
截圖:
4.session物件
在有些應用中,伺服器需要不斷識別是從哪個客戶端發來的請求,比如淘寶購物車,要保證以前使用者選擇的商品不丟失,還要保證使用者可以新增新商品到自己的購物車而不是別人的,就需要session發揮作用。
session用於指在一段特定時間內,某使用者與Web伺服器的一系列互動過程。當一個使用者登入網站後,伺服器就為該使用者建立一個session物件,一般是由系統預設建立的,大多數情況下預設開啟狀態。
session物件主要方法:
舉例:session.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ page import="java.util.*" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<h3>會話標識Sessionid:<%= session.getId() %></h3>
<p>建立時間Created time<%= new Date(session.getCreationTime()) %>
<P>原設定一次會話持續的時間:<%= session.getMaxInactiveInterval() %>
<p>最近訪問的時間:<%= new Date(session.getLastAccessedTime()) %>
<p>是否是新一次的會話:<%= session.isNew() %>
<p>設定會話共享的屬性"content"="session example":<% session.setAttribute("content", "session example"); %>
<P>顯示原會話共享的屬性:<%= session.getAttribute("content") %>
<P>設定會話新的持續時間:<% session.setMaxInactiveInterval(10); %>
</body>
</html>
截圖:
5.application物件
application物件在伺服器啟動時就產生了,當一個客戶訪問伺服器上一個JSP頁面時,JSP引擎就為該使用者分配這個物件,當用戶在所訪問的網站的各個頁面之間進行瀏覽時,這個application物件都是同一個,知道伺服器關閉,物件才被取消,這是和session物件相同的部分,不同的是所有客戶的application物件都是同一個,而session物件是每個使用者擁有單獨的一個。由於這種特點,application物件經常用於記錄所有客戶端公用的一些資料,如頁面訪問次數。
主要方法有:
舉例:application.jsp 頁面訪問量計數器
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ page import="java.util.*" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
if(application.getAttribute("count")==null){
application.setAttribute("count","1");
out.println("歡迎,您是第1位訪客!");
}
else{
int i=Integer.parseInt((String)application.getAttribute("count"));
i++;
application.setAttribute("count",String.valueOf(i));
out.println("歡迎,您是第"+i+"位訪客!");
}
%>
</body>
</html>
動手試一下,你會發現即使將頁面重新關閉再開啟,或者從不同客戶端瀏覽器開啟該網頁,計數器仍然有效,直到重啟伺服器位置。
注:有些伺服器不支援直接使用application物件,必須用ServletContext類宣告這個物件,再使用getServletContext()方法對物件進行初始化。
6、exception物件
這個物件是用來進行異常處理的,要使用它,必須在page命令中設定<%@ page isErrorPage="true" %>。
主要方法有:
當JSP引擎在執行過程中發生錯誤就會自動產生一個異常物件,如果這個頁面指定了另一個頁面為錯誤處理程式,那麼該引擎會將這個異常物件放到request物件中,傳到錯誤處理程式。由於isErrorPage設定為true,JSP引擎自動生成exception物件,這個物件會從request物件包含的HTTP引數中獲得。
舉例:
exceptionsource.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ page import="java.util.*" %>
<%@ page errorPage="exceptionShow.jsp" %>
<%
String result=" ";
String action=request.getParameter("action");
if(action!=null){
int n=new Integer(request.getParameter("number")).intValue();
result=String.valueOf(100/n);
}
%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<form name="exception" method="post" action="exceptionsource.jsp?action=submit">
請輸入一個數:<input type="text" name="number" value="">
<input type="submit" value="提交">
<br>100除以該數得:<%= result %>
</form>
</body>
</html>
exceptionShow.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ page isErrorPage="true" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title></title>
</head>
<body>
這裡是錯誤資訊頁面:
<%
out.println("exception.toString():");
out.println("<br>");
out.println(exception.toString());
out.println("exception.getMessaage():");
out.println("<br>");
out.println(exception.getMessage());
%>
</body>
</html>
截圖:
7、pageContext物件
用於儲存JSP頁面相關資訊,提供了存取所有JSP程式執行時所要用到的方法和屬性,主要方法為:
舉例:pageContext.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ page import="java.util.Enumeration" %>
<%@ page isErrorPage="true" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title></title>
</head>
<body>
<%
Enumeration enums=pageContext.getAttributeNamesInScope(PageContext.APPLICATION_SCOPE);
while(enums.hasMoreElements()){
out.println("application scope attributes:"+enums.nextElement()+"<br>");
}
%>
</body>
</html>
截圖:
2.4.2 內建物件作用範圍
是指每個內建物件的某個例項在多長時間和多大範圍內有效。JSP定義了4種作用範圍,代表了物件各自的生命週期。
1、Application Scope
2、Session Scope
3、Request Scope
4、Page Scope
需要注意的是,指定屬性名稱的引數型別為String,而返回的屬性值為java.lang.Object。因此,如果需要其他型別的屬性值,需要進一步轉換。