リクエストの学習ノート(サーブレット学習コース)


ブラウザがサーバーにアクセスすると、ユーザーから送信されたパラメータデータ、プロトコルバージョン、および要求ヘッダー情報が要求メッセージ(つまり、要求データパケット)にカプセル化され、サーバーに送信されます。
サーバー(Tomcatなど)は、要求メッセージを受信すると、要求メッセージをRequestオブジェクトにカプセル化します。プログラマーは、Requestオブジェクトを介して要求メッセージデータを取得できます。

リクエストメッセージデータを取得する

1.リクエストラインのデータを取得します

GET / web-demo-03 / demo01?name = zhangsan HTTP / 1.1

メソッド: 1.1。Get
リクエストメソッド:GET
String getMethod()

1.2.仮想ディレクトリを取得します:/ web-demo-03
String getContextPath()

1.3。サーブレットパスを取得します
。/demo01StringgetServletPath()

1.4.リクエストURIの取得:/ web-demo-03 / demo01
URIユニフォームリソース識別子
文字列getRequestURI()

1.5.GETメソッドのリクエストパラメータを取得します。name=zhangsanString
getQueryString()

1.6.リクエストURLを取得します:http:// localhost:8080 / web-demo-03 / demo01
URLユニフォームリソースロケーター
文字列getRequestURL()

1.7.プロトコルとバージョンを取得します。http/
1.1String getProtocol()

1.8.クライアントのIPアドレスを取得します
StringgetRemoteAddr()

2.リクエストヘッダーのデータを取得します

リクエストヘッダー名では大文字と小文字は区別されません。

方法:
String getHeader(String name)リクエストヘッダーの名前でリクエストヘッダーの値を取得し
Enumeration<String> getHeaderNames()ます。すべてのリクエストヘッダー名を取得します。列挙はイテレータに似ています

サンプルコード:

package priv.lwx.javaex.web_demo_03.web.servlet;
 /**
 * 获取referer,防止盗链
 *
 * @author liaowenxiong
 * @date 2021/12/29 11:21
 */


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

@WebServlet(value = "/demo06")
public class ServletDemo06 extends HttpServlet {
    
    
  @Override
  protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    
    // 获取referer
    String referer = request.getHeader("referer");
    System.out.println(referer);
    // 防止盗链
    if (referer != null) {
    
    
      if (referer.contains("/web-demo-03")) {
    
    
        // 应用内正常访问
        System.out.println("播放电影");
      } else {
    
    
        // 应用外访问
        System.out.println("想看电影吗?来优酷吧!");
      }
    }

  }
}

3.リクエスト本文のデータを取得します

post requestメソッドのみがリクエスト本文を持ち、postリクエストのリクエストパラメーターはリクエスト本文にカプセル化されます。

手順:
3.1。ストリームオブジェクトの取得
BufferedReader getReader():文字入力ストリームを取得し、文字データのみを操作できます
ServletInputStream getInputStream():バイト入力ストリームを取得し、すべてのタイプのデータを操作できます(主にファイルのアップロード、ビデオのアップロード、その他のシナリオで使用されます) )。

3.2。ストリームオブジェクトからのデータの取得

サンプルコード:

package priv.lwx.javaex.web_demo_03.web.servlet.request;

/**
 * 获取请求体的数据
 *
 * @author liaowenxiong
 * @date 2021/12/29 11:21
 */


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

@WebServlet(value = "/request-demo05")
public class RequestDemo05 extends HttpServlet {
    
    
  @Override
  protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    
  }

  @Override
  protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    
    // 获取请求消息体的数据
    // 1.获取字符流
    BufferedReader reader = request.getReader();
    // 2.读取数据
    String line = null;
    while ((line = reader.readLine()) != null) {
    
    
      System.out.println(line);
    }
  }
}

4.他のデータを取得する

4.1。リクエストパラメータを取得する一般的な方法

getメソッドまたはpostメソッドに関係なく、次のメソッドを使用してリクエストパラメーターを取得できます。

メソッド::
String getParameter(String name)パラメータ名に従ってパラメータの値を取得します。注意すべき問題:名前が実際のリクエストパラメータ名と一致しない場合、nullが返されます。
フロントエンドページにパラメータ値が入力されていない場合は、空の文字列が返され""ます。

String[] getParameterValues(String name):パラメータ名に基づいてパラメータ値の配列を取得します。例:hobby = ds&hobby = ps
Enumeration<String> getParameterNames():すべてのリクエストパラメータの名前を取得します

 Enumeration<String> parameterNames = req.getParameterNames();
// 迭代遍历Enumeration对象
while (parameterNames.hasMoreElements()) {
    
    
	String s = parameterNames.nextElement();
	System.out.println(s);
}

Map<String,String[]> getParameterMap():すべてのリクエストパラメータのマップコレクションを取得します。

中国語の文字化けの問題

Tomcat 8は、get requestメソッドでの中国語の文字化けの問題を解決しましたが、postrequestモードでは中国語の文字化けの問題が発生します。

解決策:
パラメーターを取得する前に、デコードされた文字エンコードをutf-8に設定すると、コードは次のようになります。

request.setCharacterEncoding("utf-8");

この文字エンコードは、フロントエンドページの文字エンコードと一致している必要があります。

4.2.転送をリクエストする

リクエスト転送:サーバー内のリソースジャンプ方法

手順:
4.2.1。リクエストオブジェクトを介してリクエストフォワーダーオブジェクトを取得します。RequestDispatcher getRequestDispatcher(String path)、pathは転送ターゲットのリソースパスです。

4.2.2.RequestDispatcherオブジェクトを使用して転送します。requestDispatcher.forward(ServletRequest request, ServletResponse response)

機能:
4.2.3。ブラウザのアドレスバーのアクセスパスは変更されていません
4.2.4。現在のサーバー内のリソースにのみ転送できます
4.2.5。転送はリクエストのみです

4.3。データの共有

ドメインオブジェクト:スコープ内のデータを共有できるスコープを持つオブジェクト
リクエストドメインオブジェクト:リクエストのスコープを表し、通常、リクエストによって転送された複数のリソース間でデータを共有するために使用されます

メソッド:
void setAttribute(String name、Object obj):データの保存
Object getAttribute(String name):データの取得;属性名による属性値の取得
void removeAttribute(String name):データの削除;属性名による対応するデータの削除;キーの削除対応するキーと値のペア

4.4.ServletContextオブジェクトを取得します

ServletContext getServletContext()

継承と実装システム

HttpServletRequestインターフェースは、ServletRequestインターフェースから継承します

org.apache.catalina.connector.RequestFacade(tomcatによって実装されるタイプ)は、HttpServletRequestインターフェースを実装します

おすすめ

転載: blog.csdn.net/liaowenxiong/article/details/123323191