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


Автор: Kars 27.4.2006, 12:45
Всем привет. У меня к вам вопросик  smile 
Описание программы :
 На сервлет поступает URL  запрос с параметрами , он их обрабатывает и выдает результат .
Суть "проблемы" :
 1. После обработки  поступившых данных , что бы увидеть результат необходимо обновлять страничку 
( нажимать Ф5 ).
 2. Параметры которые передались в сервлет через  адресную строку не очищаются после обработки ,
и после нажатия клавиши Ф5 снова выполняются .

Что делать ?  smile  

Автор: batigoal 27.4.2006, 13:05
Делай в своем сервлете после обработки редирект. Либо редирект можно делать на стороне клиента - через JavaScript. 

Автор: Kars 27.4.2006, 13:10
Цитата(Lamer George @ 27.4.2006,  12:05)
Делай в своем сервлете после обработки редирект. Либо редирект можно делать на стороне клиента - через JavaScript.

Я делал через forward  но что то не получалось , а через редирект это как  smile  

Автор: batigoal 27.4.2006, 13:13
Цитата(Kars @  27.4.2006,  14:10 Найти цитируемый пост)
Я делал через forward  но что то не получалось , а через редирект это как  smile   

Именно так. А что не получалось? 

Автор: Kars 27.4.2006, 13:17
Строка адреса не очищалась .  smile 

Я делал так :

Код



RequestDispatcher rd=request.getRequestDispatcher ("Index");
rd.forward(request,response);

  

Автор: batigoal 27.4.2006, 13:19
Я так понимаю, что в данном случае ты делешь редирект с тем же самым запросом, т.е. на ту же страницу с теми же параметрами. А тебе нужно поменять URL. 

Автор: Kars 27.4.2006, 13:25
Конечно можно после окончания перейти на другой сервлет или страничку , но это меня не устраивает . Надо что бы после обработки он вызывал себя снова , но уже без параметров. 
  

Автор: Goliath 27.4.2006, 13:50
А не проще воспользоваться XMLHttpRequest (чистый AJAX)?  

Автор: Kars 27.4.2006, 13:54
Цитата

А не проще воспользоваться XMLHttpRequest (чистый AJAX)?   


 2 Goliath 
Если не сложно , можиш примерчик написать . Ну с использыванием XMLHttpRequest .  

Автор: batigoal 27.4.2006, 14:02
Цитата(Kars @  27.4.2006,  14:25 Найти цитируемый пост)
Конечно можно после окончания перейти на другой сервлет или страничку , но это меня не устраивает . Надо что бы после обработки он вызывал себя снова , но уже без параметров. 

Тогда подмени УРЛ на такой же, но без параметров. 

Автор: Kars 27.4.2006, 14:04
Я вот нашел кое что , аналог метода forward  - sendRedirect. Но в отличие от первого sendRedirect заставляет браузер запросить другой URL . Как этот метод используется , я так и не нашол , если кто знает то киньте примерчик с его участием , буду очень признателен .

Добавлено @ 14:08 
Цитата

Тогда подмени УРЛ на такой же, но без параметров.  

Я так и делаю :
Цитата

RequestDispatcher rd=request.getRequestDispatcher ("Index");
rd.forward(request,response);


Index - это тот сервлет что принимает и обрабатывает . Но если параметр поступает пустой  ("Index"); то сервлет просто показывает общую табличку .  

Автор: batigoal 27.4.2006, 14:10
Я так понял, что надо ему просто скормить строку адреса, и всё... 

Автор: Kars 27.4.2006, 14:14
Вот собственно тот метод который выполняется первый при загрузке сервлета:
Код


protected void processRequest(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
        
        response.setContentType("text/html; charset=windows-1251");
        PrintWriter out = response.getWriter(); 
        
        request.setCharacterEncoding("windows-1251");
        
        String id = request.getParameter("id"); 
        String act = request.getParameter("act"); 
        String del = request.getParameter("del");

        sendPageHeader(response,"Выбор записи"); 

try{
            
   

        
        
        if (id==null )
        {  
               // код           
  
        }else            
        {
               
            // код
 
        }
        
        
        if (act!=null) 
            {
               if (del!=null)
               {
                     
                     
                     // код
                     
                    
               }else 
               {
                   
                   // код
               }
               
            }
       
}
catch(Exception e)
        {
            
            out.println("Ошибка:" + e.toString());
            
        }
        
        sendPageFooter(response);
        

        out.close();

}



