Можно ли ссылаться на карту параметров запроса после цикла запроса?

Я хотел бы знать, соответствует ли он спецификации сервлета Java 2.5 для ссылки/сохранения возвращаемого значения request.getParameterMap() между запросами.

В окончательной спецификации указано только на странице 203:

Возвращает: неизменяемый java.util.Map, содержащий имена параметров в качестве ключей и значения параметров в качестве значений сопоставления. Ключи в карте параметров имеют тип String. Значения в карте параметров имеют тип массива строк.

Но мне непонятно:

  • если карта неизменна только для приложения, а не для сервера приложений

  • если разрешено, что сервер приложений может повторно использовать экземпляр для другого запроса (например, если параметры и их значения такие же, как в предыдущем запросе)

EDIT: Причина этого: я хотел бы сохранить карту запросов для каждого запроса и в случае ошибки распечатать их для диагностических целей.


person MRalwasser    schedule 28.07.2010    source источник
comment
Это дизайнерский запах. Пожалуйста, уточните функциональное требование :) Вероятно, есть лучшие решения, чем это.   -  person BalusC    schedule 28.07.2010
comment
@BalusC: я хотел бы сохранить карты запросов для каждого запроса, а в случае ошибки я хотел бы распечатать каждую карту параметров (и другие вещи) для диагностических целей.   -  person MRalwasser    schedule 29.07.2010


Ответы (3)


если карта неизменна только для приложения, а не для сервера приложений

Это неизменно в API, да. Тоже имеет смысл, какой смысл менять карту параметров запроса? Реализация контейнера сервлетов, в свою очередь, может, конечно, содержать его изменяемую карту «за кулисами». Но вам не следует беспокоиться о конкретных деталях реализации.

если разрешено, что сервер приложений может повторно использовать экземпляр для другого запроса (например, если параметры и их значения такие же, как в предыдущем запросе)

Нет, сервер этого не делает. Он просто создает новый. Параметры привязаны к конкретному запросу.

Если вы хотите собирать параметры каждого запроса во время сеанса, то вам нужно сделать это самостоятельно. Лучшим местом для этого будет Filter.

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws ServletException, IOException {
    HttpServletRequest hsr = (HttpServletRequest) request;
    List<Map<String, String[]>> allParameters = (List<Map<String, String[]>>) hsr.getSession().getAttribute("allParameters");
    if (allParameters == null) {
        allParameters = new ArrayList<Map<String,String[]>>();
        hsr.getSession().setAttribute("allParameters", allParameters);
    }
    allParameters.add(hsr.getParameterMap());
    chain.doFilter(request, response);
}
person BalusC    schedule 02.08.2010

Во всех смыслах и целях вы не можете изменить содержимое карты. Однако, если вы хотите сохранить для дальнейшего использования, вы всегда можете создать новую собственную карту, скопировать все пары ключ/значение и сохранить ее в сеансе, т.е. (Это вызовет фанки, если у пользователя одновременно открыты 2 окна, но эта история для другого раза...)

person Tassos Bassoukos    schedule 28.07.2010
comment
это то, что я делаю в настоящее время, чтобы быть в безопасности. Но, конечно, менее эффективно, чем использование экземпляра напрямую. это было намерением, почему я задал этот вопрос. - person MRalwasser; 01.08.2010

Я думаю, вы можете смело сохранить его для следующего запроса. Я все время это делаю.

Не уверен насчет других реализаций. Он создает новый HashMap для каждого запроса в Tomcat,

    parameters = new HashMap();
    parameters = copyMap(getRequest().getParameterMap());
    mergeParameters();
    parsedParams = true;
person ZZ Coder    schedule 28.07.2010
comment
первые две строки вашего кода странные. Сначала вы инициализируете переменную, а затем сразу переназначаете ее чему-то еще? Это не может быть то, что вы имели в виду... - person Sean Patrick Floyd; 28.07.2010
comment
Код от Tomcat. Было бы полезно, если бы в copyMap() использовались параметры, но это не так. - person ZZ Coder; 28.07.2010