Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jsp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在servlet和jsp之间传输数据的最佳方法?_Jsp_Servlets - Fatal编程技术网

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

在servlet和jsp之间传输数据的最佳方法?,jsp,servlets,Jsp,Servlets,第一次尝试: 我在servlet中生成数据,然后在请求中将其设置为属性,并通过调用requestDispatcher将该请求发送到jsp,如下所示: request.setAttribute("data",data); request.getRequestDispatcher("/page.jsp").forward(request, response); 现在在jsp中访问它并显示数据 这可以正常工作,但每次用户刷新页面时,它都会收到一个警报,表示您正在重新提交表单并要求确认。这很烦人 第二

第一次尝试:

我在servlet中生成数据,然后在请求中将其设置为属性,并通过调用requestDispatcher将该请求发送到jsp,如下所示:

request.setAttribute("data",data);
request.getRequestDispatcher("/page.jsp").forward(request, response);
现在在jsp中访问它并显示数据

这可以正常工作,但每次用户刷新页面时,它都会收到一个警报,表示您正在重新提交表单并要求确认。这很烦人

第二次尝试:

将数据放入会话中,并在jsp页面中访问该数据。这样,由于数据量很大,会话变得非常繁重

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

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

使用可避免此问题

例如,假设您正在保存一个新产品,并且在保存该产品后(使用POST请求),您希望显示该产品的类别页面。它将是这样的:

  • 提交“保存产品”表格
  • 将产品存储在数据库中,并获取其类别ID(456)
  • 向URL productCategory?categoryId=456发送重定向
  • 用户自动转到上面的URL
  • 从数据库中获取类别456的数据
  • 将此数据放在请求属性中,并在productCategory.jsp页面上转发
  • 用户将看到产品类别页面,其中包含他刚刚保存的新产品。如果他刷新,它将重新显示该类别,而无需确认,也无需重新提交“保存产品”表单

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

    使用可避免此问题

    例如,假设您正在保存一个新产品,并且在保存该产品后(使用POST请求),您希望显示该产品的类别页面。它将是这样的:

  • 提交“保存产品”表格
  • 将产品存储在数据库中,并获取其类别ID(456)
  • 向URL productCategory?categoryId=456发送重定向
  • 用户自动转到上面的URL
  • 从数据库中获取类别456的数据
  • 将此数据放在请求属性中,并在productCategory.jsp页面上转发
  • 用户将看到产品类别页面,其中包含他刚刚保存的新产品。如果他刷新,它将重新显示该类别,而无需确认,也无需重新提交“保存产品”表单

  • 我可以发送数据而不在url中显示它吗?即(根据您的示例)将
    categoryId
    发送到
    productCategory
    servlet,但不发送到url中。因为这样用户就可以在浏览器url中看到它,并可以玩它。那么有什么解决办法吗?不,你不能重定向和发帖。要隐藏它,您需要在AJAX中执行所有这些操作,但它只会给您一种错误的安全感。任何人都可以右键单击您的页面,查看其源代码,修改并重新提交,即使使用POST或AJAX请求。只需确保服务器端禁止未经授权查看特定类别的用户访问。您可以对请求参数进行加密/解密,但即使这样,您也应该真正保护受保护的资源。默默无闻的安全性不起作用。@马克:使用请求参数到底有什么问题?是否要阻止特定类别显示给相关用户?然后,这个问题需要以不同的方式解决(即使使用POST,这仍然是一个问题,因为最终用户也可以“玩”POST请求的参数!)。@BalusC:是的,我想阻止特定类别显示给用户。我可以发送数据而不在url中显示它吗?即(根据您的示例)将
    categoryId
    发送到
    productCategory
    servlet,但不发送到url中。因为这样用户就可以在浏览器url中看到它,并可以玩它。那么有什么解决办法吗?不,你不能重定向和发帖。要隐藏它,您需要在AJAX中执行所有这些操作,但它只会给您一种错误的安全感。任何人都可以右键单击您的页面,查看其源代码,修改并重新提交,即使使用POST或AJAX请求。只需确保服务器端禁止未经授权查看特定类别的用户访问。您可以对请求参数进行加密/解密,但即使这样,您也应该真正保护受保护的资源。默默无闻的安全性不起作用。@马克:使用请求参数到底有什么问题?是否要阻止特定类别显示给相关用户?然后,这个问题需要以不同的方式解决(即使使用POST,这仍然是一个问题,因为最终用户也可以“玩”POST请求的参数!)。@BalusC:是的,我想阻止特定类别显示给用户。只需使用GET而不是POST来检索数据。另请参见servlets标记wiki页面仅使用GET而不是POST来检索数据。另请参见servlets标记wiki页面