@RequestParam vs @PathVariable

Qual é a diferença entre @RequestParam e @PathVariable ao manipular caracteres especiais? + foi aceito por @RequestParam como espaço. No caso de @PathVariable , + foi aceito como + .

  • @PathVariable é obter algum alocador de espaço do URI (o Spring chama de Modelo de URI) – consulte o Spring Reference Chapter 16.3.2.2 Padrões de modelo de URI
  • @RequestParam é obter um parâmetro do URI também – consulte Spring Reference Chapter 16.3.3.3 parameters de solicitação de binding para parâmetros de método com @RequestParam

Se a URL http://localhost:8080/MyApp/user/1234/invoices?date=12-05-2013 receber as faturas do usuário 1234 em 5 de dezembro de 2013, o método do controlador será semelhante a:

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

Além disso, os parâmetros de solicitação podem ser opcionais e, a partir do Spring 4.3.3, as variables ​​de caminho também podem ser opcionais . Cuidado, porém: isso pode alterar a hierarquia de caminho de URL e introduzir conflitos de mapeamento de solicitação. Por exemplo, o /user/invoices forneceria as faturas para o usuário null ou os detalhes sobre um usuário com o ID “invoices”?

Anotação @RequestParam usada para acessar os valores do parâmetro de consulta da solicitação. Veja o seguinte URL de solicitação:

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

Na solicitação de URL acima, os valores para param1 e param2 podem ser acessados ​​conforme abaixo:

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

A seguir, a lista de parâmetros suportados pela anotação @RequestParam:

  • defaultValue – Esse é o valor padrão como um mecanismo de fallback se a solicitação não estiver com o valor ou estiver vazia.
  • name – nome do parâmetro a ser ligado
  • obrigatório – se o parâmetro é obrigatório ou não. Se for verdade, falhar ao enviar esse parâmetro falhará.
  • valor – este é um alias para o atributo name

@PathVariable

@ PathVariable identifica o padrão que é usado no URI para o pedido recebido. Vamos ver o URL de solicitação abaixo:

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

A solicitação de URL acima pode ser escrita em seu Spring MVC, conforme abaixo:

 @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){ ....... } 

A anotação @ PathVariable possui apenas um valor de atributo para vincular o modelo de URI de solicitação. É permitido usar a anotação múltipla @ PathVariable no método único. Mas, assegure-se de que não mais do que um método tenha o mesmo padrão.

Além disso, há mais uma anotação interessante: @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

E o método do controlador para isso

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

Mas você deve habilitar:

  

pode ser que o tipo de midia application / x-www-form-urlencoded converta espaço para + , e o receptor decodificará os dados convertendo o + para space.check the url para mais informações. http://www.w3.org/TR/html401/interact/forms.html#h-17.13.4.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 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) { }