記事ディレクトリ
ブラウザがサーバーにアクセスすると、ユーザーから送信されたパラメータデータ、プロトコルバージョン、および要求ヘッダー情報が要求メッセージ(つまり、要求データパケット)にカプセル化され、サーバーに送信されます。
サーバー(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インターフェースを実装します