書名: Java EE 程序設計作者名: 郝玉龍編著本章字數: 4908字更新時間: 2019-07-01 10:16:11
4.6 內置對象
Servlet API規范包含了一些接口,這些接口向開發者提供了方便的抽象,這些抽象封裝了對象的實現。如HttpServletRequest接口代表從客戶發送的HTTP數據,其中包含頭信息、表單參數等。
JSP根據Servlet API規范提供了相應的內置對象,開發者不用事先聲明就可以使用標準的變量來訪問這些對象。JSP共提供九種內置對象:request、reponse、out、session、application、config、pagecontext、page和exception。JSP編程時要求熟練應用這些內置對象。下面重點講解編程中經常使用的一些內置對象。
4.6.1 request對象
request對象是JSP編程中最常用的對象,代表的是來自客戶端的請求,它封裝了用戶提交的信息,例如,在FORM表單中填寫的信息等。通過調用request對象相應的方法可以獲取關于客戶請求的信息。它實際上等同于Servlet的HttpServletRequest對象。常用的方法如表4-1所示。
表4-1 request對象和常用方法

下面通過向Web應用添加JSP頁面jspFunction.jsp來演示request對象的方法調用。完整代碼如程序4-24所示。
程序4-24:jspFunction.jsp
<%@ page contentType="text/html; charset=GB2312" %> <%@ page import="java.util.*" %> <HTML> <BODY > <Font size=5> <BR>客戶使用的協議是: <%String protocol=request.getProtocol(); out.println(protocol); %> <BR>獲取接受客戶提交信息的頁面: <%String path=request.getServletPath(); out.println(path); %> <BR>接受客戶提交信息的長度: <% int length=request.getContentLength(); out.println(length); %> <BR>客戶提交信息的方式: <%String method=request.getMethod(); out.println(method); %> <BR>獲取HTTP頭文件中User-Agent的值: <%String header1=request.getHeader("User-Agent"); out.println(header1); %> <BR>獲取HTTP頭文件中accept的值: <%String header2=request.getHeader("accept"); out.println(header2); %> <BR>獲取HTTP頭文件中Host的值: <%String header3=request.getHeader("Host"); out.println(header3); %> <BR>獲取HTTP頭文件中accept-encoding的值: <%String header4=request.getHeader("accept-encoding"); out.println(header4); %> <BR>獲取客戶的IP地址: <%String IP=request.getRemoteAddr(); out.println(IP); %> <BR>獲取客戶端的名稱: <%String clientName=request.getRemoteHost(); out.println(clientName); %> <BR>獲取服務器的名稱: <%String serverName=request.getServerName(); out.println(serverName); %> <BR>獲取服務器的端口號: <% int serverPort=request.getServerPort(); out.println(serverPort); %> <BR>獲取客戶端提交的所有參數的名字: <% Enumeration enum1=request.getParameterNames(); while(enum1.hasMoreElements()) {String s=(String)enum1.nextElement(); out.println(s); } %> <BR>獲取頭名字的一個枚舉: <% Enumeration enum_headed=request.getHeaderNames(); while(enum_headed.hasMoreElements()) {String s=(String)enum_headed.nextElement(); out.println(s); } %> <BR>獲取頭文件中指定頭名字的全部值的一個枚舉: <% Enumeration enum_headedValues=request.getHeaders("cookie"); while(enum_headedValues.hasMoreElements()) {String s=(String)enum_headedValues.nextElement(); out.println(s); } %> <BR> </Font> </BODY> </HTML>
程序說明:程序通過調用request對象的各個方法來演示如何來獲取與請求相關的各種屬性信息,如客戶端地址、協議、主機名稱及HTTP文件頭信息等。
保存程序并重新發布Web應用,打開IE瀏覽器,在地址欄輸入http://localhost:8080/JspBasic/jspFunction.jsp,得到如圖4-17所示的運行結果界面。

圖4-17 利用request對象獲取請求信息
利用表單的形式向服務器端提交信息是Web編程中最常用的方法。下面以一個調查問卷為例來演示如何通過request對象來獲取表單提交的信息。首先生成提交問卷信息的靜態頁面input.html,完整代碼如程序4-25所示。
程序4-25:input.html
<! DOCTYPE HTML PUBLIC "-//w3c//dtd html 4.0 transitional//en"> <html> <head> <meta charset="UTF-8"></head> <body> <form action="getParam.jsp"> 姓名<input type="text" name="UserName"> <br> 選出你喜歡吃的水果: <input type="checkbox" name="checkbox1" value="蘋果"> 蘋果 <input type="checkbox" name="checkbox1" value="西瓜"> 西瓜 <input type="checkbox" name="checkbox1" value="桃子"> 桃子 <input type="checkbox" name="checkbox1" value="葡萄"> 葡萄 <input type="submit" value="提交"> </form> </body></html>頁面運行結果如圖4-18所示。
下面添加獲取客戶端提交的問卷信息的頁面getParam.jsp,完整代碼如程序4-26所示。

