Java 多请求-响应转发

Java 多请求-响应转发,java,jsp,servlets,requestdispatcher,Java,Jsp,Servlets,Requestdispatcher,我目前正在使用下面的代码将一些ArrayList的从我的servlet传递到我的JSP页面 RequestDispatcher rd = null; request.setAttribute("date",al); request.setAttribute("bau",al1); request.setAttribute("project",al2); rd = request.getRequestDispatcher("ResourceChart.jsp

我目前正在使用下面的代码将一些
ArrayList的
从我的servlet传递到我的JSP页面

    RequestDispatcher rd = null;
    request.setAttribute("date",al);
    request.setAttribute("bau",al1);
    request.setAttribute("project",al2);
    rd = request.getRequestDispatcher("ResourceChart.jsp");
    rd.forward(request,response);
问题是,当我在页面上单击“刷新”时,相同的日期又被传递了一次,结果很奇怪。我是否也应该转发到JSP页面以避免servlet重新生成变量并传递它们


实现这一点的最佳方法是什么?

您显然正在刷新POST请求,并忽略/确认浏览器的内置警告,即数据将被重新发送。在这种情况下,
doPost()
方法确实会使用以前提交的数据重新执行,这些数据只会在数据库中以重复条目结束

避免POST请求刷新时双重提交的规范方法是在POST请求之后发送重定向。重定向隐式创建新的GET请求。刷新将导致只重新执行GET请求,这是完全无害的

为此,请将
doPost()
中问题显示的所有行替换为以下单行

response.sendRedirect(request.getContextPath() + "/ResourceChart");
(假设您的servlet映射在
/ResourceChart
的URL模式上)

并创建一个新的
doGet()
方法,在该方法中,您可以将所有删除的行以及准备列表所需的逻辑放回原处。您需要做的唯一更改是将JSP文件放在
/WEB-INF
文件夹中,以避免最终用户能够通过输入/猜测其URL直接打开它,而无需先调用servlet的
doGet()

request.getRequestDispatcher("/WEB-INF/ResourceChart.jsp").forward(request, response);
另见:

您显然正在刷新POST请求,并忽略/确认浏览器的内置警告,即数据将被重新发送。在这种情况下,
doPost()
方法确实会使用以前提交的数据重新执行,这些数据只会在数据库中以重复条目结束

避免POST请求刷新时双重提交的规范方法是在POST请求之后发送重定向。重定向隐式创建新的GET请求。刷新将导致只重新执行GET请求,这是完全无害的

为此,请将
doPost()
中问题显示的所有行替换为以下单行

response.sendRedirect(request.getContextPath() + "/ResourceChart");
(假设您的servlet映射在
/ResourceChart
的URL模式上)

并创建一个新的
doGet()
方法,在该方法中,您可以将所有删除的行以及准备列表所需的逻辑放回原处。您需要做的唯一更改是将JSP文件放在
/WEB-INF
文件夹中,以避免最终用户能够通过输入/猜测其URL直接打开它,而无需先调用servlet的
doGet()

request.getRequestDispatcher("/WEB-INF/ResourceChart.jsp").forward(request, response);
另见:

您如何获得日期值?您如何获得日期值?再次感谢BalusC,以及丰富的知识。奇怪。我有个错误。加载失败,来自Tomcat.Ahh的Http请求太多。。我的ArrayList位于main类之下,而不是doGet()。这就是问题所在。再次感谢巴卢斯克,因为他拥有丰富的知识。奇怪。我有个错误。加载失败,来自Tomcat.Ahh的Http请求太多。。我的ArrayList位于main类之下,而不是doGet()。这就是问题所在。