多请求响应转发

时间:2013-03-28 21:14:57

标签: java jsp servlets requestdispatcher

我目前正在使用以下代码将一些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重新生成变量并传递它们?

实现这个的最好方法是什么?

1 个答案:

答案 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);

另见: