前に、プロセッサーがコントローラーをカプセル化すると繰り返し言いました. HandlerMapping メカニズムがプロセッサーを見つけた後、コントローラーはプロセッサーを介して実行できます. では、プロセッサーはコントローラーをどのような機能で強化しますか?
考えてみましょう。コントローラーを実行する前に何をする必要がありますか? これは、メソッドのパラメーターである必要があります。したがって、プロセッサの最初のステップは、メソッドに従ってパラメーターを取得することです。
ただパラメータを取得する内容はちょっと多めですが、3回に分けて説明する予定なので、ここでタイトルに「とんとん」をつけます。
1.Spring MVC はコントローラーメソッド呼び出しのパラメーターをどのように取得しますか?
コントローラーのパラメーターは、セッション、HTTP リクエスト パラメーター、HTTP リクエスト ヘッダー、システム パラメーター、リクエスト パスなど、さまざまな側面から取得されます。もちろん、特別なリクエスト ボディもあります (ファイルまたは JSON、それについては後で話します)。コントローラーのパラメーターを処理できるようにするために、Spring MVC プロセッサー メソッドのパラメーター リゾルバー (HandlerMethodArgumentResolver) を使用して、さまざまな側面からパラメーターを解決できます。パラメータを取得したら、コントローラのメソッドを呼び出すことができます。
この目的のために、次の図に示すように、Spring MVC が提供するハンドラー メソッド パラメーター リゾルバー (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 でパラメーターを取得できます。