天天看點

hualinux servlet 2.13:ServletRequest 接口及其子接口

目錄

​​一、知識點​​

​​二、例子​​

​​2.1 例1 擷取請求參數​​

​​2.1.1 代碼​​

​​2.1.2 測試結果​​

​​2.2 例2 根據請求參數的名字,傳回請求參數對應的字元串數組​​

​​2.2.1 在index.jsp編寫表單​​

​​2.2.2 修改Login.java代碼​​

​​2.2.3 測試結果​​

​​2.3 例3 請求參數傳回枚舉及Map對象​​

​​2.3.1 在Login.java添加代碼​​

​​2.3.2 測試結果​​

​​三、HttpServletRequest(ServletReques子接口)​​

​​3.1 例子:擷取用戶端的URI​​

​​3.1.1 實作代碼​​

​​3.1.2 測試結果​​

本章講的是servet請求,也比較重要的章節,ServletRequest看名字就知道是處理請求的。

一、知識點

如何在Serlvet中擷取請求資訊:

1.Servlet 的service()方法用于應答請求:因為每次請求都會調用service()方法

public void service(ServletRequest request, ServletResponse response )

throws ServletException, IOException

ServletRequest:封裝了請求資訊。可以從中擷取到任何的請求資訊。

ServletResponse:封裝了響應資訊,如果想給使用者什麼響應,具體可以使用該接口的方法實作.

這兩個接口的實作類都是伺服器給予實作的,并在伺服器調用service方法時傳入。

2.ServletRequest: 封裝了請求資訊。可以從中擷取到任何的請求資訊。

1)擷取請求參數:

String getParameter(string name):根據請求參數的名字,近回參數值。

若請求參數有多個值(例如checkbox),該方法隻能擷取到第一個送出的值。

String[] getParametervalues(string name): 根據請求參數的名字,近回請求參數對應的字元串數組。

Enumeration getParameterNames():傳回參數名對應的Enumeration對象,

類似于Serv1etConfig(或ServletContext)的getInitParameterNames()方法。

Map getParameterMap(): 傳回請求參數的鍵值對: key: 參數名, value: 參數值, String 數組類型。

2)擷取請求的URL:

HttpServletRequest httpServletRequest = (HttpServ1etRequest) request;

String requestURI = httpServ1etRequest.getRequestURI();

System.out.println(requestURI); // /day_ 29/1oginServ1et

3)擷取請求方式:

String method = httpServletRequest.getMethod();

System.out.print1n(method); //GET

4)若是-一個GET請求,擷取請求參數對應的那個字元串,即?後的那個字元串.

String queryString = httpServletRequest.getQueryString();

//user=hua&password=123456&interesting=game&interesting=par

System.out.print1n(querystring);

5)擷取請求的Serlvet的映射路徑

​String servletPath = httpServletRequest.getServletPath(); System.out.print1n(servletPath); // /loginServ1et​

6)和attribute相關的幾個方法;

3. HttpServletRequest:是SerlvetRequest的子接口。針對于HTTP請求所定義。裡邊包含了大量擷取HTTP請求相關的方法。

更多友善請檢視​​https://javaee.github.io/javaee-spec/javadocs/​​中的ServletRequest接口

二、例子

下面所有例子都一樣,src下建立一個Login類并繼承Servlet接口,原始代碼如下:

import javax.servlet.*;
import java.io.IOException;

public class Login implements Servlet {
    @Override
    public void init(ServletConfig servletConfig) throws ServletException {
        
    }

    @Override
    public ServletConfig getServletConfig() {
        return null;
    }

    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {

    }

    @Override
    public String getServletInfo() {
        return null;
    }

    @Override
    public void destroy() {

    }
}      

web.xm配置添加一個路由映射,如下:

<servlet>

    <servlet-name>login</servlet-name>

    <servlet-class>Login</servlet-class>

</servlet>

<servlet-mapping>

    <servlet-name>login</servlet-name>

    <url-pattern>/login</url-pattern>

</servlet-mapping>

整個web.xlm配置如下:這個配置包括了上一章的web.xml配置

<servlet>
        <servlet-name>login</servlet-name>
        <servlet-class>Login</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>login</servlet-name>
        <url-pattern>/login</url-pattern>
    </servlet-mapping>

    <servlet>
        <servlet-name>t1</servlet-name>
        <servlet-class>T1</servlet-class>
        <!-- 在<servlet>下面是它的二級配置-->
        <init-param>
            <param-name>user</param-name>
            <param-value>hua</param-value>
        </init-param>
        <init-param>
            <param-name>pwd</param-name>
            <param-value>123</param-value>
        </init-param>
    </servlet>

    <!-- 這個是在<servlet>外面,不是它的二級配置-->
    <context-param>
        <param-name>ctx</param-name>
        <param-value>this is context-param value </param-value>
    </context-param>
    <servlet-mapping>
        <servlet-name>t1</servlet-name>
        <url-pattern>/t1</url-pattern>
    </servlet-mapping>      

2.1 例1 擷取請求參數

string getParameter(String name): 根據請求參數的名字,傳回參數值。

若請求參數有多個值(例如checkbox),該方法隻能擷取到第一個送出的值。

2.1.1 代碼

Login.java其中一個代碼修改如下:

@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
    String user = servletRequest.getParameter("user");
    String pwd = servletRequest.getParameter("pwd");
    System.out.println(user+":"+pwd);
}      

2.1.2 測試結果

根據HTML知識,要用Get方式傳參用“?參數名=值”或“?參數名1=值1&參數名2=值2..”

打開浏覽器尾部添加 “/login?user=hua&pwd=123”,我這裡是

​​http://localhost:8080/myservlet_war_exploded/login?user=hua&pwd=123​​

看到空白頁之後,再檢視ide輸出視窗為:

hualinux servlet 2.13:ServletRequest 接口及其子接口

2.2 例2 根據請求參數的名字,傳回請求參數對應的字元串數組

什麼情況下才傳回 數組呢?多選就是了

 String[] getParameterValues(String name):根據請求參數的名字,傳回請求參數對應的字元串數組。

2.2.1 在index.jsp編寫表單

在index.jsp編寫表單,代碼如下:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
  <head>
    <title>測試</title>
  </head>
  <body>
    <form action="login" method="post">
      user: <input type="text" name="user" />
      pwd: <input type="password" name="pwd" />
      <br>
      愛好:<br>
      <input type="checkbox" name="interesting" value="reading" />閱讀
      <input type="checkbox" name="interesting" value="game" />遊戲
      <input type="checkbox" name="interesting" value="party" />派對
      <input type="checkbox" name="interesting" value="shopping" />購物
      <input type="checkbox" name="interesting" value="sport" />體育
      <input type="checkbox" name="interesting" value="TV" />電視<br/>
      <input type="submit" style="margin-left: 390px" value="送出"/>
    </form>
  </body>
</html>      

運作tomcat,自動跳出浏覽器,我的是火狐,效果圖如下:

hualinux servlet 2.13:ServletRequest 接口及其子接口

2.2.2 修改Login.java代碼

修改Login.java代碼如下:

@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
    String user = servletRequest.getParameter("user");
    String pwd = servletRequest.getParameter("pwd");
    System.out.println(user+":"+pwd);

    String[] interestings =servletRequest.getParameterValues("interesting");
    for(String interest: interestings){
        System.out.println("-->"+interest);
    }
}      

2.2.3 測試結果

重新開機tomcat,在打開浏覽器輸入下面内容:

hualinux servlet 2.13:ServletRequest 接口及其子接口

點“送出”,ide顯示結果為:

hualinux servlet 2.13:ServletRequest 接口及其子接口

2.3 例3 請求參數傳回枚舉及Map對象

Enumeration getParameterNames(): 傳回參數名對應的Enumeration對象,

類似于ServletConfig(或ServletContext)的getInitPar ameterNames()方法。

Map getParameterMap(): 傳回請求參數的鍵值對: key: 參數名, value: 參數值,string數組類型.

2.3.1 在Login.java添加代碼

在Login.java修改如下:

import java.util.Arrays;
import java.util.Enumeration;
import java.util.Map;

@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
    String user = servletRequest.getParameter("user");
    String pwd = servletRequest.getParameter("pwd");
    System.out.println(user+":"+pwd);

    String[] interestings =servletRequest.getParameterValues("interesting");
    for(String interest: interestings){
        System.out.println("-->"+interest);
    }

    Enumeration<String> names = servletRequest.getParameterNames();
    while (names.hasMoreElements()){
        String name = names.nextElement();
        String val = servletRequest.getParameter(name);
        System.out.println("^^"+name+": "+val);
    }

    Map<String,String[]> map = servletRequest.getParameterMap();
    for (Map.Entry<String,String[]> entry : map.entrySet()) {
        System.out.println("**"+entry.getKey()+": "+ Arrays.asList(entry));
    }
}      

2.3.2 測試結果

重新開機tomcat,在打開浏覽器輸入下面内容:

hualinux servlet 2.13:ServletRequest 接口及其子接口

點“送出”,ide顯示結果為:

hualinux servlet 2.13:ServletRequest 接口及其子接口

三、HttpServletRequest(ServletReques子接口)

HttpServletRequest子接口更針對Http請求方面,封裝了比servlet更多的http方面的方法

HttpServletRequest對象代表用戶端的請求,當用戶端通過HTTP協定通路伺服器時,HTTP請求頭中的所有資訊都封裝在這個對象中,通過這個對象提供的方法,可以獲得用戶端請求的所有資訊。

3.1 例子:擷取用戶端的URI

3.1.1 實作代碼

在Loin.java類中的service()方法直接添加如下内容

//這個是在頂部添加的導入類
import javax.servlet.http.HttpServletRequest;


//HttpServletRequest是ServletRequest的子接口,可以強轉為ServletRequest接口
HttpServletRequest httpServletRequest=(HttpServletRequest) servletRequest;
String requestURI = httpServletRequest.getRequestURI();
System.out.println(requestURI);      

3.1.2 測試結果

重新開機tomcat,在打開浏覽器輸入下面内容:

hualinux servlet 2.13:ServletRequest 接口及其子接口