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


Автор: Molodec 23.8.2011, 13:41
Добрый день, господа.
Такая проблема. Раньше подтверждал форму через method="post" action="...".. (Кнопка submit)
Теперь немного разобрался в Ajax и пытаюсь в случае правильности ввода перенаправить пользователя на другую страничку... Так вот, так как я делал раньше уже не получается... 
Ничего не происходит. А перенаправление в JS писать не хочется... Как то это не очень логично. Если для той странички требуется логин и пароль, показывать ее адрес, хоть на ней и стоит защита при открытии. 
Раньше у меня был класс, от которого я наследовал все свои сервлеты:
Код

package guestbook.servlet;

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;

public class Dispatcher extends HttpServlet {

    protected void forward(String address, HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        RequestDispatcher dispatcher = getServletContext().getRequestDispatcher(address);
        dispatcher.forward(request, response);
    }
}

Теперь же в сервлетах можно было написать:
Код

this.forward("/pages/index.jsp", request, response);

И мы уже перескакивали на эту страничку. 
Но вот сейчас этот метод отрабатывает без исключений.. Но.. На этом все и заканчивается. Переход никуда не осуществляется. 
То же самое и при response.sendRedirect().
Ajax организую с помощью jQuery.
В отладчике просматриваю. Все отрабатывает. Единственное - страница не перенаправляется.
С чем это связано и какие есть решения? 

Автор: Gretchen 24.8.2011, 00:01
Привет. Если ты работаешь с AJAX, то request посылает уже не браузер напрямую, а JavaScript XHR объект. И response, который твой сервер послал получит не браузер, а этот Javascript объект. Ты этот response потом как текст или XML можешь прочесть в callback ( это третий аргумент метода JQuery.post() ) как аргумент функции. Потом ты с этим ответом можешь делать что хочешь, например увидеть как alert(data) или вставить внутри страницы в <div>. Я почти уверенна, что ты как response получаешь новую html-страницу. Так что напрямую через AJAX сделать redirect невозможно.  AJAX обычно и используют, чтобы минимизировать перегрузку страницы. 

Либо надо всётаки пользоваться Javascript так
Код

window.location.href = 'pages/next.jsp'


либо перегружать через Javascript только куски страницы. Может можно заменить и содержимое тега <body>, но я никогда такое не пробовала

Можно попробовать сделать так: 

создать сервлет, который в зависимости от параметра в request,  решает какая страница вызывается и делает forward

Код


public class RedirectServlet extends HttpServlet {
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        String adress = request.getParameter("adress");
        RequestDispatcher dispatcher = getServletContext().getRequestDispatcher(address);
        dispatcher.forward(request, response);
    }

    protected doPost(HttpServletRequest request, HttpServletResponse response) {
         doGet(request, response);
    }
}



 и в JavaScript
Код

window.location.href = 'RedirectServlet?adress=next.jsp' // здесь чисто условно, чтобы объяснить что вызывать и с каким параметром



Попробуй ещё обратится в раздел JavaScript здесь на форуме. Может там тебе подскажут более элегантное решение


P.S. В FireFox есть отличный плагин для работы с JavaScript и в частности с AJAX. Установив его, ты сможешь видеть, что ты посылаешь серверу и что он присылает в ответ.

Автор: Molodec 25.8.2011, 14:31
Gretchen, спасибо за советы. 
Попытался через alert вывести ответ сервера при forward - alert не отработал. 
Код

jQuery.post("MessUnit","type=add&message="+jQuery("#add_message").val(),function(data) {
            alert(data)
            update();
        }
        );

Видимо там возникает куча других исключительных ситуаций. 

Хотелось конечно, но не получилось возложить это на сервер. В итоге воспользовался, как ты и сказала:
Код

window.location.href = 'pages/next.jsp'

Это пока что. Думаю, найти плагин:
P.S. В FireFox есть отличный плагин для работы с JavaScript и в частности с AJAX. Установив его, ты сможешь видеть, что ты посылаешь серверу и что он присылает в ответ.
и отследить. Может что и смогу исправить. 
В любом случае спасибо за информативный ответ. Будет где разгуляться. 


P.S.
Почему Ajax и перезагрузка страницы - потому что при вводе данных выполняется многократные проверки со стороны сервера. Перезагрузка для них - не уместна. А вот когда они выполняется и все дадут положительный ответ. Вот тогда и можно перезагружать страничку)) 

Автор: Gretchen 25.8.2011, 20:57
Прости пожалуста. Только сейчас поняла, что забыла написать имя плагина. Это FireBug. Это практически стандарт для JavaScript программистов

Автор: Molodec 26.8.2011, 13:23
Знаю его)) 
Обычно пользуюсь, Dragon fly, но и с тем сталкивался. Только вот проблема... FireFox видимо считает Ajax запросы не безопасными и блокирует. Поэтому у меня на нём совсем Ajax на localhost не работает... Можно как то это исправить?

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