2009-06-17 4 views
9

En ASP, hay atributos request.form y request.queryString, pero en Java. Parece que tenemos una sola colección, que se puede acceder a través de request.getParamaterMap, getParametersNames, etc. getParameterValues¿Cómo determinar si un parámetro ha sido "publicado" o "generado" desde Java?

¿Hay alguna manera de saber qué valores se han publicado y cuáles se han especificado en la URL?


PS:

Lo que estoy tratando de lograr es hacer una página que puede manejar la siguiente situación

  • Lea las variables que vinieron de la cadena de consulta (GET)
  • Lea una sola publicación con un nombre determinado ("xml", por ejemplo).
  • Si esa publicación falta, lea todo el cuerpo (con request.getReader()).

estoy usando Tomcat 6.

De acuerdo con lo que he visto hasta ahora, si bien expedir un request.getReader(), valores POST ya no aparece en la colección getParamater, sin embargo, los parámetros de cadena de consulta siguen ahí.

Por otro lado, si emito alguno de los métodos getParameters, getReader devuelve cadena vacía.

Parece que no puedo comer la torta y comerla también.

tanto, creo que la solución es la folowwing:

  • leer el cuerpo con getReader.
  • A ver si el mensaje XML está allí (lado negativo, tengo que analizar manualmente el cuerpo.
  • Si es así, obtener el cuerpo del mensaje HTTP y deshacerse de la "xml =" parte.
  • Si no es , bueno, acaba de obtener el cuerpo
  • leer los parámetros de cadena de consulta a través request.getParameter

Cualquier idea mejor

  • PS:.? ¿alguien sabe cómo analizar el cuerpo utilizando el mismo método utilizado por HttpServlet?
  • PS: Here es una función de decodificación ASP. ¿Debería reescribirlo en Java?
  • PS: También found (no tienen una máquina para probar que en este momento)

Solo para aclarar las cosas.El problema parece ser que con getParameter te valores, así como valores pasados ​​con la URL informados, considere el siguiente ejemplo:

<%@page import="java.util.*"%> 
<% 
    Integer i; 
    String name; 
    String [] values; 

    for (Enumeration e = request.getParameterNames(); e.hasMoreElements();) { 

    name = (String) e.nextElement(); 
    values = request.getParameterValues(name); 

    for (i=0; i < values.length; i ++) { 
     out.println(name + ":" + values[i] + "<br/>"); 
    } 
    } 
%> 

<html> 
<head><title>param test</title> 
</head> 
<body> 
    <form method="post" action="http://localhost:8080/jsp_debug/param_test.jsp?data=from_get"> 
    <input type="text" name="data" value="from_post"> 
    <input type="submit" value="ok"> 
    </form> 
</body> 
</html> 

la salida de este código es

data:from_get 
data:from_post 

... 

Parece que con el fin para encontrar el parámetro que vino de donde, tengo que marcar request.getQueryString.

+0

qué servidor está utilizando? el sol HttpServer? – gubby

+0

Debería obtener la URL completa y deserializar los parámetros. si su parámetro deseado está allí, es un GET. Si no está allí, pero existe, entonces es un parámetro POST. – PSyLoCKe

Respuesta

5

Sin camino directo. No directo - marque .getQueryString()

1

¿Por qué no comienza con la comprobación de los parámetros de cadena de consulta, si no ve ninguno, asume una publicación y luego extrae las variables de formulario?

+0

los parámetros querystrings no son un problema, supongo que siempre los tendré cerca ... el problema es que una vez que publico getReader, getParamters ya no devuelve los valores publicados ... y esperaba evitar analizar la publicación yo mismo ... – opensas

2

Si está escribiendo un servlet, se puede hacer esa distinción en función de si se invoca la doGet o doPost método.

public void doGet(HttpServletRequest request, 
        HttpServletResponse response) 
     throws ServletException{ 

//Set a variable or invoke the GET specific logic 
    handleRequest(request, response); 

} 

public void doPost(HttpServletRequest request, 
        HttpServletResponse response) 
     throws ServletException{ 

//Set a variable or invoke the POST specific logic 
handleRequest(request, response); 

} 


public void handleRequest(HttpServletRequest request, 
        HttpServletResponse response) 
     throws ServletException{ 

//Do stuff with the request 

} 
+1

usted puede tener una publicación con obtener información, vea mi comentario a matt b – opensas

22

HttpServletRequest.getMethod():

Devuelve el nombre del método HTTP con el que se hizo esta petición, por ejemplo, GET, POST, PUT o. Igual que el valor de la variable CGI REQUEST_METHOD.

Todo lo que necesita hacer es esto:

boolean isPost = "POST".equals(request.getMethod()); 

También estoy realmente confundido acerca de por qué usted no sólo tiene que utilizar request.getParameter("somename") para recuperar los valores enviados como parámetros de la petición. Este método returns the parameter regardless of whether the request was sent via a GET or a POST:

Los parámetros de solicitud son información adicional que se envía con la solicitud. Para los servlets HTTP, los parámetros están contenidos en la cadena de consulta o en los datos del formulario publicado.

Es muchísimo más simple que intentar analizar getQueryString() usted mismo.

+0

Si la publicación se hizo usando el cuerpo de http, en lugar de un parámetro, no puedo obtenerlo con request.getParameter ("somename"), tengo que use request.getReader() ... y después de eso ya no puedo usar la solicitud.getParameter – opensas

+2

también, no olvides que puedo tener una publicación con información de cadena de consulta, (solo necesitas algo como 'xx.jsp? field1 = value1, field2 = value2' en el parámetro de acción de la etiqueta de formulario), en ese caso, request.getMethod devolvería "POST", pero tendría los parámetros "publicados" y "calculados" todos mezclados en la colección getParameter ... ese es el problema ... – opensas

+0

Bueno, creo que está usando una terminología diferente o incorrecta para describir tu problema entonces Leer datos de postdata o multiparte es diferente a leer solo "parameters" –

Cuestiones relacionadas