Qual é a diferença entre @RequestParam
e @PathVariable
ao lidar com caracteres especiais?
O +' foi aceite por
@RequestParam' como espaço.
No caso de @PathVariable
, +
foi aceito como +
.
@RequestParam
é obter um parâmetro do URI também - ver Spring Reference Chapter 16.3.3.3 Binding request parameters to method parameters with @RequestParamSe 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 seria o mesmo:
@RequestMapping(value="/user/{userId}/invoices", method = RequestMethod.GET)
public List<Invoice> listUsersInvoices(
@PathVariable("userId") int user,
@RequestParam(value = "date", required = false) Date dateOrNull) {
...
}
Além disso, parâmetros de requisição podem ser opcionais, e a partir da Primavera 4.3.3 variáveis de caminho também podem ser opcionais. Mas cuidado, isso pode alterar a hierarquia de caminhos de URLs e introduzir conflitos de mapeamento de requisição. Por exemplo, o /usuário/faturas
forneceria as faturas do usuário nulo
ou detalhes sobre um usuário com ID "faturas"?
@RequestParam anotação utilizada para acessar os valores dos parâmetros da consulta a partir do pedido. Veja a seguinte URL da requisição:
http://localhost:8080/springmvc/hello/101?param1=10¶m2=20
No pedido de URL acima, os valores para param1 e param2 podem ser acessados como abaixo:
public String getDetails(
@RequestParam(value="param1", required=true) String param1,
@RequestParam(value="param2", required=false) String param2){
...
}
A lista de parâmetros suportados pela anotação @RequestParam é a seguinte:
**@PathVariable***
@PathVariable identifica o padrão que é usado no URI para a solicitação de entrada. Vejamos o URL da requisição abaixo:
O pedido de URL acima pode ser escrito no seu Spring MVC como 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 tem apenas um valor de atributo para vincular o modelo URI da requisição. É permitido usar a anotação múltipla @PathVariable no método único. Mas, certifique-se de que não há mais de um método que tenha o mesmo padrão.
Também há mais uma anotação interessante: **@MatrixVariable***
E o método Controlador para isso.
@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";
}
Mas você deve habilitar:
<mvc:annotation-driven enableMatrixVariables="true" >
pode ser que a aplicação/x-www-form-urlencoded midia tipo converta o espaço para +, e o receptor irá decodificar os dados convertendo o ++ para space.check the url for more info.http://www.w3.org/TR/html401/interact/forms.html#h-17.13.4.1