圖4-18 調查問卷頁面
程序4-26:getParam.jsp
<%@ page contentType="text/html; charset=UTF-8" %> <HTML> <BODY> 你好, <%! String Name; %> <% request.setCharacterEncoding("UTF-8"); Name=request.getParameter("UserName"); String stars=new String("你喜歡吃的水果有:"); String[] paramValues = request.getParameterValues("checkbox1"); for(int i=0; i<paramValues.length; i++)stars+=paramValues[i]+" "; %> <%=Name%> <br> <%=stars%> </BODY> </HTML>
程序說明:JSP頁面通過調用內置request對象的getParameter方法來獲取被調查者的姓名,對于多值參數(如本例中的checkbox1)則調用getParameterValues方法來返回一個包含所有參數值的數組。
保存程序并重新發布Web應用,打開IE瀏覽器,在地址欄輸入http://localhost:8080/JspBasic/input.html,得到如圖4-18所示的運行結果頁面。在“姓名”文本框輸入姓名信息“張三”,選擇相應的選項并提交后,將得到如圖4-19所示的運行結果頁面。可以看到輸入信息已經成功獲取。

圖4-19 調查問卷運行結果頁面
注意:使用request對象獲取信息要格外小心,要避免使用空對象,否則會出現NullPointerException異常。
下面演示如何獲取下拉列表框提交的信息。首先生成信息提交頁面select.jsp。完整代碼如程序4-27所示。
程序4-27:select.jsp
<HTML> <%@ page contentType="text/html; charset=GB2312" %> <BODY ><Font size=5 > <FORM action="sum.jsp" method=post name=form> <P>選擇計算方式 <Select name="sum" size=2> <Option Selected value="1">計算1到n的連續和 <Option value="2">計算1到n的平方和 <Option value="3">計算1到n的立方和 </Select> <P>選擇n的值: <Select name="n" > <Option value="10">n=10 <Option value="20">n=20 <Option value="30">n=30 <Option value="40">n=40 <Option value="50">n=50 <Option value="100">n=100 </Select> <BR><BR> <INPUT TYPE="submit" value="提交" name="submit"> </FORM> </FONT> </BODY> </HTML>
程序說明:程序以兩個下拉列表框的形式向服務器端提交信息,運行結果如圖4-20所示。

圖4-20 通過Select下拉列表框提交信息
下面生成獲取下拉列表框提交信息的頁面sum.jsp。完整代碼如程序4-28所示。
程序4-28:sum.jsp
<HTML> <%@ page contentType="text/html; charset=GB2312" %> <BODY ><Font size=5 > <% long sum=0; String s1=request.getParameter("sum"); String s2=request.getParameter("n"); if(s1= =null) {s1=""; } if(s2= =null) {s2="0"; } if(s1.equals("1")) {int n=Integer.parseInt(s2); for(int i=1; i<=n; i++) {sum=sum+i; } } else if(s1.equals("2")) {int n=Integer.parseInt(s2); for(int i=1; i<=n; i++) {sum=sum+i*i; } } else if(s1.equals("3")) {int n=Integer.parseInt(s2); for(int i=1; i<=n; i++) {sum=sum+i*i*i; } } %> <P>您的求和結果是<%=sum%> </FONT> </BODY> </HTML>
程序說明:程序通過getParameter(String name)方法來獲取下拉列表框的值。在這里進行了意外處理。因為在客戶不做任何選擇的情況下調用getParameter(String name)方法獲取的參數值為null。另外,由于通過getParameter(String name)只能獲取String類型的值,因此要想獲取整型參數n,必須通過調用靜態方法Integer.parseInt(String name)進行類型轉換。運行結果如圖4-21所示。

