2011-08-06 7 views
7

¿Es posible analizar las claves de cadena de una solicitud como esta, con la API de servlet de Java?Análisis asociativo de parámetros de solicitud de matriz con Java Servlet

http://localhost:8080/?assocArray[key1]=value1&assocArray[key2]=value2&assocArray[key3]=value3 

getParameterValues("assocArray") returns ["value3","value1","value1"] 

El orden de los valores en la matriz devuelta no es el fin de las teclas (No es que importe)

resuelto: Es posible, las teclas se interpretan como simples cadenas globales clave. Java no los reconoce como una matriz. Utilice regex

+3

"Usar regex", ¿me perdonas? – BalusC

Respuesta

10

No directamente. El [] no tiene un significado especial en los parámetros de solicitud de HTTP y no se reconocen como claves de matriz por la API del servlet (¿quizás era usted un programador de PHP que tiene un analizador patentado para esto?). Debe analizar y recopilar usted mismo en un bucle.

Por ejemplo,

Map<String, String> assocArray = new LinkedHashMap<String, String>(); 

for (Entry<String, String[]> entry : request.getParameterMap().entrySet()) { 
    String name = entry.getKey(); 

    if (name.startsWith("assocArray[")) { 
     String key = name.substring(name.indexOf('[') + 1, name.indexOf(']')); 
     assocArray.put(key, entry.getValue()[0]); 
    } 
} 
1

No es posible, AFAIK. El protocolo HTTP especifica clave & valor sólo, sin key[key]=value

Utilice la matriz de cadenas por el índice - values[0], values[1], etc.

Usted puede hacer algo de procesamiento previo - request.getParameterMap(..) utilizar, analizar la sintaxis foo[bar] a sí mismo, y lo puso en un Map<String, String>

17

Usted puede tener varios valores para el mismo nombre de parámetro:

http://localhost:8080/?param1=value1&param1=value2&param1=value3 

En este caso, getParameterValues("param1") devolverá un String[] que contiene 3 elementos: "value1", "value2" y "value3".

En el ejemplo que proporcionó, definió 3 parámetros diferentes: assocArray[key1], assocArray[key2] y assocArray[key3]. La API de servlet los considerará como 3 parámetros totalmente diferentes que no tienen nada en común. Por lo tanto, debe llamar al getParameter("assocArray[key1]") para obtener "value1", getParameter("assocArray[key2]") para obtener "value2", etc.

1

resuelto: Es posible, las teclas se interpretan como simples cadenas globales clave. Java no los reconoce como una matriz. Use regex

Java no los reconoce como (elementos de) una matriz porque las especificaciones URL/URI no dicen que representan una matriz. No debe esperar bibliotecas Java (u otras) para implementar sintaxis personalizadas que esencialmente ha sacado del aire.

Usar expresiones regulares para analizar la entrada generalmente es una mala idea. Para las URL (completas) es una mala idea porque hay una gran variedad de maneras complicadas de codificar las URL, y es difícil para una expresión regular tener esto en cuenta.

(Si está utilizando una expresión regular para dividir un solo parámetro de solicitud, debe estar bien porque la infraestructura de Servlet ya habrá tratado el análisis de URL principal y tratado con% -encoding, etc.)


También me gustaría señalar que la sintaxis de la cadena de consulta es frágil. Está utilizando los caracteres '[' y ']' sin escapar de ellos. De acuerdo con las especificaciones de URL/URI, son "caracteres reservados" y deben escaparse cuando se utilizan como "datos". Probablemente se saldrá con la suya en la mayoría de los contextos, pero las aplicaciones que requieren URI estrictamente conformes rechazarán sus URL.

Cuestiones relacionadas