Hekai Zhenxue Spring Boot 3.0 の Spring MVC: ④ パラメータを取得する (その 1)

前に、プロセッサーがコントローラーをカプセル化すると繰り返し言いました. HandlerMapping メカニズムがプロセッサーを見つけた後、コントローラーはプロセッサーを介して実行できます. では、プロセッサーはコントローラーをどのような機能で強化しますか?

考えてみましょう。コントローラーを実行する前に何をする必要がありますか? これは、メソッドのパラメーターである必要があります。したがって、プロセッサの最初のステップは、メソッドに従ってパラメーターを取得することです。

ただパラメータを取得する内容はちょっと多めですが、3回に分けて説明する予定なので、ここでタイトルに「とんとん」をつけます。

1.Spring MVC はコントローラーメソッド呼び出しのパラメーターをどのように取得しますか?

コントローラーのパラメーターは、セッション、HTTP リクエスト パラメーター、HTTP リクエスト ヘッダー、システム パラメーター、リクエスト パスなど、さまざまな側面から取得されます。もちろん、特別なリクエスト ボディもあります (ファイルまたは JSON、それについては後で話します)。コントローラーのパラメーターを処理できるようにするために、Spring MVC プロセッサー メソッドのパラメーター リゾルバー (HandlerMethodArgumentResolver) を使用して、さまざまな側面からパラメーターを解決できます。パラメータを取得したら、コントローラのメソッドを呼び出すことができます。

この目的のために、次の図に示すように、Spring MVC が提供するハンドラー メソッド パラメーター リゾルバー (HandlerMethodArgumentResolver) を最初に見てみましょう。

ハンドラー メソッド引数リゾルバー (HandlerMethodArgumentResolver)

 上の図で、追加した赤いボックスはすべて一般的に使用されるパーサーですが、Spring MVC はこのステップを消去し、無意識に使用できるようにします。ここでこの仕組みを少し思い出して、以下の内容がそれらに関連しています。

2. アノテーションなしでパラメーターを取得する

説明するために、ここに次のようなコードを示します。

package com.csdn.mvc.chapter1.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import java.util.HashMap;
import java.util.Map;

@Controller
// 这个注解可以配置在类或者方法上
@RequestMapping("/param")
public class ParameterController {
    /**
     * 在无注解下获取参数,要求参数名称和HTTP请求参数名称一致,此时允许参数为空
     * @param intVal  -- 整数
     * @param longVal -- 长整型
     * @param strVal --字符串
     * @return 响应JSON参数
     */
    // HTTP GET请求
    @GetMapping("/no/annotation")
    @ResponseBody
    public Map<String, Object> noAnnotation(
            Integer intVal, Long longVal, String strVal) {
        var paramsMap = new HashMap<String, Object>();
        paramsMap.put("intVal", intVal);
        paramsMap.put("longVal", longVal);
        paramsMap.put("strVal", strVal);
        return paramsMap;
    }


}

 ここでのメソッドには、"intVal"、"longVal"、および "strVal" というパラメーター名が含まれていることに注意してください。これらのパラメーターを使用した HTTP 要求を取得できる場合に限ります。また、メソッドは @ResponseBody でマークされています。これは、返されたものが JSON データセットに変換されることを意味します。

つまり、デフォルトでは、Spring MVC はコントローラーメソッドのパラメーターを同じ名前のリクエストパラメーターに自動的に一致させます。これがハンドラーメソッドのパラメーターリゾルバー(HandlerMethodArgumentResolver)の役割なのですが、Spring MVC ではこのプロセスが隠蔽されているため、実現できません。

@RequestMapping("/param") はクラスでマークされており、このクラスのすべてのリクエストに「/param」というプレフィックスを付ける必要があることを示しており、@GetMapping は HTTP GET リクエストです。Spring 4.3 以降、@GetMapping、@PostMapping、@PatchMapping、@PutMapping、@DeleteMapping などのメソッド構成アイテムの構成を簡素化するために、いくつかの注釈が追加されました。HTTP GET、POST、PATCH、PUT、DELETE リクエストに対応して、REST スタイルのリクエストで説明します。

注釈のないパラメータは空にすることができます. たとえば、次のようにリクエストします: http://localhost:8080/param/no/annotation?intVal=1&longVal=1

このような結果が得られます。(注: strVal パラメータは空です)

3. @RequestParam を使用してパラメーターを取得する

上記はアノテーションなしでパラメータを取得するものですが、実際にはリクエストパラメータからパラメータを取得することもできます。HTTPリクエストパラメーターとコントローラーメソッドパラメーターは名前が異なるため、HTTPリクエストパラメーターからコントローラーパラメーターを取得する仕組みを構築する必要があります。次に、アノテーション @RequestParam を使用します。RequestParamMethodArgumentResolver がパラメーターを取得できるようにします。

次のように、ParameterController でテストするメソッドを追加します。 

/**
 * 通过@RequestParam获取参数,此时默认不允许参数为空
 * @param intVal  -- 整数
 * @param longVal -- 长整型
 * @param strVal --字符串
 * @return 响应JSON参数
 */
// HTTP GET请求
@GetMapping("/annotation")
@ResponseBody
public Map<String, Object> annotation(
        @RequestParam("int_val") Integer intVal,
        @RequestParam("long_val") Long longVal,
        @RequestParam("str_val") String strVal) {
    var paramsMap = new HashMap<String, Object>();
    paramsMap.put("intVal", intVal);
    paramsMap.put("longVal", longVal);
    paramsMap.put("strVal", strVal);
    return paramsMap;
}

@RequestParam は HTTP リクエストパラメーターからコントローラーへのパラメーターを取得することを意味し、「int_val」、「long_val」、および「str_val」はパラメーター名を表し、コントローラーのパラメーターに intVal、longVal、strVal などの名前を付けることができます。あなたがしたい。@RequestParam は名前でそれらに対応できます。

@RequestParam でマークされたパラメーターはデフォルトで空にすることはできません。空の場合、例外がスローされます。空にする場合は、次のように構成を変更できます。

@RequestParam(value="int_val", required = false) Long intVal

コード内の必要な構成アイテムのデフォルト値は true です。つまり、デフォルトにすることはできません。false に変更すると、デフォルトが許可されます。もちろん、ほとんどの場合、悪名高い NullPointerException をスローしないように構成することはお勧めしません。

4. URL からパラメーターを取得する

多くの場合、REST リクエストでは、リクエストなどの URL からパラメーターを取得する必要があります。

http://localhost:8080/user/1 を取得します

弊社に代わってユーザー番号1のユーザー情報を取得するため、URLから番号を取得する必要があります。このとき、@PathVariable と URL の組み合わせを使用して達成する必要があります。このために、次のように、ParameterController でテストするメソッドを追加します。 

@GetMapping("/path/{intVal}/{longVal}/{strVal}")
@ResponseBody
public Map<String, Object> path(
        @PathVariable("intVal") Integer intVal,
        @PathVariable("longVal") Long longVal,
        @PathVariable("strVal") String strVal) {
    var paramsMap = new HashMap<String, Object>();
    paramsMap.put("intVal", intVal);
    paramsMap.put("longVal", longVal);
    paramsMap.put("str", strVal);
    return paramsMap;
}

ここでの @GetMapping のパスは「/path/{intVal}/{longVal}/{strVal}」です。これらの {paramName} 形式はポジショニング パラメータの位置なので、パスに @PathVariable({paramName}) を使用できます。 () メソッド 対応する URL でパラメーターを取得できます。

おすすめ

転載: blog.csdn.net/ykzhen2015/article/details/129944882