圖4-21 程序4-28運行結果頁面
從上面的例子可以看出,通過參數的形式只能傳遞String類型的值,為了更加靈活地在客戶與服務器間傳遞信息,還可以通過屬性對象來傳遞數據,屬性對象可以是任何類型的數據。首先生成向request對象中添加屬性對象的頁面Attribute_send.jsp,完整代碼如程序4-29所示。
程序4-29:Attribute_send.jsp
<%@ page language="java" %> <%@ page import="java.util.ArrayList" %> <! DOCTYPE HTML PUBLIC "-//w3c//dtd html 4.0 transitional//en"> <html> <head> <title>Lomboz JSP</title> </head> <body bgcolor="#FFFFFF"> <% ArrayList ar= new ArrayList(); String he="hello"; ar.add(he); int m=3; ar.add(Integer.toString(m)); request.setAttribute("name", "peter"); request.setAttribute("value", ar); %> <h3>Attribue傳遞參數示例</h3> <JSP:forward page="Attribute_receive.jsp"> </JSP:forward> </body> </html>
程序說明:程序通過調用request對象的setAttribute(String name, java.lang.Object o)方法來給request對象添加兩個屬性對象:其中一個是String類型,另一個是ArrayList類型。然后利用JSP的forward動作將請求傳遞到下一個頁面。
下面生成從request對象中獲取屬性對象的頁面Attribute_receive.jsp,完整代碼如程序4-30所示。
程序4-30:Attribute_receive.jsp
<%@page contentType="text/html; charset=GB2312"%> <%@ page import="java.util.ArrayList" %> <! DOCTYPE HTML PUBLIC "-//w3c//dtd html 4.0 transitional//en"> <html> <head> <title>Lomboz JSP</title> </head> <body bgcolor="#FFFFFF"> <% String name =(String)request.getAttribute("name"); java.util.ArrayList content=new ArrayList(); content =(java.util.ArrayList)request.getAttribute("value"); int m=0; String promt=""; if(content! =null){ String temp=(String)content.get(1); m=Integer.parseInt(temp); promt=(String)content.get(0); } for(int i=0; i<m; i++){ %> <%=promt+" "+name%> <br> <%}%> </body> </html>
程序說明:程序通過調用getAttribute(String name)方法來獲取請求中提交的屬性對象并將其顯示在頁面上,其中,name為屬性對象的名稱。由于對象是以Object類型返回的,因此在使用返回的屬性對象前必須根據屬性對象原來的類型進行強制類型轉換。程序運行結果如圖4-22所示。

