HttpServletRequest類

目錄

1.HttpServletRequest類的作用

2.HttpServletRequest類的常用方法

3.獲取請求參數

4.doGet 請求的中文亂碼解決

5.doPost 請求的中文亂碼解決

6.請求的轉發

7.base 標籤的作用

8.Web 中的相對路徑和絕對路徑

9.web 中 / 斜槓的不同意義


1.HttpServletRequest類的作用

每次只要有請求進入 Tomcat 服務器,Tomcat 服務器就會把請求過來的 HTTP 協議信息解析好封裝到 Request 對象中。然後傳遞到 service 方法(doGet doPost)中給我們使用。我們可以通過 HttpServletRequest 對象,獲取到所有請求的信息。

 

2.HttpServletRequest類的常用方法

getRequestURI()
獲取請求的資源路徑
getRequestURL()
獲取請求的統一資源定位符(絕對路徑)
getRemoteHost()
獲取客戶端的 ip 地址
getHeader()
獲取請求頭
getParameter()
獲取請求的參數
getParameterValues()
獲取請求的參數(多個值的時候使用)
getMethod()
獲取請求的方式 GET POST
setAttribute()
設置域數據
getAttribute()
獲取域數據
getRequestDispatcher()
獲取請求轉發對象

代碼示例:

web.xml:

 <servlet>
        <servlet-name>RequestAPIServlet</servlet-name>
        <servlet-class>com.study.servlet.RequestAPIServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>RequestAPIServlet</servlet-name>
        <url-pattern>/API</url-pattern>
    </servlet-mapping>

測試代碼:

public class RequestAPIServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //        i.getRequestURI()					獲取請求的資源路徑
        System.out.println("URI => " + req.getRequestURI());
//        ii.getRequestURL()					獲取請求的統一資源定位符(絕對路徑)
        System.out.println("URL => " + req.getRequestURL());
//        iii.getRemoteHost()				獲取客戶端的ip地址
        /**
         * 在IDEA中,使用localhost訪問時,得到的客戶端 ip 地址是 ===>>> 127.0.0.1<br/>
         * 在IDEA中,使用127.0.0.1訪問時,得到的客戶端 ip 地址是 ===>>> 127.0.0.1<br/>
         * 在IDEA中,使用 真實ip 訪問時,得到的客戶端 ip 地址是 ===>>> 真實的客戶端 ip 地址<br/>
         */
        System.out.println("客戶端 ip地址 => " + req.getRemoteHost());
//        iv.getHeader()						獲取請求頭
        System.out.println("請求頭User-Agent ==>> " + req.getHeader("User-Agent"));
//        vii.getMethod()					獲取請求的方式GET或POST
        System.out.println("請求的方式 ==>> " + req.getMethod());
    }

}

結果截圖:

 

3.獲取請求參數

getParameter()
獲取請求的參數
getParameterValues()
獲取請求的參數(多個值的時候使用)

代碼示例

form.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>form</title>
</head>
<body>
<form action="http://localhost:8080/07_Servlet/parameterServlet">
    用戶名:<input type="text" name="username"><br/>
    密碼:<input type="password" name="password"><br/>
    興趣愛好: <input type="checkbox" name="hobby" value="cpp">C++
             <input type="checkbox" name="hobby" value="java">JAVA
             <input type="checkbox" name="hobby" value="js">JavaScript<br/>
    <input type="submit">
</form>
</body>
</html>

web.xml

 <servlet>
        <servlet-name>ParameterServlet</servlet-name>
        <servlet-class>com.study.servlet.ParameterServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>ParameterServlet</servlet-name>
        <url-pattern>/parameterServlet</url-pattern>
    </servlet-mapping>

ParameterServlet.java

public class ParameterServlet extends HttpServlet{
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //獲取用戶名
        String username = req.getParameter("username");
        //獲取密碼
        String password = req.getParameter("password");
        //興趣愛好
        String[] hobby = req.getParameterValues("hobby");

        System.out.println("用戶名:"+username);
        System.out.println("密碼:"+password);
        System.out.println("興趣愛好:"+ Arrays.asList(hobby));

    }


}

結果展示:

 

4.doGet 請求的中文亂碼解決

        String username = req.getParameter("username");
         //1 先以 iso8859-1 進行編碼
        // 2 再以 utf-8 進行解碼
        username = new String(username.getBytes("iso-8859-1"), "UTF-8");

 

