官术网_书友最值得收藏!

5.2 request內置對象

request對象用來包含客戶端提交的各種信息。當客戶端請求一個JSP頁面時,JSP引擎會將客戶端的請求信息封裝在這個request對象中,request對象調用相應的方法就可以獲取對應的封裝信息了。該對象中封裝的請求信息主要包括以下3部分。

? 請求的HTTP協議的傳送文件頭信息。

? 提交請求的客戶端和服務器端信息。

? 用戶提交的表單信息。

表5.2中列舉了request對象中常用的方法。

表5.2 request對象中常用方法

5.2.1 獲取用戶提交的表單信息

request對象最主要的一個作用就是用來封裝用戶提交的表單信息,然后通過如下的兩個方法來獲取用戶提交的表單信息。

? getParameter(String name):根據參數名獲取唯一的參數值。

? getParameterValues(String name):根據參數名獲取參數數組。

【實例5-1】接收用戶提交的信息。

    01  <%@ page contentType="text/html;charset=GB2312" %>
    02  <HTML>
    03  <BODY >
    04     <FORM action="getinfo.jsp" method=post name=form>
    05         姓名:<INPUT type="text" name="name">
    06         <P>您熟悉的語言:</P>
    07  <P>
    08  <!--供選取語言類型的復選框-->
    09  <INPUT type="checkbox" name=box value="JSP">JSP
    10  <INPUT type="checkbox" name=box value="PHP">PHP
    11  <INPUT type="checkbox" name=box value="ASP.NET">ASP.NET
    12  </P>
    13         <INPUT TYPE="submit" value="Enter" name="submit">
    14     </FORM>
    15  </FONT>
    16  </BODY>
    17  </HTML>

【代碼說明】在實例5-1頁面的第9行定義了提交單個值參數的文本框,第10~11行定義了提交多個值參數的復選框。并通過第4行的<form>表單提交給getinfo.jsp頁面。

【運行結果】在如圖5.1所示頁面中輸入用戶的姓名及用戶所熟悉的語言。

getinfo.jsp頁面的具體代碼如下:

    01  <%@ page contentType="text/html;charset=GB2312" %>
    02  <HTML>
    03  <BODY >
    04     <%String textContent=request.getParameter("name"); //獲取用戶提交的姓名信息
    05     %>
    06  <BR>
    07     <%=textContent%>
    08  <P> 熟悉的語言是:
    09     <%
    10     String box[] = request.getParameterValues("box"); //獲取用戶提交的熟悉的語言信息
           并進行遍歷
    11     for(int i = 0; i < box.length ; i++)
    12     out.println("<LI>" + box[i] + "</LI>");             //顯示用戶提交的復選框的選項
           內容
    13     %>
    14  <BR>
    15  </FONT>
    16  </BODY>
    17  </HTML>

【代碼說明】該頁面的第4 行使用getParameter()方法獲取單值的參數,無論用戶提交的信息是什么類型的,該方法的返回值都將是String類型,而第10行的getParameterValues ()方法則用來獲取多值的參數,該方法的返回值將是一個String類型的數組。

【運行結果】該頁面接收用戶提交的參數后將如圖5.2所示。

圖5.1 提交信息的頁面

圖5.2 接收用戶提交的參數

5.2.2 獲取服務器端和客戶端信息

使用request對象還可以獲取提交請求的客戶端信息及接收請求的服務器端信息,這些獲取信息的方法如下所示。

? getProtocol():獲取客戶端向服務器端傳送數據所依據的協議名稱。

? getContentLength():獲取HTTP請求的長度。

? getMethod():獲取客戶端提交信息的方式,如POST或者GET。

? getServletPath():獲取客戶端提交信息頁面的路徑。

? getRemoteAddr():獲取客戶端的IP地址。

? getRemoteHost():獲取客戶端計算機的名稱。

? getServerName() :獲取服務器的名稱。

? getServerPort():獲取服務器的端口號。

【實例5-2】獲取客戶端和服務器的信息。

    01  <%@ page contentType="text/html;charset=GB2312"%>
    02  <HTML>
    03  <BODY>
    04  <Font size=2> <BR>
    05  客戶使用的協議是:
    06  <%
    07       String protocol=request.getProtocol();        //獲取客戶端使用的協議的版本信息
    08       out.println(protocol);
    09   %> <BR>
    10  獲取接受客戶提交信息的頁面:
    11  <%
    12      String path=request.getServletPath();          //獲取客戶端提交信息的頁面路徑
    13      out.println(path);
    14   %> <BR>
    15  接受客戶提交信息的長度:
    16  <%
    17      int length=request.getContentLength();         //獲取客戶端提交請求的信息的長度
    18      out.println(length);
    19   %> <BR>
    20  客戶提交信息的方式:
    21  <%
    22      String method=request.getMethod();             //獲取客戶端提交信息的方式
    23      out.println(method);
    24   %> <BR>
    25  獲取客戶的IP地址:
    26  <%
    27      String IP=request.getRemoteAddr();             //獲取客戶端的IP地址
    28      out.println(IP);
    29   %> <BR>
    30  獲取客戶機的名稱:
    31  <%
    32      String clientName=request.getRemoteHost();     //獲取客戶端計算機的名稱
    33      out.println(clientName);
    34   %> <BR>
    35  獲取服務器的名稱:
    36  <%
    37      String serverName=request.getServerName();     //獲取服務器的名稱
    38      out.println(serverName);
    39   %> <BR>
    40  獲取服務器的端口號:
    41  <%
    42      int serverPort=request.getServerPort();        //獲取服務器的端口號
    43      out.println(serverPort);
    44   %> <BR>
    45  </Font>
    46  </BODY>
    47  </HTML>