圖4-22 通過請求屬性傳遞信息
注意:使用setAttribute方法向request對象添加的屬性對象只能是可以序列化的對象類型數據,而不能是基本類型數據(如int、float等)。
4.6.2 response對象
response對象向客戶端發送數據,如Cookie、HTTP文件頭信息等。response對象代表的是服務器對客戶端的響應,也就是說,可以通過response對象來組織發送到客戶端的信息。但是由于組織方式比較底層,所以不建議一般程序開發人員使用,需要向客戶端發送文字時直接使用out對象即可。
response對象常用的方法有:
(1)addCookie(Cookie cookie)。向response對象添加一個Cookie對象,用來保存客戶端的用戶信息。如下面代碼:
<%cookie mycookie=new Cookie("name", "hyl"); response.addCookie(mycookie); %>
可以通過request對象的getcookies方法獲得這個Cookie對象。
(2)addHeader(String name, String value)。添加HTTP文件頭,該Header將會傳到客戶端,若同名的Header存在,則原來的Header會被覆蓋。
(3)containsHeader(String name)。判斷指定名字的HTTP文件頭是否存在并返回布爾值。
(4)sendError(int sc)。向客戶端發送錯誤信息,常見的錯誤信息包括505:服務器內部錯誤;404:網頁找不到錯誤。如:
response.sendError(response.SC_NO_CONTENT);
(5)setHeader(String name, String value)。設定指定名字的HTTP文件頭的值,若該值存在,則它會被新值覆蓋。如,讓網頁每隔5秒刷新一次。
<% response.setHeader("Refresh", "5"); %>
(6)setContentType (String value)。用來設定返回response對象類型,如
<% response.setContentType("Application/pdf"); %>
(7)sendRedirect(String url)。將請求重新定位到一個新的頁面。在4.3節曾學過如何利用<jsp: forward >將頁面請求轉到一個新的服務器資源上。這里必須了解<jsp: forward >動作組件與sendRedirect(String url)這兩種服務器間重定位方式之間的區別。response. sendRedirect()其實是向瀏覽器發送一個特殊的Header,然后由瀏覽器來做轉向,轉到指定的頁面,所以用sendRedirect()時,瀏覽器的地址欄中可以看到地址的變化;而<jsp:forward page="url"/>則不同,它是直接在服務器端執行重定位的,瀏覽器并不知道,這一點從瀏覽器的地址并不變化可以證實。
下面通過例子來演示如何利用response對象進行重定位。首先生成重定位前的頁面greeting.jsp,完整代碼如程序4-31所示。
程序4-31:greeting.jsp
<%@ page language="java" %> <%@ page import="java.util.*"%> <! DOCTYPE HTML PUBLIC "-//w3c//dtd html 4.0 transitional//en"> <html> <head> <title>Lomboz JSP</title> </head> <body bgcolor="#FFFFFF"> <% Date today =new Date(); int h= today.getHours(); if(h<12)response.sendRedirect("morning.jsp"); else response.sendRedirect("afternoon.jsp"); %> </body> </html>
下面生成重定向的兩個頁面morning.jsp和afternoon.jsp,代碼分別如程序4-32和程序4-33所示。
程序4-32:morning.jsp
<%@ page contentType="text/html; charset=GB2312" %> <%@ page language="java" %> <! DOCTYPE HTML PUBLIC "-//w3c//dtd html 4.0 transitional//en"> <html> <head> <title>Lomboz JSP</title> </head> <body bgcolor="#FFFFFF"> 早上好! </body> </html>
程序4-33:afternoon.jsp
<%@ page contentType="text/html; charset=GB2312" %> <%@ page language="java" %> <! DOCTYPE HTML PUBLIC "-//w3c//dtd html 4.0 transitional//en"> <html> <head> <title>Lomboz JSP</title> </head> <body bgcolor="#FFFFFF"> 下午好! </body> </html>
保存程序并重新發布Web應用,打開IE瀏覽器,在地址欄輸入http://localhost:8080/JspBasic/greeting.jsp,看看會得到什么運行結果。調整系統時間,然后重新請求http://localhost:8080/JspBasic/greeting.jsp,看看又會得到什么運行結果。
注意:仔細觀察瀏覽器的地址欄,可以看到地址欄中的地址發生了變化,這說明頁面的重定位是通過客戶端重新發起請求實現的,這一點是與<jsp:forward>最本質的區別。
4.6.3 session對象
3.7節對于Servlet編程中的會話跟蹤技術進行了深入研究。同樣,JSP提供了內置對象session來支持Web應用程序開發過程中的會話管理。可以通過調用session對象的setAttribute和getAttribute方法來添加或者讀取存儲在會話中的屬性值。
注意:session中保存和檢索的信息不能是int等基本數據類型,而必須是Java Object對象。
下面通過一個防止重復登錄的例子來演示如何利用Session進行Web應用開發。首先生成提交登錄信息的靜態頁面login_session.html。完整代碼如程序4-34所示。
程序4-34:login_session.html
<html> <body> <form action="logcheck.jsp"> 姓名<input type="text" name="UserName"> <input type="submit" value="提交"> </form> </body> </html>
頁面運行時顯示如圖4-23所示。

圖4-23 提交登錄信息的靜態頁面
下面生成進行登錄處理的JSP頁面logcheck.jsp,完整代碼如程序4-35所示。
程序4-35:logcheck.jsp
<%@page contentType="text/html" pageEncoding="UTF-8"%> <%@page import="java.util.*" %> <HTML> <BODY> <% request.setCharacterEncoding("UTF-8"); String promt=new String(); String Name=request.getParameter("UserName"); boolean hasLog=false; ArrayList names= (ArrayList)session.getAttribute("lognames"); if(names==null){ names=new ArrayList(); names.add(Name); session.setAttribute("lognames", names); promt=" 歡迎登錄!你的名字已經寫入session "; }else{ for(int i=0; i<names.size(); i++){ Stringtemp=(String)names.get(i); if(temp.equals(Name)){ promt="你已經登錄"; hasLog=true; break; } } if(! hasLog){ names.add(Name); session.setAttribute("lognames", names); promt=" 歡迎登錄!你的名字已經寫入session "; } } %> <br> <%=promt%> </BODY> </HTML>
程序說明:程序首先調用request.getParameter方法獲取提交的用戶名稱信息,然后調用session.getAttribute方法獲取已登錄人員名稱列表,從列表中查找此用戶是否已經登錄。如果尚未登錄,則將用戶名稱添加到一個存儲已登錄人員名稱的列表ArrayList中,并通過調用session.setAttribute方法更新會話中保存的已登錄人員名稱列表信息;否則,提示用戶已經登錄。
保存程序并重新發布Web應用,打開IE瀏覽器,在地址欄輸入http://localhost:8080/JspBasic/login_session.html,得到如圖4-23所示的運行結果頁面。在“姓名”文本框中輸入“李四”,單擊“提交”按鈕提交頁面信息,得到如圖4-24所示運行結果頁面,提示已將登錄者的姓名寫入了session。單擊瀏覽器工具欄的“后退”按鈕,在“姓名”文本框中重新輸入“李四”,單擊“提交”按鈕提交頁面信息,由于已將登錄者的姓名寫入了session,因此系統將提示用戶已經登錄,運行結果如圖4-25所示。

