RequestParamと@PathVariableの比較

特殊文字を扱う際の @RequestParam@PathVariable の違いは何ですか?

リクエストパラメータ @RequestParam では、+ をスペースとして受け付けました。

PathVariableの場合は++` として受け入れられました。

URL http://localhost:8080/MyApp/user/1234/invoices?date=12-05-2013 が2013年12月5日のユーザー1234の請求書を取得する場合、コントローラメソッドは次のようになります。

@RequestMapping(value="/user/{userId}/invoices", method = RequestMethod.GET)
public List listUsersInvoices(
            @PathVariable("userId") int user,
            @RequestParam(value = "date", required = false) Date dateOrNull) {
  ...
}

また、リクエストパラメータはオプションにすることができ、Spring 4.3.3の時点ではパス変数もオプションにすることができます3。しかし、これはURLのパス階層を変更し、リクエストマッピングの衝突を引き起こす可能性があることに注意してください。例えば、 /user/invoices はユーザー null の請求書を提供するのか、それとも ID "invoices" を持つユーザーについての詳細を提供するのか?

解説 (14)

リクエストからクエリパラメータ値にアクセスするために使用される @RequestParam アノテーションです。次のリクエストURLを見てください。

http://localhost:8080/springmvc/hello/101?param1=10&param2=20

上記のURLのリクエストでは,以下のようにparam1, param2の値にアクセスすることができます.

public String getDetails(
    @RequestParam(value="param1", required=true) String param1,
        @RequestParam(value="param2", required=false) String param2){
...
}

以下は、@RequestParamアノテーションがサポートするパラメータ一覧です。

  • defaultValue - 要求がその値を持たないか、または空である場合のフォールバックメカニズムとして、これは既定値です。
  • name** - バインドするパラメータの名前。
  • required - このパラメータが必須であるかどうか。trueの場合、そのパラメータの送信に失敗する。
  • value - name属性のエイリアスです。

@PathVariable

PathVariable*は、受信リクエストのURIで使用されるパターンを特定します。以下のリクエストURLを見てみよう。

上記のURLのリクエストは、Spring MVCでは以下のように記述します。

@RequestMapping("/hello/{id}")    public String getDetails(@PathVariable(value="id") String id,
    @RequestParam(value="param1", required=true) String param1,
    @RequestParam(value="param2", required=false) String param2){
.......
}

PathVariableアノテーションは、リクエストURIのテンプレートをバインドするための属性値を1つだけ持っています。一つのメソッドで複数の@PathVariable**アノテーションを使用することは可能です。ただし、同じパターンを持つメソッドが複数ないことを確認してください。

また、もう1つ興味深いアノテーションがあります。 MatrixVariableです。

そして、それに対するControllerの手法

 @RequestMapping(value = "/{stocks}", method = RequestMethod.GET)
  public String showPortfolioValues(@MatrixVariable Map matrixVars, Model model) {

    logger.info("Storing {} Values which are: {}", new Object[] { matrixVars.size(), matrixVars });

    List outlist = map2List(matrixVars);
    model.addAttribute("stocks", outlist);

    return "stocks";
  }

でも有効にする必要があります。

解説 (3)

@RequestParamは、http://localhost:8080 / calculation / powなどのクエリパラメーター(静的値)に使用されます?base = 2& ext = 4。

@PathVariableは、http://localhost:8080 / calculation / sqrt / 8などの動的値に使用されます。

@RequestMapping(value="/pow", method=RequestMethod.GET)
public int pow(@RequestParam(value="base") int base1, @RequestParam(value="ext") int ext1){
    int pow = (int) Math.pow(base1, ext1);
    return pow;
}

@RequestMapping("/sqrt/{num}")
public double sqrt(@PathVariable(value="num") int num1){
    double sqrtnum=Math.sqrt(num1);
    return sqrtnum;
}
解説 (0)

application/x-www-form-urlencoded midia typeがスペースを+に変換し、受信機が+をスペースに変換してデータをデコードするのかもしれません。詳細はURLを確認してください。http://www.w3.org/TR/html401/interact/forms.html#h-17.13.4.1

解説 (0)
@PathVariable - must be placed in the endpoint uri and access the query parameter value from the request
@RequestParam - must be passed as method parameter (optional based on the required property)
 http://localhost:8080/employee/call/7865467

 @RequestMapping(value=“/call/{callId}", method = RequestMethod.GET)
 public List getAgentCallById(
            @PathVariable(“callId") int callId,
            @RequestParam(value = “status", required = false) String callStatus) {

    }

http://localhost:8080/app/call/7865467?status=Cancelled

@RequestMapping(value=“/call/{callId}", method = RequestMethod.GET)
public List getAgentCallById(
            @PathVariable(“callId") int callId,
            @RequestParam(value = “status", required = true) String callStatus) {

}
解説 (0)