Это портативный для ссылки на карту параметров запроса после цикла запроса? - PullRequest
2 голосов
/ 28 июля 2010

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

Окончательная спецификация указывается только на странице 203:

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

Но мне не ясно:

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

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

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

Ответы [ 3 ]

2 голосов
/ 02 августа 2010

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

она неизменна в 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);
}
1 голос
/ 28 июля 2010

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

0 голосов
/ 28 июля 2010

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

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

    parameters = new HashMap();
    parameters = copyMap(getRequest().getParameterMap());
    mergeParameters();
    parsedParams = true;
...