在servlet和jsp之间传输数据的最佳方式?

问题描述:

首先尝试:在servlet和jsp之间传输数据的最佳方式?

我生成servlet的数据,然后将其设置在请求的属性,如下发送请求调用的RequestDispatcher把jsp:

request.setAttribute("data",data); 
request.getRequestDispatcher("/page.jsp").forward(request, response); 

现在访问JSP中并显示数据。

这工作正常,但每次用户刷新页面,它会得到一个警告,说你要重新提交表单并要求确认。这很烦人。

第二个尝试:

会话将数据和访问,在JSP页面中。由于数据量很大,会话会变得非常繁重。

所以我的问题是将数据从servlet传递给jsp的最佳方式是什么? 这里的数据是对象列表。

+0

只需使用GET而不是POST来检索*数据。另请参阅servlet标签维基页面http://stackoverflow.com/tags/servlets/info – BalusC

你的第一个解决方案是好的。使用会话保存特定于单个请求的数据不是一种好的做法。用户收到确认消息的事实与数据从servlet传递到JSP的方式无关。它与他们正在查看和刷新的页面是POST请求的结果有关。

使用Redirect after Post (or Post-Redirect-Get) pattern可以避免此问题。

例如,假设您要保存新产品,并且在保存产品(使用POST请求)后,您想要显示产品的分类页面。它会走这条路:

  1. 提交“保存产品”形式
  2. 店的产品数据库,ADN得到它的类ID(456)
  3. 发送重定向到URL产品分类的categoryId = 456?从数据库
  4. 将这个数据在一个请求属性
  5. 用户自动进入到上述网址
  6. 获取数据的456类别和转发的productCategory.jsp页面
  7. 用户可以看到产品类别页面,以及他刚刚保存的新产品。如果他刷新,它会在未经确认的情况下重新显示类别,并且不会重新提交“保存产品”表单。
+0

我可以发送数据而不显示在url中吗?那就是(按照你的例子)发送'categoryId'到'productCategory' servlet,但不是在url中。因为那么用户可以在浏览器网址中看到它并可以使用它。那么有没有解决方案? –

+0

不,你不能重定向并发布信息。要隐藏它,你需要在AJAX中完成所有这些,但它只会给你一种错误的安全感。任何人都可以右键单击您的页面,查看其源,修改并重新提交,即使使用POST或AJAX请求。只要确保在服务器端访问被禁止未授权查看特定类别的用户访问。你可以加密/解密请求参数,但即使如此,你应该使受保护的资源真正受到保护。通过默默无闻的安全行不通。 –

+0

@Mark:用请求参数“玩”究竟有什么问题?你想阻止特定的类别显示给有问题的用户吗?然后,需要以不同的方式解决该问题(即使POST也是一个问题,因为最终用户也可以通过POST请求的参数“玩”)。 – BalusC