Как определить, был ли параметр "отправлен" или "получен" из Java?

В 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.

Ответ 1

HttpServletRequest.getMethod():

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

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

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

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

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

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

Ответ 2

Нет прямого пути. Непрямая проверка .getQueryString()

Ответ 3

Если вы пишете сервлет, вы можете сделать это различие с помощью метода 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

}

Ответ 4

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

Ответ 5

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

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

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

Ответ 6

Я сделал это внутри моего фильтра, так что, возможно, когда-нибудь кто-нибудь сможет использовать это.

public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse,FilterChain filterChain) throws IOException, ServletException {
    HttpServletRequest sreq = (HttpServletRequest)servletRequest;
    System.out.println(sreq.getMethod());
}