2011-07-27 16 views
43

En HttpServletRequest, getParameterMap devuelve un Mapa de todos los parámetros de cadena de consulta y parámetros de datos de publicación.HttpServletRequest - Obtener los parámetros de cadena de búsqueda, sin datos de formulario

¿Hay alguna manera de obtener un Mapa de ÚNICAMENTE los parámetros de cadena de consulta? Estoy tratando de evitar usar getQueryString y analizar los valores.

+1

¿Qué quiere decir? Solo puede haber parámetros 'GET' o' POST' allí, nunca ambos. – Jacob

+15

Puede tener ambos ... puede tener parámetros de cadena de consulta en una solicitud POST. Y en ese caso, todos son devueltos por "getParameterMap" – JasonStoltz

+0

Oh, está bien. ¿Por qué uno necesita ambos, solo curiosidad? – Jacob

Respuesta

18

Al contrario de lo que dijo cularis, puede haber ambos en el mapa de parámetros.

La mejor forma que veo es utilizar el parámetro MapMap y para cada recuperación de parámetros comprobar si queryString contiene "&? <parameterName> =".

Tenga en cuenta que parameterName debe codificarse en la URL antes de poder realizar esta comprobación, como señaló Qerub.

Eso le ahorra el análisis y aún le da solo los parámetros de URL.

+1

¡Gran sugerencia! Definitivamente estoy tratando de evitar el análisis – JasonStoltz

+2

Tenga en cuenta que 'parameterName' necesita ser URL codificada antes de que se pueda realizar esta verificación. – qerub

+0

@Qerub: Buena captura, gracias. – DoubleMalt

2

Me temo que no hay forma de obtener los parámetros de cadena de consulta analizados por separado de los parámetros de la publicación. Por cierto, el hecho de que dicha API ausente puede significar que probablemente deba verificar su diseño. ¿Por qué está utilizando cadena de consulta al enviar POST? Si realmente desea enviar más datos a la URL, use una convención similar a REST, p. en lugar de enviar

http://mycompany.com/myapp/myservlet?first=11&second=22

dicen:

http://mycompany.com/myapp/myservlet/11/22

+0

Estoy usando el parámetro de cadena de consulta en una POST porque quiero mantener todas y cada una de las cadenas de consulta pasadas al formulario original a través de la POST. Esto es principalmente para fines de seguimiento ... no estoy seguro de que la convención de tipo REST funcione en este caso, porque estoy bastante seguro de que la biblioteca de seguimiento busca parámetros específicos en la cadena de consulta. – JasonStoltz

+0

¿Alguna razón, en particular, para recomendar el uso de la convención similar a REST a un parámetro de cadena de consulta? ¿No estoy seguro de entender cuál es la ventaja? – JasonStoltz

+6

"Por cierto, el hecho de que dicha API esté ausente puede significar que probablemente deba verificar su diseño". En este caso, significa que Oracle debe verificar su diseño :) –

15

La API de servlet carece de esta característica, ya que fue creado en un momento en que muchos creían que la cadena de consulta y el cuerpo del mensaje era sólo dos diferentes formas de enviar parámetros, sin darse cuenta de que los propósitos de los parámetros son fundamentalmente diferentes. ?

Los parámetros de cadena de consulta foo = bar son una parte de la URL, ya que están involucrados en la identificación de un recurso (que podría ser una colección de muchos recursos), al igual que "todas las personas de 42 años":

GET/personas? edad = 42

Los parámetros del cuerpo del mensaje en POST o PUT están allí para expresar una modificación en el (los) recurso (s) de destino. ? Establecer un valor para el atributo de "pelo" fx:

PUT/personas de edad = 42

pelo = gris

lo que es definitivamente REST utilizar ambos parámetros de consulta y los parámetros del cuerpo al mismo tiempo , separados para que pueda usarlos para diferentes propósitos. La característica definitivamente falta en la API del servlet de Java.

42

Usted puede utilizar request.getQueryString(), si la cadena de consulta es como

username=james&password=pwd 

Para obtener el nombre se puede hacer esto

request.getParameter("username"); 
+0

Esto es para usar en las páginas del servidor Java. – Jorgesys

+1

el segundo estropeará la secuencia de solicitud, supongo que la pregunta es cómo obtener el nombre de usuario y mantener la secuencia de entrada para su posterior procesamiento –

5

Como las otras respuestas indican que no hay manera conseguir los parámetros de cadena de consulta utilizando servlet Api.

Por lo tanto, creo que la mejor manera de obtener parámetros de consulta es analizar la cadena de consulta usted mismo. (Es más complicado iterar sobre los parámetros y verificar si la cadena de consulta contiene el parámetro)

Escribí a continuación el código para obtener los parámetros de la cadena de consulta. Usando apache StringUtils y ArrayUtils.

public static Map<String, String[]> getQueryParameters(HttpServletRequest request) { 
    Map<String, String[]> queryParameters = new HashMap<>(); 
    String queryString = request.getQueryString(); 

    if (StringUtils.isEmpty(queryString)) { 
     return queryParameters; 
    } 

    String[] parameters = queryString.split("&"); 

    for (String parameter : parameters) { 
     String[] keyValuePair = parameter.split("="); 
     String[] values = queryParameters.get(keyValuePair[0]); 
     values = ArrayUtils.add(values, keyValuePair.length == 1 ? "" : keyValuePair[1]); //length is one if no value is available. 
     queryParameters.put(keyValuePair[0], values); 
    } 
    return queryParameters; 
} 
+0

Considero que es mucho mejor que la respuesta aceptada, no sé por qué para evitar el análisis de cadena de consulta porque crear proxy no es mejor solución –

Cuestiones relacionadas