2014-02-22 19 views
1

假设我正在运行一个JSP/Servlet驱动的网站。用户将数据POST到根目录,并且我有一个处理路径/的servlet(Index.java)。我想要这个servlet要做的是查看请求中的一些数据,并确定哪一个servlet应该处理它。当它决定哪个第二级servlet处理该请求时,它会将该请求发送到该第二级servlet。Tree of RequestDispatcher.forward()

现在我的问题是,如果需要第三个级别的servlet会发生什么?第二级servlet不能到第三级,因为调度员声称响应已经提交。

视觉:

Index.java 
+SecondLevelA.java 
+SecondLevelB.java 
\SecondLevelC.java 
    \ThirdLevelC.java 

SecondLevelC.java不能转移到第三级。我也无法重定向,因为我将在重定向中丢失POST参数。 POST是必需的,因为GET查询的数据太大。

+0

考虑完全重构你的架构。 MVC方法可能会更好。 –

+0

请求调度不受“等级”或转发次数的限制。如果提交的是响应,则代码中的其他内容会导致该问题。 – helderdarocha

回答

1

RequestDispatcher.forward()与关卡无关。它可以被分级调用任意数量的时间。唯一的条件是在调用任何RequestDispatcher.forward()之前,不应该提交响应。首次调用也是如此。

就你而言,它最可能是第一个子servlet导致响应被提交。

这里有响应的原因得到承诺:

Causes of Response getting committed.

+0

我在调试器中看到的奇怪之处在于,在调用RequestDispatcher.forward()之前,'appCommitted'变量是错误的,但之后它是真的。然而,我最终解决了这个问题,因此我不再有示例代码来复制这个问题。关于提交响应的下一级servlet一定有一些东西,但我不知道它是一个空的servlet。 – Huckle

+0

是的,通常在写回复时达到最大缓冲区大小。服务器将提交响应。 –