圖4-24 第一次登錄成功運行結果頁面

圖4-25 重復登錄運行結果頁面
4.6.4 application對象
application對象代表運行在服務器上的Web應用程序,相當于Servlet上下文,一旦創建,除非服務器關閉,否則將一直保持下去。
application常用的方法如表4-2所示。
表4-2 application對象的常用方法

下面通過一個JSP頁面來演示application對象的常用方法的使用。完整代碼如程序4-36所示。
程序4-36:application.jsp
<%@ page contentType="text/html; charset=gb2312"%> <html> <head><title>application對象示例</title><head> <body> <% out.println("Java Servlet API Version "+application.getMajorVersion() +"."+application.getMinorVersion()+"<br>"); out.println("application.jsp's MIME type is:"+application.getMimeType("application.jsp") +"<br>"); out.println("URL of 'application.jsp' is: "+application.getResource("/application.jsp")+"<br>"); out.println("getServerInfo()="+application.getServerInfo()+"<br>"); out.println(application.getRealPath("application.jsp")); application.log("Add a Record to log_file"); %> </body> </html>
程序說明:通過調用application對象的各種方法來獲取application對象的各種屬性信息,其中getMajorVersion()用來獲取服務器支持的Servlet版本,getMimeType()用來獲取組件的MIME類型,getServerInfo()用來獲取服務器版本信息等。程序運行結果如圖4-26所示。

圖4-26 利用application獲取服務器信息
在application對象中也可以存儲屬性信息,由于application對象在整個Web應用的過程中都有效,因此在application對象中最適合放置整個應用共享的信息。但由于application對象生命周期長,因此對于存儲在application對象中的屬性對象要及時清理,以避免占用太多的服務器資源。下面以一個網頁計數器的例子來說明如何在application對象中存儲屬性信息,網頁計數器JSP頁面代碼如程序4-37所示。
程序4-37:counter.jsp
<%@ page contentType="text/html; charset=gb2312"%> <! DOCTYPE HTML PUBLIC "-//w3c//dtd html 4.0 transitional//en"> <html> <head> <title>網頁計數器</title> </head> <body> <% if (application.getAttribute("counter")= =null) application.setAttribute("counter", "1"); else{ String times=null; times=application.getAttribute("counter").toString(); int icount=0; icount=Integer.valueOf(times).intValue(); icount++; application.setAttribute("counter", Integer.toString(icount)); } %> 您是第<%=application.getAttribute("counter")%>位訪問者! </body> </html>
程序說明:為實現網頁計數功能,向application對象中添加一個名為counter的屬性。每次網頁被訪問時,通過調用application對象的getAttribute方法獲取網頁計數器的值,通過application對象的setAttribute方法將網頁計數器更新后的值重新添加到application對象中。由于Application對象的生命周期是整個Web應用程序的生命周期,因此它可以準確地記錄Web應用運行期間網頁被訪問的次數。
打開瀏覽器,在地址欄中輸入http://localhost:8080/JspBasic/counter.jsp,可以得到如圖4-27所示頁面。不斷刷新頁面,可以看到網頁計數不斷更新。即使關掉瀏覽器,再重新打開運行,網頁計數器仍然準確地記錄著頁面被訪問的次數。這是因為存儲在application對象中的網頁計數變量在服務器運行期間一直存在。

