1. 程式人生 > >Java EE入門教程系列第二章JSP(四)——內建物件

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。因此,如果需要其他型別的屬性值,需要進一步轉換。