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()。这就是问题所在。