圖4-27 網頁計數器
4.6.5 out對象
out對象代表了向客戶端發送數據的對象,與response對象不同,通過out對象發送的內容將是瀏覽器需要顯示的內容,是文本一級的,可以通過out對象直接向客戶端寫一個由程序動態生成HTML文件。常用的方法除了print和println之外,還包括clear、clearBuffer、flush、getBufferSize和getRemaining,這是因為out對象內部包含了一個緩沖區,所以需要一些對緩沖區進行操作的方法。
4.6.6 exception對象
exception對象用來處理JSP文件在執行時所有發生的錯誤和異常,有三個常用方法。
(1)getMessage():返回錯誤信息。
(2)printStackTrace():以標準錯誤的形式輸出一個錯誤和錯誤的堆棧。
(3)toString():以字符串的形式返回一個對異常的描述。
注意:必須在<%@ page isErrorPage="true" %>的情況下才可以使用Exception對象。
下面通過一個示例來演示exception對象在處理JSP錯誤和異常情況下的應用。首先生成一個拋出意外的JSP頁面makeError.jsp,完整代碼如程序4-38所示。
程序4-38:makeError.jsp
<%@ page errorPage="exception.jsp" %> <HTML> <HEAD> <TITLE>錯誤頁面</TITLE> </HEAD> <BODY> <% String s = null; s.getBytes(); //這將拋出NullPointException異常 %> </BODY> </HTML>
下面生成利用exception對象處理JSP錯誤和異常的頁面exception.jsp,完整代碼如程序4-39所示。
程序4-39:exception.jsp
<%@ page contentType="text/html; charset=gb2312"%> <%@ page isErrorPage="true" %> <html> <body bgcolor="#ffffc0"> <h1>錯誤信息顯示</h1> <br>An error occured in the bean. Error Message is: <br> <%= exception.getMessage() %><br> <%= exception.toString()%><br> </body> </html>
程序說明:打開瀏覽器,在地址欄中輸入http://localhost:8080/JspBasic/makeError.jsp,可以得到如圖4-28所示的頁面。程序makeError.jsp中將字符串s置為null,然后調用其getByte方法,勢必拋出異常,由于通過語句<%@ page errorPage="exception.jsp" %>定義了此頁面的錯誤處理頁面為exception.jsp,因此錯誤信息導向頁面exception.jsp。在exception.jsp中執行語句<%@ page isErrorPage="true" %>,因此可以調用內置對象exception的各種方法來顯示錯誤信息。

圖4-28 利用exception對象顯示錯誤信息
4.6.7 內置對象的作用范圍
任何一個Java對象都有其作用域范圍,JSP的內置對象也不例外。歸納起來,共有四種范圍:
(1)page。page范圍內的對象僅在JSP頁面范圍內有效。超出JSP頁面范圍,則對象無法獲取。
(2)request。客戶向服務器發起的請求稱為request(請求)。由于采用<jsp:forward>和response.sendRedirect()等重定位技術,客戶端發起的request請求可以跨越若干個頁面。因此定義為request范圍的JSP內置對象可以在request范圍內的若干個頁面內有效。
(3)session。客戶端與服務器的交互過程,稱為session(會話)。在客戶端與服務器的交互過程中,可以發起多次請求,一個session可以包含若干個request。定義為session范圍的JSP內置對象可以跨越若干個request范圍有效。
(4)application。部署在服務器上的Web應用程序與所有客戶端的交互過程,稱為application。一個application可以包含若干個session。定義為application范圍的JSP內置對象可以在跨越若干個session的范圍內有效。
綜上所述,一個Web服務器上可以部署多個application,一個application可以包含多個session,一個session可以包含若干個request,一個request可以包含若干個page。以一個聊天室Web應用為例,作為部署在服務器上的一個application,每個加入到聊天室的客戶與服務器間的交互過程即聊天過程為一個session。在客戶A聊天過程中,它既可以向客戶B發送信息,又可以向客戶C發送信息,客戶A向客戶B和客戶C發送信息的過程都是一個request。
JSP常見內置對象及其對應的Java類型和作用范圍如表4-3所示。
表4-3 JSP內置對象對應類型及作用范圍

- Spring 5企業級開發實戰
- MySQL數據庫應用與管理 第2版
- React Native Cookbook
- HTML5+CSS3基礎開發教程(第2版)
- Mastering Rust
- Instant RubyMotion App Development
- Getting Started with Laravel 4
- 區塊鏈技術進階與實戰(第2版)
- JavaScript應用開發實踐指南
- Android應用開發深入學習實錄
- Tableau Desktop可視化高級應用
- 石墨烯改性塑料
- Learning Image Processing with OpenCV
- Java程序設計實用教程(第2版)
- HTML5 and CSS3:Building Responsive Websites