@RequestParam vs @PathVariable

¿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 aceptó como + .

  • @PathVariable es obtener algún marcador de posición del URI (Spring lo llama una plantilla de URI) – ver Spring Reference Chapter 16.3.2.2 Patrones de plantillas de URI
  • @RequestParam debe obtener un parámetro del URI: consulte el Capítulo 16.3.3.3 de la Referencia de spring para los parámetros del método con @RequestParam.

Si la URL http://localhost:8080/MyApp/user/1234/invoices?date=12-05-2013 obtiene las facturas para el usuario 1234 el 5 de diciembre de 2013, el método del controlador sería:

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

Además, los parámetros de solicitud pueden ser opcionales y, a partir de Spring 4.3.3, las variables de ruta también pueden ser opcionales . Sin embargo, tenga cuidado: esto podría cambiar la jerarquía de ruta de URL e introducir conflictos de asignación de solicitudes. Por ejemplo, ¿ /user/invoices proporcionaría las facturas del usuario null o detalles sobre un usuario con “facturas” de identificación?

Anotación @RequestParam utilizada para acceder a los valores del parámetro de consulta de la solicitud. Mira la siguiente URL de solicitud:

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

En la solicitud de URL anterior, se puede acceder a los valores de param1 y param2 de la siguiente manera:

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

La siguiente es la lista de parámetros admitidos por la anotación @RequestParam:

  • defaultValue : este es el valor predeterminado como mecanismo de reserva si la solicitud no tiene el valor o está vacía.
  • name – Nombre del parámetro a vincular
  • obligatorio : si el parámetro es obligatorio o no. Si es verdadero, al no enviar ese parámetro fallará.
  • valor : este es un alias para el atributo de nombre

@PathVariable

@ PathVariable identifica el patrón que se utiliza en el URI para la solicitud entrante. Veamos la URL de solicitud siguiente:

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

La solicitud de URL anterior puede escribirse en Spring MVC de la siguiente manera:

 @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 solo tiene un valor de atributo para enlazar la plantilla de URI de solicitud. Está permitido usar la anotación multiple @ PathVariable en el único método. Pero asegúrese de que no más de un método tenga el mismo patrón.

También hay una anotación más interesante: @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

Y el método del controlador para ello

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

Pero debes habilitar:

  

puede ser que la aplicación / x-www-form-urlencoded midia type convierta el espacio en + , y el receptor decodificará los datos al convertir + a space.check the url para obtener 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 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) { }