5.doPost 請求的中文亂碼解決

setCharacterEncoding() :設置請求體的字符集

 @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //設置請求體的字符集爲 UTF-8
        //要在獲取請求參數之前調用纔有用
        req.setCharacterEncoding("UTF-8");
        System.out.println("----------doPost-----------");
        //獲取用戶名
        String username = req.getParameter("username");
        //獲取密碼
        String password = req.getParameter("password");
        //興趣愛好
        String[] hobby = req.getParameterValues("hobby");

        System.out.println("用戶名:"+username);
        System.out.println("密碼:"+password);
        System.out.println("興趣愛好:"+ Arrays.asList(hobby));

    }
}

 

6.請求的轉發

請求的轉發:

請求轉發是指,服務器收到請求後,從一次資源跳轉到另一個資源的操作叫請求轉發。

代碼示例:

web.xml

    <servlet>
        <servlet-name>Servlet1</servlet-name>
        <servlet-class>com.study.servlet.Servlet1</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>Servlet1</servlet-name>
        <url-pattern>/servlet1</url-pattern>
    </servlet-mapping>

    <servlet>
        <servlet-name>Servlet2</servlet-name>
        <servlet-class>com.study.servlet.Servlet2</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>Servlet2</servlet-name>
        <url-pattern>/servlet2</url-pattern>
    </servlet-mapping>

Servlet1.java

public class Servlet1 extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //獲取請求參數
        String username = req.getParameter("username");
        System.out.println("在 Servlet1(櫃檯1) 中查看請求參數(材料):"+username);

        //給 材料 蓋一個章,並傳遞到 Servlet2(櫃檯2)
        req.setAttribute("key","Servlet1");
        //請求轉發(問路:Servlet2怎麼走)
        /**
         * 請求轉發必須要以斜槓打頭,/ 斜槓表示地址爲:http://ip:port/工程名/ , 映射到IDEA代碼的web目錄
         */
        RequestDispatcher requestDispatcher = req.getRequestDispatcher("/servlet2");

        //走向Servlet2(櫃檯2)
        requestDispatcher.forward(req,resp);

    }
}

Servlet2.java

public class Servlet2 extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        // 獲取請求的參數(辦事的材料)查看
        String username = req.getParameter("username");
        System.out.println("在Servlet2(櫃檯2)中查看參數(材料):" + username);

        // 查看 櫃檯1 是否有蓋章
        Object key1 = req.getAttribute("key");
        String stamp = "Servlet1";
        System.out.println("櫃檯1是否有章:" + stamp.equals(key1));

        // 處理自己的業務
        System.out.println("Servlet2 處理自己的業務 ");
    }
}

結果截圖:

 

 

7.base 標籤的作用

代碼示例:

<!DOCTYPE html>
<html lang="zh_CN">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <!--base 標籤設置頁面相對路徑工作時參照的地址
        href 屬性就是參數的地址值
    -->
    <base href="http://localhost:8080/07_servlet/a/b/">
</head>
<body>
    這是 a 下的 b 下的 c.html 頁面<br/>
    <a href="../../index.html">跳回首頁</a><br/>
</body>
</html>

 

8.Web 中的相對路徑和絕對路徑

javaWeb 中,路徑分爲相對路徑和絕對路徑兩種:

相對路徑是:

.           表示當前目錄

..          表示上一級目錄

資源名  表示當前目錄/資源名

絕對路徑:

http://ip:port/工程路徑/資源路徑

在實際開發中,路徑都使用絕對路徑,而不簡單的使用相對路徑。

1、絕對路徑

2base+相對

 

9.web 中 / 斜槓的不同意義

在 web 中 / 斜槓 是一種絕對路徑。

/ 斜槓 如果被瀏覽器解析,得到的地址是:http://ip:port/

<a href="/">斜槓a>

/ 斜槓 如果被服務器解析,得到的地址是:http://ip:port/工程路徑

1<url-pattern>/servlet1url-pattern>

2servletContext.getRealPath(“/”);

3request.getRequestDispatcher(“/”);

特殊情況response.sendRediect(“/”);

把斜槓發送給瀏覽器解析。得到 http://ip:port/

 

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