From Gossip@caterpillar

JSP/Servlet: request

 

 


request隱含物件會轉換為javax.servlet.http.HttpServletRequest型態的物件,HttpServletRequest物件是有關於用戶端所發出的請求之物件,只要是有關於用戶端請求的資訊,都可以藉由它來取得,例如請求標頭、請求方法、請求參數、使用者IP等等資訊。

對於每一個用戶請求,容器都會為它產生一個HttpServletRequest物件,在Servlet的doService()或doGet()、 doPost()等方法中,只有HttpServletRequest物件被認定為執行緒安全的(Thread-safe)。

下面這個例子可以讓您取得使用者所發出的請求參數:

  • requestDemo.jsp
<%@page contentType="text/html;charset=Big5" 
         import="java.util.*"%>
<html>
<head><title>取得請求參數</title></head>
<body>
<h1>取得請求「參數=值」</h1>
    <%
        Enumeration params = request.getParameterNames();
        while(params.hasMoreElements()) {
            String param = (String) params.nextElement();
            out.println(param + " = " +
                 request.getParameter(param) + "<br>");
        }
    %>
</body>
</html>

getParameterNames()可以讓您取得用戶端所發出的請求參數名稱,而getParameter()可以讓您指定請求參數名稱,以取得對應的設定值,如果這個JSP名稱是requestdemo.jsp,而您在瀏覽器中鍵入:
http://localhost:8080/myjsp/requestDemo.jsp?name=justin&nick=caterpillar

也就是說您發出的請求「參數=值」為name=justin以及nick=caterpillar,則網頁的執行結果是:
<html>
<head><title>取得請求參數</title></head>
<body>
<h1>取得請求「參數=值」</h1>
    nick = caterpillar<br>
    name = justin<br>
</body>
</html>
 

當然實際應用上,並不是要求用戶直接在網址列上鍵入以上的參數,而是透過表單來傳送參數,如果表單中的欄位發送的是中文,則在取得請求參數之前,必須先指定發送過來的請求編碼,例如若是Big5中文的話,則必須先執行以下這行:
request.setCharacterEncoding("Big5");

當然每一次都要先執行這行的話有些麻煩,建議可以將這行放在 Filter 中。

與用戶端發出的訊息相關的,我們都可以透過request(HttpServletRequest)物件來取得,例如下面的程式可以取得一些用戶端的訊息:

  • requestDemo.jsp
<%@page contentType="text/html;charset=big5"  
import="java.util.*"%>
<html>
<head><title>取得用戶端資訊</title></head>
<body>
<h1>取得用戶端資訊</h1>
請求的伺服器: <%= request.getServerName() %> <br>
使用協定: <%= request.getProtocol() %> <br>
請求方法: <%= request.getMethod() %> <br>
請求的埠號: <%= request.getServerPort() %> <br>
Context路徑: <%= request.getContextPath() %> <br>
Servlet路徑: <%= request.getServletPath() %> <br>
URI路徑: <%= request.getRequestURI() %> <br>
查詢字串: <%= request.getQueryString() %> <br>

<br>

使用者主機IP: <%= request.getRemoteAddr() %> <br>
使用者使用埠號: <%= request.getRemotePort() %>
</body>
</html>

如果我們還是使用以下的請求方式:
http://localhost:8080/myjsp/requestDemo.jsp?name=justin&nick=caterpillar

則JSP網頁會傳回以下的訊息,以下直接顯示網頁上的文字:
取得用戶端資訊 
請求的伺服器: localhost 
使用協定: HTTP/1.1
請求方法: GET 
請求的埠號: 8080
Context路徑: /myjsp
Servlet路徑: /requestdemo.jsp
URI路徑: /myjsp/requestdemo.jsp 
查詢字串: name=justin&nick=caterpillar
 
使用者主機IP: 127.0.0.1
使用者使用埠號: 1060

關於更多request(HttpServletRequest)物件可用的方法,可以查詢Servlet API Javadocs中有關於HttpServletRequest的部份(Tomcat安裝後可以在安裝目錄中的webapps/tomcat- docs/servletapi/index.html 查詢到)。