【代碼說明】該頁面的第7行使用getProtocol()方法獲取客戶端使用的協議名稱和版本,第12行使用getServletPath()方法獲取接受客戶提交信息頁面的路徑,第17行使用getContentLength()方法獲取客戶端提交信息的長度,第22 行使用getMethod()方法獲取客戶端提交請求的方式,第27 行使用getRemoteAddr()方法獲取客戶端的IP地址,第32行使用getRemoteHost()方法獲取客戶端計算機的名稱,如果得不到計算機名稱就將返回客戶端計算機的IP地址,第37行使用getServerName()方法獲取服務器的名稱,如果得不到服務器名稱就將返回服務器的IP地址,第42 行使用getServerPort()方法獲取服務器的端口號。

圖5.3 顯示獲取的客戶端和服務器端信息

【運行結果】實例5-2的JSP頁面的執行結果如圖5.3所示。

5.2.3 獲取HTTP協議的傳送文件頭信息

使用request對象還可以獲取提交信息時所使用的HTTP協議的傳送文件頭信息。HTTP協議采用了請求/響應模型??蛻舳讼蚍掌靼l送一個請求,請求的頭信息包含請求的方法、URI、協議版本、包含請求修飾符、客戶信息及內容類似于MIME的消息結構。通過如下兩個方法可以獲取HTTP協議中的頭信息。

? getHeaders(String name):可以獲取傳送請求信息的HTTP協議中指定的頭信息。

? getHeaderNames():可以返回所有傳送文件頭信息的名字。

【實例5-3】獲取HTTP頭信息。

    01  <%@ page contentType="text/html;charset=GB2312"%>
    02  <%@ page import="java.util.*"%>
    03  <HTML>
    04  <BODY>
    05  <Font size=2> <BR>
    06  獲取HTTP頭文件中User-Agent的值:
    07  <%
    08      String header1=request.getHeader("User-Agent");   //獲取HTTP頭信息
                User-Agent的值
    09      out.println(header1);
    10   %> <BR>
    11  獲取HTTP頭文件中accept的值:
    12  <%
    13      String header2=request.getHeader("accept");  //HTTP頭信息User-Agent的值
    14      out.println(header2);
    15   %> <BR>
    16  獲取HTTP頭文件中Host的值:
    17  <%
    18      String header3=request.getHeader("Host");         //獲取HTTP頭信息Host的值
    19      out.println(header3);
    20   %> <BR>
    21  獲取HTTP頭文件中accept-encoding的值:
    22  <%
    23     String header4=request.getHeader("accept-encoding");//獲取HTTP頭信息
            accept-encoding的值
    24      out.println(header4);
    25   %> <BR>
    26  獲取頭名字的一個枚舉:
    27  <%  //獲取HTTP所有頭信息的關鍵字,并使用枚舉對象進行遍歷
    28      Enumeration enum_headed=request.getHeaderNames();
    29      while(enum_headed.hasMoreElements())
    30      {String s=(String)enum_headed.nextElement();
    31      out.println(s);
    32      }
    33   %> <BR>
    34  獲取頭文件中指定頭名字的全部值的一個枚舉:
    35  <%  //獲取HTTP頭信息cookie的全部值,并使用枚舉對象進行遍歷
    36      Enumeration enum_headedValues=request.getHeaders("cookie");
    37      while(enum_headedValues.hasMoreElements())
    38      {String s=(String)enum_headedValues.nextElement();
    39      out.println(s);
    40      }
    41   %> <BR>
    42  </Font>
    43  </BODY>
    44  </HTML>

【代碼說明】該頁面的第8行、第13行、第18行、第23行分別調用getHeaders()方法根據不同的頭信息關鍵字獲取對應的頭信息。第28 行調用getHeaderNames()方法獲取包含全部頭信息關鍵字的一個枚舉對象,并使用第29~32 行的while循環對該枚舉對象進行遍歷。第36行獲取“cookie”關鍵字所對應的頭信息并將其封裝成一個枚舉對象,使用第37~40行的while循環對其進行遍歷。

