@ErkekParam vs @PathVariable


355

Arasındaki fark nedir @RequestParamve @PathVariableözel karakterler işlerken?

+tarafından @RequestParamboşluk olarak kabul edildi .

Durumunda @PathVariable, +olarak kabul edildi +.

Yanıtlar:


500

URL http://localhost:8080/MyApp/user/1234/invoices?date=12-05-2013, 5 Aralık 2013 tarihinde 1234 kullanıcısı için fatura alırsa, denetleyici yöntemi şuna benzer:

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

Ayrıca, istek parametreleri isteğe bağlı olabilir ve Bahar 4.3.3'ten itibaren yol değişkenleri de isteğe bağlı olabilir . Bununla birlikte, URL yolu hiyerarşisini değiştirebilir ve istek eşleme çakışmaları getirebilir. Örneğin, /user/invoiceskullanıcı için faturalar nullveya "faturalar" kimliğine sahip bir kullanıcıyla ilgili ayrıntılar sağlar mı?


11
@PathVariableherhangi bir RequestMethod kullanılabilir
Kurai Bankusu

1
@AlexO: Bunun java8 ile ilgisi yoktur, java 5 ve Spring3.0 için bile çalışır: Nokta, kodun hata ayıklama etkin olarak derlenmesidir.
Ralph

2
@Ralph Correct, bu, Java 8'den önce hata ayıklama ile çalışır. Java 8'den bu yana, " -parameters " yerine hata ayıklama olmadan da çalışır: docs.spring.io/spring/docs/current/spring-framework-reference/… docs.oracle .com / javase / tutorial / reflect / member /…
AlexO

1
@ user3705478: Bahar sanırım bu bir istek işleyici yöntem olduğunu bilmek gerekir, çünkü öyle düşünmüyorum. (ve elbette: @PathParam yalnızca uri şablonunda bir yer tutucu varsa çalışır)
Ralph

2
@ user3705478: @PathParambir javax.ws.rs ek açıklamasıdır. docs.oracle.com/javaee/7/api/javax/ws/rs/PathParam.html
Ralph

112

@RequestParam ek açıklaması, istekten sorgu parametre değerlerine erişmek için kullanılır. Aşağıdaki istek URL'sine bakın:

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

Yukarıdaki URL isteğinde, param1 ve param2 değerlerine aşağıdaki gibi erişilebilir:

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

@RequestParam ek açıklaması tarafından desteklenen parametrelerin listesi aşağıdadır:

  • defaultValue - İstek değere sahip değilse veya boşsa, bir geri dönüş mekanizması olarak varsayılan değerdir.
  • name - Bağlanacak parametrenin adı
  • gerekli - Parametrenin zorunlu olup olmadığı. Doğruysa, bu parametrenin gönderilmemesi başarısız olur.
  • value - Bu, name özelliği için bir takma addır

@PathVariable

@ PathVariable , gelen istek için URI'de kullanılan kalıbı tanımlar. Aşağıdaki istek URL'sine bakalım:

http: // localhost: 8080 / springmvc / merhaba / 101 Param1 = 10 & param2 = 20

Yukarıdaki URL isteği Spring MVC'nize aşağıdaki gibi yazılabilir:

@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 ek açıklamasında istek URI şablonunu bağlamak için yalnızca bir özellik değeri vardır. Tek bir yöntemde çoklu @ PathVariable ek açıklamasının kullanılmasına izin verilir . Ancak, birden fazla yöntemin aynı kalıba sahip olmadığından emin olun.

Ayrıca daha ilginç bir ek açıklama var: @MatrixVariable

http: // localhost: 8080 / spring_3_2 / matrixvars / hisse; BT.A = 276,70 + 10.40 + 3.91; AZN = 236.00, 103.00 +, + 3.29; SBRY = 375,50 + 7.60 + 2.07

Ve bunun için Controller yöntemi

 @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";
  }

Ancak şunları etkinleştirmelisiniz:

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

Bir dize, örneğin userNamebir param türü olup olmayacak mı? Değişken yapmaya yöneliyorum, ama bu bir param olabilir.
cst1992


Can @PathParamve @RequestParamkullanılmadan beyan edilmesi@RequestMapping
sofs1

29

@RequestParam şu sorgu parametresi (statik değerler) için kullanılır: http: // localhost: 8080 / hesaplama / pow? Base = 2 & ext = 4

@PathVariable, http: // localhost: 8080 / hesaplama / sqrt / 8 gibi dinamik değerler için kullanılır

@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;
}

12

1) sorgu parametrelerini@RequestParam çıkarmak için kullanılır

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, verileri doğrudan URI'den ayıklamak için kullanılır:

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) @RequestParamverilerin çoğunlukla sorgu parametrelerinde iletildiği geleneksel bir web uygulamasında daha yararlı olurken @PathVariable, URL'nin değer içerdiği RESTful web hizmetleri için daha uygundur.

3) @RequestParamaçıklama, bir özellik kullanılarak bir sorgu parametresi mevcut değilse veya boş değilse , gerekli özellik olması koşuluyla varsayılan değerleri belirtebilir :defaultValuefalse

@RestController
@RequestMapping("/home")
public class IndexController {

    @RequestMapping(value = "/name")
    String getName(@RequestParam(value = "person", defaultValue = "John") String personName) {
        return "Required element of request param";
    }

}

1
@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) {

}

1

Her iki ek açıklama da aynı şekilde davranır.

Sadece 2 özel karakter '!' ve '@' @PathVariable ve @RequestParam ek açıklamaları tarafından kabul edilir.

Davranışı kontrol etmek ve onaylamak için yalnızca 1 denetleyici içeren bir yay önyükleme uygulaması oluşturdum.

 @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;
    }
}

Aşağıdaki istekleri vurmak aynı yanıtı aldım:

  1. ! Localhost: 7000 / pVar / @ # $% ^ & * () _ + - = [] {} |; ':"/ <>.?
  2. ?! Localhost: 7000 / rpvar param = @ # $% ^ & * () _ + - = [] {} |; ':"/ <>.?

! @ her iki istekte de yanıt olarak alındı


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.