Java Web开发:在传递请求对象

时间:2016-12-30 14:30:17

标签: java jsp servlets

编辑:我在这里发布了一个更短且修改过的问题:Java web development: transfer control from one servlet to another while passing the request object (Version 2)

或多或少是Java Web开发的初学者,我不确定在提交表单(POST)时如何构建servlet / pages之间的流程。这是一个基本问题,我怀疑这对于专家来说可能是一个容易回答的问题。 (尽管如此,我的书和一些谷歌搜索没有给出明确的答案。)我的问题有点长,那是因为我想说清楚我来自哪里。谢谢你的耐心等待。

假设我们有两个servlet A en B,每个都有自己的'.jsp-page;让我们分别调用那些页面a.jsp和b.jsp。现在,只要在任一页面上都没有表单(即,没有使用POST方法),就可以清楚地知道应该如何进行。也就是说,在显示任何.jsp页面之前,激活相应的servlet,通过设置.jsp-page的相关数据元素(最值得注意的是作为请求对象的属性)为.jsp-page做一些准备。需要,然后将请求对象(等)转发到.jsp页面,然后实际显示包含数据的页面。因此,例如,页面a.jsp上的链接可以链接到servlet B,并且在单击该链接时,将触发对servlet B的GET请求,然后在转发到其'之前进行一些准备(设置一些请求属性)。拥有'.jsp-page(iebjsp)。

但现在让我们假设页面a.jsp显示一个带有提交按钮的表单,method =“POST”和action =“B”。然后是,servlet B被激活,这个servlet必须确定用户输入的数据是否有效。如果数据实际上是有效的,我们可以简单地转发到b.jsp,那里没问题。但是如果数据无效呢?

在这种情况下,我们显然希望再次显示a.jsp(表单页面),用户第一次输入的数据仍然存在。实现这一目标的一种方法是简单地将servlet B转发到a.jsp(从而绕过servlet A)。但是,存在一个很大的问题:在地址栏中向用户显示的URL仍将显示为“...... / B”。因此,用户将看到正确的页面(即包含表单的a.jsp),但网址错误(/ B)。因此,例如,如果我们使用“Register”和“ThanksForRegistering”而不是“A”和“B”,用户将看到register.jsp - 但是使用URL“...... / ThanksForRegistering”!不好。

在请求调度程序上调用'include()'而不是'forward()'似乎也不起作用。如果我们这样做,它不仅会导致GET请求(而不是我们想要的POST请求),但实际上我们失去了整个(原始)请求对象及其属性(毕竟,我们需要它们)重新填写表格)。至少,这就是我自己的实验似乎表明的。所以使用'include()'似乎根本不是一个可行的选择。

另一个明显的想法是为提交提供“action = A”(而不是“action = B”)。然后servlet A本身可以处理验证,如果验证失败,它可以再次转发到a.jsp,没问题。那么如果验证成功呢?然后我们想要显示后续页面b.jsp,但该页面可能需要再次来自原始请求对象(来自表单提交)的属性;例如,让用户检查他输入的数据实际上是否正确。所以基本上我们遇到了和以前一样的问题,但是A和B(以及它们各自的.jsp-pages)的角色是相反的。所以这似乎也不是一个真正的解决方案。

我没有看到任何其他选择。

所以基本上,我只是想让一个servlet将控制权交还给另一个servlet,但是请求对象从前者传递给后一个servlet。或者,如果那是不可能的,我希望能够直接从servlet B转发到a.jsp,但是向用户显示正确的 URL。或任何其他方式来实现我想要的。

非常感谢。

2 个答案:

答案 0 :(得分:1)

我认为每个servlet必须有一个页面的假设导致这里的问题....有一个基于输入重定向,转发或包含特定页面的servlet ....你真的不需要总是为页面调用一个不同的servlet .....你可以有一个带有视图解析器的前端控制器,它的组合将重定向或转发到页面。

答案 1 :(得分:-1)

如果验证成功,您可以使用过滤器来实现相同的功能或考虑在HttpSession中设置属性,并在需要时检索所有页面中的数据。         session.setAttribute(" object",object);

我希望这就是你要找的东西。