【運行結果】實例5-3的JSP頁面的執行結果如圖5.4所示。

圖5.4 顯示獲取的HTTP頭信息

5.2.4 request中保存和讀取共享數據

request對象不僅能夠封裝請求信息,而且還可以保存和讀取某一范圍內的共享數據。其實request本身就代表了一個范圍,這個范圍包括了提交信息的頁面和接收提交信息的頁面。request對象中定義了一對方法getAttribute(String name)和setAttribute(String name,Object object),用來在request對象中讀取和保存共享數據。

說明

保存的數據必須是Object的子類,也就是說必須是類的對象,Java中的基本數據類型不能夠直接保存,必須封裝成對應的封裝類。

【實例5-4】保存和讀取共享數據。

    01  <%@ page contentType="text/html;charset=GB2312" %>
    02  <HTML>
    03  <BODY >
    04     <%
    05       request.setAttribute("name","sun");      //將共享信息存儲在request對象中
    06        %>
    07     <jsp:forward page="readAttribute.jsp" />
    08  </FONT>
    09  </BODY>
    10  </HTML>

【代碼說明】該頁面的第5行使用setAttribute()方法將共享數據保存到request對象中,然后在第7行中使用<jsp:forward>動作指令轉向readAttribute.jsp頁面。

readAttribute.jsp頁面的具體代碼如下:

    01  <%@ page contentType="text/html;charset=GB2312" %>
    02  <HTML>
    03  <BODY >
    04     從request中讀取的共享信息是:
    05     <%
    06       out.println(request.getAttribute("name"));   //從request對象中獲取共享信息并
顯示
    07     %>
    08  </FONT>
    09  </BODY>
    10  </HTML>

【代碼說明】該頁面的第6行使用getAttribute()方法來獲取存儲在request中的共享數據。

【運行結果】在瀏覽器中輸入訪問saveAttribute.jsp頁面的URL地址后,頁面將轉向readAttribute.jsp頁面,并讀取request對象中的共享數據并顯示在頁面上,最后運行結果如圖5.5所示。

圖5.5 讀取并顯示request對象中的共享數據

5.2.5 正確接收用戶提交的中文信息

在實例5-1 中,如果用戶在輸入姓名的文本框中輸入中文字符,那么提交后的頁面將顯示什么內容呢?讀者可以自己執行一下,看看是否顯示如圖5.6所示的亂碼信息。

為什么會出現這種情況呢?這是因為JSP頁面默認的接收字符集是英文,這里不要跟<%@ page contentType="text/html;charset=GB2312" %>指令中的“charset”屬性混淆了,該屬性是用來設置返回給瀏覽器的頁面中所采用的字符集的,與接收提交信息的字符集沒有任何關系。因此,要正確接收用戶提交的中文信息,必須重新設置頁面的接收字符集,通過調用request對象的setCharacterEncoding(String character)方法就可以實現該功能。下面修改實例5-1中的getinfo.jsp頁面的代碼如下:

    01  <%@ page contentType="text/html;charset=GB2312" %>
    02  <HTML>
    03  <BODY >
    04     <%
    05  request.setCharacterEncoding("GB2312");           //設置接受信息時使用GB2312字符集
    06  String textContent=request.getParameter("name"); //獲取用戶提交的姓名信息,可接收中
文輸入
    07     %>
    08  <BR>
    09     <%=textContent%>
    10  <P> 熟悉的語言是:
    11     <%
    12     //獲取并遍歷顯示提交的復選框的信息
    13     String box[]=request.getParameterValues("box");
    14     for(int i=0; i<box.length ; i++)
    15     out.println("<LI>" + box[i] + "</LI>");
    16     %>
    17  <BR>
    18  </FONT>
    19  </BODY>
    20  </HTML>

在該頁面中的第5 行調用setCharacterEncoding()方法來設置頁面的接收字符集為中文字符集,這里需要注意的是,該方法必須在頁面中所有的接收參數的方法執行之前被調用。修改后的頁面就可以正確接收用戶提交的中文信息了。修改后頁面的執行結果如圖5.7所示。

圖5.6 亂碼顯示用戶輸入的中文信息

圖5.7 正確顯示用戶提交的中文信息

主站蜘蛛池模板: 防城港市| 青河县| 公主岭市| 汝州市| 萨嘎县| 溧水县| 增城市| 石河子市| 宁蒗| 肃北| 肃北| 台南县| 望都县| 锦州市| 怀化市| 武冈市| 贵州省| 勐海县| 疏附县| 河西区| 榆社县| 肃宁县| 嫩江县| 鄂伦春自治旗| 莱芜市| 韩城市| 蕉岭县| 永吉县| 千阳县| 四会市| 昆山市| 清河县| 奉节县| 文成县| 黔西县| 武城县| 专栏| 来宾市| 汾西县| 天门市| 增城市|