特殊文字を処理する際の@RequestParam
と@PathVariable
の違いは何ですか?
+
はスペースとして@RequestParam
に受け入れられました。
@PathVariable
の場合、+
は+
として受け入れられました。
@PathVariable
はURIから何らかのプレースホルダを取得することです(SpringはURIテンプレートと呼びます) - Spring Reference Chapter 16.3.2.2 URI Template Patterns を参照してください@RequestParam
はURIからもパラメータを取得することです - Spring Reference Chapter 16.3.3.3 @RequestParamを使ってリクエストパラメータをメソッドパラメータにバインドする を参照してください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"のユーザーに関する詳細を提供しますか。
@RequestParam リクエストからクエリパラメータ値にアクセスするために使用されるアノテーション。次のリクエストURLを見てください。
http://localhost:8080/springmvc/hello/101?param1=10¶m2=20
上記のURLリクエストでは、param1とparam2の値は以下のようにアクセスできます。
public String getDetails(
@RequestParam(value="param1", required=true) String param1,
@RequestParam(value="param2", required=false) String param2){
...
}
以下は@RequestParamアノテーションでサポートされているパラメータのリストです。
@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
そしてそれに対する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" >
@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;
}
アプリケーション/ x-www-form-urlencoded midia型がスペースを + に変換し、受信側が + をspaceに変換してデータをデコードすることがあります。詳細については. http://www.w3.org/TR/html401/interact/forms.html#h-17.13.4.1