我目前正在使用以下代码将一些ArrayList's
从我的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重新生成变量并传递它们?
实现这个的最好方法是什么?
答案 0 :(得分:1)
您显然正在刷新POST请求并忽略/确认浏览器的内置警告,即重新发送数据。在这种情况下,doPost()
方法确实将使用先前提交的数据重新执行,这些数据最终只会在数据库中的重复条目中结束。
在刷新POST请求时避免双重提交的规范方法是在POST请求后发送重定向。重定向隐式创建新的GET请求。然后刷新将导致仅重新执行GET请求,这是完全无害的。
要实现这一点,请用以下单行替换doPost()
所示问题的所有内容
response.sendRedirect(request.getContextPath() + "/ResourceChart");
(假设您的servlet映射到/ResourceChart
的网址模式)
并创建一个新的doGet()
方法,其中将所有删除的行重新放回,以及准备列表所需的逻辑。您需要做的唯一更改是将JSP文件放在/WEB-INF
文件夹中,以避免最终用户通过输入/猜测其URL而无需调用servlet来doGet()
直接打开它第一
request.getRequestDispatcher("/WEB-INF/ResourceChart.jsp").forward(request, response);