web-dev-qa-db-ja.com

@RequestParamと@PathVariable

特殊文字を処理する際の@RequestParam@PathVariableの違いは何ですか?

+はスペースとして@RequestParamに受け入れられました。

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

285
user1857181

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

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

また、リクエストパラメータはオプションにすることができ、Spring 4.3.3以降ではパス変数 同様にオプションにすることができます になります。ただし注意してください。これにより、URLパス階層が変更され、リクエストマッピングの競合が発生する可能性があります。たとえば、/user/invoicesは、ユーザーnullに対する請求書、またはIDが "invoices"のユーザーに関する詳細を提供しますか。

442
Ralph

@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 - requestに値がない場合、または空の場合は、これが代替メカニズムとしてのデフォルト値です。
  • name - バインドするパラメータの名前
  • 必須 - パラメータが必須かどうか。それが本当なら、そのパラメータを送信しないことは失敗します。
  • value - これはname属性のエイリアスです

@PathVariable

@PathVariableは、着信要求のURIで使用されるパターンを識別します。以下のリクエストURLを見てみましょう。

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

上記の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

http:// localhost:8080/spring_3_2/matrixvars/stocks; BT.A = 276.70、+ 10.40、+ 3.91; AZN = 236.00、+ 103.00、+ 3.29; SBRY = 375.50、+ 7.60、+ 2.07

そしてそれに対するControllerメソッド

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

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

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

    return "stocks";
  }

しかし、有効にする必要があります。

<mvc:annotation-driven enableMatrixVariables="true" >
90
Xelian

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

@PathVariableは、次のような動的な値に使用されます。 http:// localhost:8080/evaluation/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;
}
14
alok

アプリケーション/ x-www-form-urlencoded midia型がスペースを + に変換し、受信側が + をspaceに変換してデータをデコードすることがあります。詳細については. http://www.w3.org/TR/html401/interact/forms.html#h-17.13.4.1

0
andy