¿Cuál es la diferencia entre @RequestParam
y @PathVariable
al manejar caracteres especiales?
+
fue aceptado por @RequestParam
como espacio.
En el caso de @PathVariable
, +
se aceptaba como +
.
@PathVariable
es para obtener algún marcador de posición del URI (Spring lo llama Plantilla URI)@RequestParam
es para obtener un parámetro del URI también - ver Referencia Spring Capítulo 16.3.3.3 Vinculación de parámetros de petición a parámetros de método con @RequestParamSi la URL http://localhost:8080/MyApp/user/1234/invoices?date=12-05-2013
obtiene las facturas del usuario 1234 el 5 de diciembre de 2013, el método del controlador tendría el siguiente aspecto:
@RequestMapping(value="/user/{userId}/invoices", method = RequestMethod.GET)
public List<Invoice> listUsersInvoices(
@PathVariable("userId") int user,
@RequestParam(value = "date", required = false) Date dateOrNull) {
...
}
Además, los parámetros de petición pueden ser opcionales, y a partir de Spring 4.3.3 las variables de ruta también pueden ser opcionales. Sin embargo, hay que tener cuidado, ya que esto puede cambiar la jerarquía de rutas de las URLs e introducir conflictos de mapeo de peticiones. Por ejemplo, ¿proporcionaría /user/invoices
las facturas del usuario null
o detalles sobre un usuario con ID "invoices"?
@RequestParam anotación utilizada para acceder a los valores de los parámetros de consulta de la solicitud. Observe la siguiente URL de solicitud:
http://localhost:8080/springmvc/hello/101?param1=10¶m2=20
En la solicitud de la URL anterior, se puede acceder a los valores de param1 y param2 como se indica a continuación:
public String getDetails(
@RequestParam(value="param1", required=true) String param1,
@RequestParam(value="param2", required=false) String param2){
...
}
A continuación se muestra la lista de parámetros admitidos por la anotación @RequestParam:
@VariableDeRuta
@PathVariable identifica el patrón que se utiliza en el URI para la solicitud entrante. Veamos la siguiente URL de solicitud:
http://localhost:8080/springmvc/hello/101?param1=10¶m2=20
La solicitud de URL anterior puede escribirse en su Spring MVC como se indica a continuación:
@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){
.......
}
La anotación @PathVariable sólo tiene un valor de atributo para vincular la plantilla URI de la solicitud. Se puede utilizar la anotación @PathVariable varias veces en el mismo método. Pero, asegúrese de que no hay más de un método con el mismo patrón.
También hay otra anotación interesante: @@MatrixVariable
Y el método del Controlador para ello
@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";
}
Pero debes habilitarlo:
<mvc:annotation-driven enableMatrixVariables="true" >
@RequestParam se usa para parámetros de consulta (valores estáticos) como: http://localhost:8080/calculation/pow?base=2&ext=4
@PathVariable se usa para valores dinámicos como : 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;
}
puede ser que el tipo de midia application/x-www-form-urlencoded convierta el espacio en +, y el receptor decodifique los datos convirtiendo el + en espacio.comprueba la url para más información.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<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) {
}