サーブレットテクノロジ12_HttpServletRequestクラス

HttpServletRequestクラスの役割は何ですか?

リクエストがTomcatサーバーに入るたびに、TomcatサーバーはリクエストされたHTTPプロトコル情報を解析し、それをRequestオブジェクトにカプセル化します。次に、それをサービスメソッド(doGetおよびdoPost)に渡して使用します。HttpServletRequestオブジェクトを介して、要求されたすべての情報を取得できます。

HttpServletRequestクラスの一般的なメソッド:

i。getRequestURI()要求されたリソースパスを取得します

ii。getRequestURL()要求されたURI(絶対パス)を取得します

iii。getRemoteHost()クライアントのIPアドレスを取得します

iv。getHeader()リクエストヘッダーを取得します

v。getParameter()要求されたパラメーターを取得します

vi。getParameterValues()要求されたパラメーターを取得します(複数の値がある場合に使用されます)

vii。getMethod()リクエストメソッドGETまたはPOSTを取得します

viii。setAttribute(key、value);ドメインデータを設定します

ix。getAttribute(key);ドメインデータを取得します

x。getRequestDispatcher()リクエスト転送オブジェクトを取得します

一般的なAPIサンプルコード:

package com.servlet;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

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());

        /*  正常情况下,idea中
        使用localhost访问时,得到的客户端ip地址是 ===> 127.0.0.1
        使用127.0.0.1访问时,得到的客户端ip地址是 ===> 127.0.0.1
        使用真实的电脑ip访问时,得到的客户端ip地址是 ===> 真实的客户端ip地址
         */
//        iii. getRemoteHost() 获取客户端的 ip 地址
        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());
    }
}

演算結果:
ここに画像の説明を挿入

リクエストパラメータを取得する方法:

form.htmlを作成します

<!DOCTYPE html>
<html lang="zh_CN">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <form action="http://localhost:8080/07_servlet/parameterServlet" method="get">
        用户名:<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
        <input type="submit">
    </form>
</body>
</html>

ParameterServlet.javaを作成します

package com.servlet;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Arrays;

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));

    }
}

もちろん、xmlを構成することを忘れないでください。

演算結果:

ここに画像の説明を挿入

ポストリクエストで漢字が文字化けする問題を解決します。

ユーザー名ボックスに中国語を入力すると、getリクエストは正常で、postリクエストの文字が文字化けします

ここに画像の説明を挿入

1つのAPIを使用するだけですパラメーターリクエストを取得する前にのみ役立ちます

//设置请求体的字符集为UTF-8,从而解决post请求的中文乱码问题
req.setCharacterEncoding("UTF-8");

このようにして、問題を解決することができます

ここに画像の説明を挿入

@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    
    
    //设置请求体的字符集为UTF-8,从而解决post请求的中文乱码问题
    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));
}

リクエストの転送:

リクエスト転送とは何ですか?

リクエスト転送とは、サーバーがリクエストを受信した後、あるリソースから別のリソースにジャンプする操作を指します。これはリクエスト転送と呼ばれます。

ここに画像の説明を挿入

Servlet1:

package com.servlet;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

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("key1","柜台1的章");

        //问路:Servlet2(柜台2)怎么走
        /**
         * 请求转发必须要以 / 打头,斜杠表示地址为: http://ip:port/工程名/ ,映射到 idea 代码的 web 目录
         */
        RequestDispatcher requestDispatcher = req.getRequestDispatcher("/servlet2");

        //走向Servlet2
        requestDispatcher.forward(req,resp);
    }
}

Servlet2:

package com.servlet;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

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("key1");
        System.out.println("柜台1是否有章:" + key1);

        //处理自己的业务
        System.out.println("Servlet2处理自己的业务");
    }
}

リクエスト転送の機能:

  1. ブラウザのアドレスバーは変更されていません
  2. 彼らは要求です
  3. リクエストフィールドのデータを共有します
  4. WEB-INFディレクトリに転送できます(form.htmlはWEB-INFディレクトリにデプロイできませんが、リクエスト転送を介してアクセスできます)
