目次
| リクエスト オブジェクト HttpServletRequest インターフェイス
この記事は、バックエンドの完全なメモ セットの 3 番目の部分に属します。
| リクエスト オブジェクト HttpServletRequest インターフェイス
HttpServletRequest の基本概要
HttpServletRequest はどこで使用されますか?
-
注意して観察すると、前の doGet メソッドと doPost メソッドのパラメーター リストが次のとおりであることがわかります。
HttpServletRequest req, HttpServletResponse resp
-
これら 2 つのパラメータは、現在学習している HttpServletRequest と後で学習する HttpServletRespose です。
-
Tomcat のリクエスト処理プロセス全体を確認して、より明確に使用できるようにしましょう。
リクエストが Tomcat に送信されると、最初にサービスを通過し、次にコネクタに渡されます。コネクタは、リクエストを受信し、受信したリクエストを特定の処理のためにリクエストとレスポンスにカプセル化するために使用されます。カプセル化されると、コンテナ内のサーブレットに渡され、処理が完了し、コンテナはリクエストを処理した後にコネクタに戻り、最後にコネクタが処理結果をソケット経由でクライアントに返すことで、リクエスト全体が処理されます。
HttpServletRequestとは何ですか?
-
HttpServletRequest はサーブレット仕様に由来するインターフェイスです
-
その実装クラスは HTTP サーバー (Tomcat) によって提供されます。
-
HttpServletRequestの実装クラスオブジェクトをリクエストオブジェクトと呼びます。
効果?
-
HttpServletRequest インターフェイスは、doGet/doPost メソッドの実行時に Http リクエスト プロトコル パッケージ内の情報を読み取る役割を果たします。
-
Httpリクエストプロトコルパッケージ内の[リクエストライン]情報を読み取ります。
-
Httpリクエストプロトコルパッケージの[リクエストヘッダ]または[リクエストボディ]に格納されているリクエストパラメータ情報を読み込みます。
-
ブラウザの代わりに、HTTP サーバーからリソース ファイルの呼び出しを申請します。
リクエストオブジェクトのURLとメソッドの取得
文法
-
参考:URLとURIの違い
request.getRequestURI(); //获取请求行的URI
request.getRequestURL(); //获取请求行的URL
request.getMethod(); //获取请求行的method(请求方式)
例
-
以下のサーブレット実装クラス関連の web.xml 構成が構成されています。
-
Tomcat にデプロイされた Web サイトのエイリアスは web2 です。サーブレットオブジェクトのエイリアスはweb1です。、
-
構成が完了し、コードが記述されたら、Tomcat を起動し、URL http://localhost:8080/web2/web1 を入力してサーブレットにアクセスします。
public class MyServlet extends HttpServlet {
@Override
public void init() throws ServletException {
super.init();
System.out.println("MyServlet对象被创建了");
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//super.doGet(req, resp); 如果你是要彻底覆盖父类的doGet方法,不需要父类提供的功能,就可以删除super.doGet(req,resp);这一句
System.out.println("这是Servlet的doGet方法");
//request.getRequestURI()
System.out.println("获取到请求行的URL:" + req.getRequestURL()); //http://localhost:8080/web2/web1
System.out.println("获取到请求行的URI:" + req.getRequestURI()); ///web2/web1
//request.getMethod()
System.out.println("获取到请求行的method(请求方式):" + req.getMethod()); //?GET
}
}
リクエストオブジェクトはパラメータ名を取得します
文法
getParameterNames メソッドを使用して、Enumeration 列挙クラスを返します。
Enumeration parameters = request.getParameterNames();
while(parameters.hasMoreElements()){
String parameter = (String)parameters.nextElement(); //得到的是Object,所以要强转为String
}
例
-
次のコード、web.xml 構成、および Tomcat のデプロイメントは、前のセクションとまったく同じです。
-
今回入力した URL はhttp://localhost:8080/web2/web1?name=Klee&age=12 で、パラメーターを使用して状況をシミュレートします。
public class MyServlet extends HttpServlet {
@Override
public void init() throws ServletException {
super.init();
System.out.println("MyServlet对象被创建了");
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//...
//request.getParameters
Enumeration parameters = req.getParameterNames();
while(parameters.hasMoreElements()){
System.out.println("参数名:" + (String)parameters.nextElement());//得到的是Object,所以要强转为String
//参数名:name 参数名:age
}
}
}
リクエストオブジェクトのパラメータ値の取得
文法
String value = request.getParameter(参数名);
前のセクションのコードにアクセスしてパラメータ名を取得します。完全なコードは次のとおりです。
Enumeration parameters = request.getParameterNames();
int i = 1;
while(parameters.hasMoreElements()){
String parameterName = (String)parameters.nextElement();//得到的是Object,所以要强转为String
String parameterValue = request.getParameter(parameterName);
System.out.println("参数" + i + ":" + parameterName + " = " + parameterValue);
//name = Klee age = 12
}
例
-
次のコード、web.xml 構成、および Tomcat のデプロイメントは、前のセクションとまったく同じです。
-
今回入力した URL はhttp://localhost:8080/web2/web1?name=Klee&age=12 で、パラメーターを使用して状況をシミュレートします。
public class MyServlet extends HttpServlet {
@Override
public void init() throws ServletException {
super.init();
System.out.println("MyServlet对象被创建了");
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//...
//request.getParameters
Enumeration parameters = req.getParameterNames();
int i = 1;
while(parameters.hasMoreElements()){
String parameterName = (String)parameters.nextElement();//得到的是Object,所以要强转为String
String parameterValue = req.getParameter(parameterName);
System.out.println("参数" + i++ + ":" + parameterName + " = " + parameterValue);
//参数1:name = Klee 参数2:age = 12
}
}
}
パラメータ値の文字化け問題
POSTリクエストから取得したパラメータ値が文字化けするのはなぜですか?
-
ブラウザが GET モードでリクエストを送信する場合、リクエスト パラメータは [リクエスト ヘッダー ] に保存されます。HTTP リクエスト プロトコル パケットが Http サーバーに到着した後、最初に行うことはリクエスト ヘッダーのバイナリ コンテンツをデコードすることです。 Tomcat によってデコードされます。Tomcat9.0 は、[デフォルトで] utf-8] 文字セット デコード要求ヘッダーを使用し、すべての国文字を説明できます。
-
ブラウザーが POST モードでリクエストを送信する場合、リクエスト パラメーターは [リクエスト本文] に保存されます。HTTP リクエスト プロトコル パケットが Http サーバーに到着した後、最初に行うことは、リクエスト本文のバイナリ コンテンツをデコードして、現在のリクエスト オブジェクト (リクエスト) がそれをデコードする役割を果たします。リクエストは、デフォルトでリクエスト本文をデコードするために [IS0-8859-1] 文字セットを使用します。東欧文字セットが使用されている場合、リクエスト本文パラメータの内容が中国語の場合、デコードできず、取得のみが行われます。文字化け。
-
Tomcat のどのバージョンにも POST リクエストの文字化けの問題があり、GET リクエストの文字化けがあるのはバージョン 8.0 より前の Tomcat だけであることに注意してください(したがって、このセクションでは GET リクエストの文字化けについては説明しません。Baidu が必要です)。
また、上記のTomcatサーバーとブラウザのエンコードの不一致による文字化けに加え、コンソールが出力するエンコード設定による文字化けも考慮する必要があります。ローカルコードファイルに起因する文字化け 文字設定に起因する文字化け
ブラウザーが POST モードでリクエストを送信する場合、リクエスト パラメーターは [リクエスト本文] に保存されます。HTTP リクエスト プロトコル パケットが Http サーバーに到着した後、最初に行うことは、リクエスト本文のバイナリ コンテンツをデコードして、現在のリクエスト オブジェクト (リクエスト) がそれをデコードする役割を果たします。リクエストは、デフォルトでリクエスト本文をデコードするために [IS0-8859-1] 文字セットを使用します。東欧文字セットが使用されている場合、リクエスト本文パラメータの内容が中国語の場合、デコードできず、取得のみが行われます。文字化け。
POST文字化け解決の基本的な考え方
Post リクエスト モードでは、リクエスト本文の内容を読み取る前に、utf-8 文字セットを使用してリクエスト本文の内容を再デコードするようにリクエスト オブジェクトに通知する必要があります。
POST文字化け、コンソール出力文字化け、ローカルコード中国語文字化けの解決策
-
doPost メソッドの最初の行にコードを追加します
req.setCharacterEncoding("UTF-8");
(このメソッドは POST 文字化けの場合にのみ有効です。つまり、doPost でのみ使用できます)。
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("UTF-8");
System.out.println("编码方式" + req.getCharacterEncoding());
String parameterValue = req.getParameter("userName");
System.out.println(parameterValue);
}
コードの最初の行を追加した後も POST が文字化けし、GET も文字化けする場合は、コンソール出力が文字化けしていると考えられます。
解決策: [構成の編集をクリックし、VM オプションを入力します]-Dfile.encoding=utf-8
(この方法の解決方法はPOST、GET両方に有効です。コンソール出力の文字化けを解決する機能です) 参考1 参考2
上記の 2 つの方法を使用した後、ブラウザーの中国語は文字化けしていないが、コード内の中国語が再び文字化けする場合は、[設定 - エディター - ファイルエンコーディング] を入力して設定することを検討してください。
例
<form action="/web2/postWeb" method="GET">
请求参数:<input type="text" name="userName"/>
<br/>
<input type="submit" value="POST方式访问Servlet">
</form>
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("UTF-8");
System.out.println("编码方式" + req.getCharacterEncoding());
String parameterValue = req.getParameter("userName");
System.out.println(parameterValue);
<!--Servlet实现类PostServlet的配置-->
<servlet>
<servlet-name>MyPostServlet</servlet-name>
<servlet-class>controller.PostServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>MyPostServlet</servlet-name>
<url-pattern>/postWeb</url-pattern>
</servlet-mapping>