1

我正在使用 Eclipse JUNO IDE 和 tomcat 7.0。

我有一个网络应用程序。在我的应用程序中:

  1. 小服务程序

  2. JSP 页面

  3. HTML - 主页。

在主页中,当单击提交按钮并且 servlet 重定向到匹配 jsp 页面时,我有一个重定向到 servlet 的表单(因为我需要从服务器获取数据)。现在,当我刷新 jsp 页面时,servlet 在请求中得到 NULL。所以我的问题是如何重新提交?因为我想显示来自服务器的新数据。

注意:Servlet 通过套接字与服务器对话,因此当用户按下某个提交按钮时,请求重定向到 servlet,servlet 将请求重定向到服务器以获取所需的数据。现在当servlet收到数据时,它正在将数据传输到jsp页面,jsp页面将其显示为html

    if (request.getParameter("submit").equals("Show Taxis at Driving"))
    {
           requests.add("driving");
           to_server.writeObject(requests);
           to_server.flush();
           requests.removeAllElements();

           try{
               driving = (Vector)from_server.readObject();
               request.setAttribute("driving", driving);
               //request.getRequestDispatcher("/WEB-INF/driving_page.jsp").forward(request, response);
               RequestDispatcher disp = getServletContext().getRequestDispatcher("/WEB-INF/driving_page.jsp");
               disp.forward(request, response);
           }catch(ClassNotFoundException e)
           {
               e.printStackTrace();
           }
    }
    else if (request.getParameter("submit").equals("Add Passenger to Taxi"))
    {
        requests.add("taxis");
        requests.add("passengers");
        to_server.writeObject(requests);
        to_server.flush();
        requests.removeAllElements();

        try {
            taxis_waiting  = (Vector)from_server.readObject();
            passengers = (Vector)from_server.readObject();
            request.setAttribute("taxis", taxis_waiting);
            request.setAttribute("passengers", passengers);
            request.getRequestDispatcher("/WEB-INF/add_passenger_to_taxi.jsp").forward(request, response);
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
            request.getRequestDispatcher("error_page.jsp").forward(request, response);      
        }
    }
4

2 回答 2

1

这是一个最简单和最常见的方法:

  1. 您的index.html页面应该有一个使用GET操作的表单。这样表单参数通过查询参数传递给您的 servlet:

    /servlet?search=foo
    
  2. 您的 servlet 处理搜索并转发到 ,results.jsp以便浏览器仍然指向/servlet?search=foo

    RequestDispatcher dispatcher = getServletContext().
                                             getRequestDispatcher("results.jsp);
    dispatcher.forward(request,response);
    
  3. 如果您的用户刷新页面,她将/servlet?search=foo再次点击,调用服务器端逻辑并刷新搜索结果。

于 2012-08-25T16:52:02.423 回答
1

您可以使用会话简单地解决此问题。这将是一个替代解决方案。

if(session.getAttribute("REFRESH")!=null){
    response.sendRedirect("../your_servlet");
}
else{    
session.setAttribute("REFRESH","TRUE");
}

可以将上面的代码放在jsp页面中。当页面第一次加载时,它会检查会话值,但不会保存这样的会话,因此它会像代码的 else 部分一样创建会话。但在那之后,当用户单击刷新按钮时,会话就会有一个值并发生重定向。

但是为了避免循环重定向,你需要在servelt中删除会话。所以下面的代码应该放在你的servlet中。

session.removeAttribute("REFRESH");
于 2015-07-04T12:10:13.400 回答