RequestDispatcher requestDispatcher = req.getRequestDispatcher("/WEB-INF/form.html");

ベースタグの役割:

index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>首页</title>
</head>
<body>
    这是web下的index.html<br/>
    <a href="a/b/c.html">a/b/c.html</a>
    <br/>
    <a href="http://localhost:8080/07_servlet/forwardC">请求转发:a/b/c.html</a>
</body>
</html>

c.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>首页</title>
</head>
<body>
    这是web/a/b下的c.html<br/>
    <a href="../../index.html">跳回首页</a>
</body>
</html>

ForwardC.java

public class ForwardC extends HttpServlet {
    
    
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    
    
        System.out.println("经过了ForwardC程序");
        req.getRequestDispatcher("/a/b/c.html").forward(req,resp);
    }
}

index.htmlのタグをクリックしてジャンプすると、ブラウザのアドレスバーのアドレスは次のようになります。

http://localhost:8080/07_servlet/a/b/c.html

ジャンプして戻るタグパスは次のとおりです。

../../index.html

すべての相対パスは、現在のブラウザのアドレスバーにあるアドレスを参照して、作業中にジャンプします

次に、参照後に取得されるアドレスは次のとおりです。

http://localhost:8080/07_servlet/index.html

正しいジャンプパス

リクエスト転送を使用してリダイレクトする場合、ブラウザのアドレスバーのアドレスは次のとおりです。

http://localhost:8080/07_servlet/forwardC

ジャンプして戻るタグパスは次のとおりです。

../../index.html

すべての相対パスは、現在のブラウザのアドレスバーにあるアドレスを参照して、作業中にジャンプします。

次に、参照後に取得されるアドレスは次のとおりです。

http://localhost:8080/index.html

これは間違った道です!

ここに画像の説明を挿入

ベースタグは、現在のページのすべての相対パスを操作するときに参照するパスを設定できます。

変更されたコード:

c.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>首页</title>
<!--    base标签设置页面相对路径工作时参照的地址
        href属性就是参数的地址值-->
    <base href="http://localhost:8080/07_servlet/a/b/c.html">
</head>
<body>
    这是web/a/b下的c.html<br/>
    <a href="../../index.html">跳回首页</a>
</body>
</html>

説明:

  1. まず、ベースタグがあるかどうかを確認します。ベースタグがある場合は、ブラウザの現在のアドレスバーのアドレスを無視し、代わりにベースの値を参照します。これは、住所を../../index.htmlに置くのと同じです。
http://localhost:8080/07_servlet/a/b/c.html../../index.html

1../つは1つのフォルダをオフセットします。これは次の値に相当します。

http://localhost:8080/07_servlet/index.html
  1. ベースタグの最後のリソース名(c.html)は省略できます(覚えておいてください:/は省略できません!)
<base href="http://localhost:8080/07_servlet/a/b/">

Webの相対パスと絶対パス:

JavaWebには、相対パス絶対パスの2種類のパスがあります

相対パスは次のとおりです。

。現在のディレクトリを表します

…上位ディレクトリを示します

リソース名は、現在のディレクトリ/リソース名を表します

絶対パス:

http://ip:port/工程路径/资源路径

実際の開発では、パスは単に相対パスを使用するのではなく、絶対パスを使用します。

1.絶対パス

2.ベース+相対パス

Webでの/スラッシュのさまざまな意味:

Webでは、/スラッシュは絶対パスです。

/スラッシュがブラウザによって解析される場合、取得されるアドレスは次のとおりです。http:// ip:port / http:// localhost:8080 /

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

/スラッシュがサーバーによって解析される場合、取得されるアドレスは次のとおりです。http:// ip:port /プロジェクトパスhttp:// localhost:8080 / 07_servlet /

  1. <url-pattern>/servlet1</url-pattern>
  2. servletContext.getRealPath(“/”);
  3. request.getRequestDispatcher(“/”);

特殊なケース:response.sendRediect( "/");分析のためにスラッシュをブラウザーに送信ます。http:// ip:port /を取得する

おすすめ

転載: blog.csdn.net/weixin_45024585/article/details/108905012