Как определить, был ли параметр «опубликован» или «получен» из Java? - PullRequest
10 голосов
/ 18 июня 2009

В ASP есть атрибуты request.form и request.queryString, но в Java. Кажется, у нас есть только одна коллекция, к которой можно получить доступ через request.getParamaterMap, getParametersNames, getParameterValues и т. Д.

Есть ли способ узнать, какие значения были опубликованы, а какие указаны в URL-адресе?


PS:

Я пытаюсь создать страницу, которая может справиться со следующей ситуацией

  • Считать переменные, которые пришли из строки запроса (get)
  • Прочитать один пост с определенным именем (например, "xml").
  • Если этот пост отсутствует, прочитайте все тело (с request.getReader()). * * Тысяча двадцать-одна

Я использую Tomcat 6.

Согласно тому, что я видел до сих пор, если я выдаю request.getReader(), опубликованные значения больше не отображаются в коллекции getParamater, тем не менее параметры строки запроса все еще там.

С другой стороны, если я использую какой-либо из методов getParameters, getReader возвращает пустую строку.

Похоже, я не могу получить торт и съесть его.

Итак, я думаю, что решение заключается в следующем:

  • Прочитать тело с getReader.
  • Посмотрите, есть ли сообщение xml (недостаток, я должен вручную проанализировать тело.
  • Если это так, получите тело сообщения http и избавьтесь от части "xml =".
  • Если это не так, просто возьмите тело.
  • Считать параметры строки запроса через request.getParameter

Есть идея получше?

  • PS: кто-нибудь знает, как анализировать тело, используя тот же метод используется HttpServlet?
  • PS: Здесь - функция декодирования ASP. Должен ли я просто переписать это в Java?
  • PS: Также найдено (сейчас у вас нет машины для проверки)

Просто чтобы уточнить вещи. Кажется, проблема в том, что с getParameter вы получаете опубликованные значения, а также значения, переданные с помощью URL, рассмотрим следующий пример:

<%@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>

вывод этого кода

data:from_get
data:from_post

...

Похоже, для того, чтобы узнать, откуда и откуда пришел параметр, я должен проверить request.getQueryString.

Ответы [ 5 ]

25 голосов
/ 18 июня 2009

HttpServletRequest.getMethod ()

Возвращает имя метода HTTP, с помощью которого был сделан этот запрос, например, GET, POST или PUT. То же, что и значение переменной CGI REQUEST_METHOD.

Все, что вам нужно сделать, это:

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

Также меня очень смущает, почему бы вам просто не использовать request.getParameter("somename") для получения значений, отправленных в качестве параметров запроса. Этот метод возвращает параметр независимо от того, был ли запрос отправлен с помощью GET или POST :

Параметры запроса - дополнительная информация, отправляемая вместе с запросом. Для HTTP-сервлетов параметры содержатся в строке запроса или в опубликованных данных формы.

Это намного проще, чем пытаться разобрать getQueryString() самостоятельно.

5 голосов
/ 18 июня 2009

Прямого пути нет. Непрямой - проверьте .getQueryString ()

2 голосов
/ 18 июня 2009

Если вы пишете сервлет, вы можете сделать это различие по тому, вызывается ли метод doGet или doPost .

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 голос
/ 18 июня 2009

Почему бы вам не начать с проверки параметров строки запроса, если вы не видите ни одного, создать сообщение, а затем выкопать переменные формы?

0 голосов
/ 18 июня 2009

Я знаю, что это не решит вашу проблему, но если я правильно помню, при использовании Struts ActionForm будет заполняться, если ваши переменные отправляются в строке запроса или в теле сообщения.

Я нашел исходный код для класса RequestUtils, возможно, вам нужен метод "заполнить":

http://svn.apache.org/repos/asf/struts/struts1/trunk/core/src/main/java/org/apache/struts/util/RequestUtils.java

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...