Чего и куда вы мне посоветуете вставить   smile  

Автор: katala 28.4.2006, 19:59
я так понимаю например в теге 
<forward name="/change" path="/templates/account.vm"  />
надо просто добавимть redirect="false"????? то есть :
<forward name="/change" path="/templates/account.vm" redirect="false" /> 

Автор: wadissimo 29.4.2006, 00:32
вообще редирект это не аналог форварда.
форвард переходит на страницу без ведома браузера(то есть когда ты нажмешь f5 у тебя выполнится сервлет с которого ты форвардился с его параметрами)
редирект переход на новую страницу с запросом браузеру(здесь при нажатии f5 обновится только та страница, на которую ты редиректнулся. )
тебе нужен, как я понял, response.sendRedirect("...."); 

Автор: Tirael 29.4.2006, 02:26
Цитата(Kars @  27.4.2006,  14:04 Найти цитируемый пост)
Я вот нашел кое что , аналог метода forward  - sendRedirect. Но в отличие от первого sendRedirect заставляет браузер запросить другой URL . Как этот метод используется , я так и не нашол , если кто знает то киньте примерчик с его участием , буду очень признателен .


Ну например так: 
Код

response.sendRedirect(contextPath+"/mysuperservlet");


Цитата(Kars @  27.4.2006,  13:17 Найти цитируемый пост)
Строка адреса не очищалась .

Когда ты делаешь foward браузер ничего не знает о том куда ты форвадишься , в случае с sendRedirect браузер знает об этом.

Вообщем, как я понял, ты посылаешь сервлету строку с параметрами. Внутри сервлета делаешь forward и не понимаешь почему в строке браузера все тот же урл. Собственно, если так, то решение - заменить forward на sendRedirect ( и думать почему не работает следующий кусок кода  smile ).

Вообще, forward и include очень хорошие вещи, если ты хочешь скрыть собственно всю свою реализацию. Например, я из сервлета вызываю incude  на jsp страницу. И пользователь ничего об этом не знает. 


Господа знатоки, smile  у меня такой вопрос(ы): 
1. Вы пишите в строке адреса www.bla-bla.org/aaa/bbb.html
Как сделать быстро и удобно так, чтобы никакого расширения не надо было. Например www.bla-bla.org/aaa/bbb
Естественно, чтоб вызывалась эменно HTML (или какая другая) страница, а не сервлет.

2. У меня есть фильтр, который слушает все запросы на все сервлеты. Но мне хочется ( для удобства), чтоб этот фильтр слушал все запросы на все сервлеты, КРОМЕ одного (двух - трех). Конечно можно замапить фильтр на каждую страницу в отдельности, опустив те что мне не нужны. Но это как-то не гламурно ...... 

Автор: katala 29.4.2006, 12:42
ничего не выходит:
есть класс
public class SendMail extends AbstractVelocityAction {
    
    public ActionForward processActionLogic(VelocityContext context, ActionMapping mapping, ActionForm form, HttpServletRequest request) throws Exception {
        
        template = Velocity.getTemplate("mail.vm");    
        ...
        return mapping.findForward("/send");
        
    }
}
потом  в struts-config.xml 
<action path="/templates/mail" type="struts.action.client.SendMail"  scope="request">
            <forward name="/send" path="/templates/mail.vm" redirect="false" />
        </action>
вроде все нормально заполняю форму, отправляю данные(после нажатия кнопки) и появляется эта же страница то есть так как мне надо. но как только нажимаю F5 сразу выбрасывает на главную страницу а надо оставаться на этой. так в чем проблема????    

Автор: Kars 3.5.2006, 20:14
Спасибо всем за помощь , и полезные советы . Я решил этот вопрос несколько иначе , и ефективние .

Код


if (randomNew!=null) 
{
    if (randomOld.equalsIgnoreCase(randomNew)) 
    {
         ExekzZapros=false;
         out.println("<CENTER>Такой запрос уже выполнялся</CENTER>"); 
    }
}



Обяснять не буду там и так всё ясно  smile  

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