違いは何である@RequestParam
と@PathVariable
特殊文字の処理中には?
+
@RequestParam
スペースとして受け入れられました。
の場合@PathVariable
、+
として受け入れられました+
。
違いは何である@RequestParam
と@PathVariable
特殊文字の処理中には?
+
@RequestParam
スペースとして受け入れられました。
の場合@PathVariable
、+
として受け入れられました+
。
回答:
@PathVariable
URIからプレースホルダーを取得すること(SpringをURIテンプレートと呼びます)— Springリファレンス第16.3.2.2章URIテンプレートパターンを参照してください。@RequestParam
URIからパラメータを取得することもできます— Springリファレンスの第16.3.3.3章を参照してください@RequestParamを使用してリクエストパラメータをメソッドパラメータにバインドする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<Invoice> listUsersInvoices(
@PathVariable("userId") int user,
@RequestParam(value = "date", required = false) Date dateOrNull) {
...
}
また、リクエストパラメータはオプションにすることができ、Spring 4.3.3以降、パス変数もオプションにすることができます。ただし、これによりURLパス階層が変更され、要求マッピングの競合が発生する可能性があります。たとえば/user/invoices
、ユーザーの請求書null
やID「invoices」のユーザーの詳細を提供しますか?
@PathParam
uriテンプレートにプレースホルダーがある場合にのみ機能します)
@PathParam
javax.ws.rsアノテーションです。docs.oracle.com/javaee/7/api/javax/ws/rs/PathParam.html
リクエストからクエリパラメータ値にアクセスするために使用される@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つだけにしてください。
また、もう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" >
userName
タイプparam などの文字列はありますか?私はそれを変数にすることに傾倒していますが、それもパラメータかもしれません。
@PathParam
や@RequestParam
使用せずに宣言すること@RequestMapping
@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;
}
1)クエリパラメータ@RequestParam
を抽出するために使用されます
http://localhost:3000/api/group/test?id=4
@GetMapping("/group/test")
public ResponseEntity<?> test(@RequestParam Long id) {
System.out.println("This is test");
return ResponseEntity.ok().body(id);
}
while @PathVariable
は、URIから直接データを抽出するために使用されます。
http://localhost:3000/api/group/test/4
@GetMapping("/group/test/{id}")
public ResponseEntity<?> test(@PathVariable Long id) {
System.out.println("This is test");
return ResponseEntity.ok().body(id);
}
2)@RequestParam
データがほとんどクエリパラメータで渡される従来のWebアプリケーションでより便利ですが、@PathVariable
URLに値が含まれるRESTful Webサービスに適しています。
3)必須属性が次の場合、属性を使用してクエリパラメータが存在しないか空の場合、@RequestParam
アノテーションはデフォルト値を指定できます。defaultValue
false
@RestController
@RequestMapping("/home")
public class IndexController {
@RequestMapping(value = "/name")
String getName(@RequestParam(value = "person", defaultValue = "John") String personName) {
return "Required element of request param";
}
}
@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<Calls> 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<Calls> getAgentCallById(
@PathVariable(“callId") int callId,
@RequestParam(value = “status", required = true) String callStatus) {
}
両方の注釈は、まったく同じように動作します。
2つの特殊文字「!」のみ と '@'はアノテーション@PathVariableと@RequestParamで受け入れられます。
動作を確認するために、コントローラーを1つだけ含むSpring Bootアプリケーションを作成しました。
@RestController
public class Controller
{
@GetMapping("/pvar/{pdata}")
public @ResponseBody String testPathVariable(@PathVariable(name="pdata") String pathdata)
{
return pathdata;
}
@GetMapping("/rpvar")
public @ResponseBody String testRequestParam(@RequestParam("param") String paramdata)
{
return paramdata;
}
}
次のリクエストを打つと、同じ応答が得られました。
!@は両方のリクエストで応答として受信されました
application / x-www-form-urlencoded midia typeはスペースを+に変換する可能性があり、受信者は+をスペースに変換することによってデータをデコードします。詳細については、URLを確認してください。http://www.w3.org/TR/html401/interact/forms.html#h-17.13.4.1
@PathVariable
任意のRequestMethodで使用できます