【问题标题】:Multiple Request Response Forward多请求响应转发
【发布时间】:2013-03-28 21:14:57
【问题描述】:

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

什么是最好的实现方式?

【问题讨论】:

  • 如何获取日期值?

标签: java jsp servlets requestdispatcher


【解决方案1】:

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

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

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

response.sendRedirect(request.getContextPath() + "/ResourceChart");

(假设您的 servlet 映射到 /ResourceChart 的 URL 模式)

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

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

另见:

【讨论】:

  • 再次感谢 BalusC,因为他一直拥有丰富的知识。
  • 奇数。我收到一个错误。来自 Tomcat 的 Http 请求过多,加载失败。
  • 啊.. 我的 ArrayLists 在主类下,而不是 doGet()。这就是问题所在。
猜你喜欢
  • 2017-10-12
  • 2021-07-17
  • 2010-11-25
  • 1970-01-01
  • 1970-01-01
  • 2018-05-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多