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輸出窗口爲:

 

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,自動跳出瀏覽器,我的是火狐,效果圖如下:

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,在打開瀏覽器輸入下面內容:

點“提交”,ide顯示結果爲:

 

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,在打開瀏覽器輸入下面內容:

點“提交”,ide顯示結果爲:

 

三、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,在打開瀏覽器輸入下面內容:

點“提交”,ide顯示結果爲:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章