Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java EE (J2EE) и Spring > Передача параметров при sendRedirect(...)


Автор: LjaO 10.9.2009, 11:01

Идея состоит в том что бы словить request, добавить в него параметр, и отслать обратно баузеру для повторной посылки.
В случае когда в запросе никаких параметров не было - всё работало отлично. Если же у меня есть некоторые параметры в запросе - при редиректе они теряются и остаётся только мой добавленный.
Ниже описана проблема потери старых параметров при sendRedirect() и так же преобразование в ljava.lang.String параметров доставаемых из getParametrsMap()

Самое простое решение, которое я сейчас вижу - это взять все параметры из request и добавить их в url вместе с новым параметром.
Но к сожалению тут я наткнулся на проблему.

Код

StringBuffer url = request.getRequestURL().append("?serverID=2");
Enumeration keys = request.getParameterNames();
while(keys.hasMoreElements())
{
     Object key = keys.nextElement();
     Object value = request.getParameterMap().get(key);
     url.append("&").append(key).append("=").append(value);
}
response.sendRedirect(url.toString());


В итоге запрос имеет вид 
".../luser/filter.action2?SERVERID=2&autoRefresh=[Ljava.lang.String@d2bd3f&...." 
вместо 
".../luser/filter.action2?SERVERID=2&autoRefresh=1?...."

Может кто мне подсказать - как  эту проблему победить?

Автор: garbuz 10.9.2009, 12:08
Цитата(LjaO @  10.9.2009,  11:01 Найти цитируемый пост)
[Ljava.lang.String@d2bd3f&...

Насколько я помню, это массив, посмотрите точно, что вы передаете в качестве значения.

Автор: LjaO 10.9.2009, 15:12
Да так и есть.
ServletRequest::getParametrsMap.get(some_key) возвращает массив строк.
Поборол проблему следующим способ :
Код

StringBuffer url = request.getRequestURL().append("?").append(SERVER_KEY).append("=2"); // Adding new parametr
/**
* Check - do we have any parametrs in request. If so - add them to the URI as parametrs.
* As I said before "request.getParameterMap().get(key)" returns String[], but I need to put all values back to the browser.
*/
Enumeration keys = request.getParameterNames();
while(keys.hasMoreElements()) 
 {
  Object key = keys.nextElement();
   url.append("&").append(key).append("=");
   String[] values = (String[])request.getParameterMap().get(key);
   for(int i=0; i< values.length;i++)
   {
    url.append(values[i]);
    if(i != values.length-1 && values.length > 1)
     {
      url.append(",");
     }
    }
 }
response.sendRedirect(url.toString());


Самому мне несильно нравиться этот способ .. но он работает  .. причём на ура.
Быстро и просто.
Далее конечно последует code-refactoring smile

Автор: LjaO 10.9.2009, 15:30
Если кто то подскажет более элегантный способ решения - с удовольствие опробую.

Автор: andyhomes 10.9.2009, 16:03
Используйте:
request.getParameter(...)

Нужно понимать, почему параметр (в карте параметров) представлен именно массивом...
(Даю наводку: представьте, например, HTML-форму в которой много одноименных input-полей.)

Автор: COVD 10.9.2009, 16:36
Допустимая длина url имеет разные значения для разных браузеров и серверов. Обычно не рекомендуется превышать 2000 символов. Это ограничение необходимо учитывать при добавлении параметров в url.   

Автор: necromancer 15.9.2009, 15:29
жестоко =)
1 нужно учитывать вдруг урл редиректа уже имеет строку вида ?paramName=value 
2 У объекта реквест можно получить готовую строку запроса - getQueryString если я не ошибаюсь и не перебирать parameter map
3 Есть классная но сложная для освоения бибилотека http://www.google.ru/search?q=urlrewrite&ie=utf-8&oe=utf-8&aq=t&rls=org.mozilla:en-US:official&client=firefox-a
4 ну и наконец можно было просто описать проблему =) может ее можно было бы решить более элегантным способом не прибегая к таким вещам =)

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)