1

我有一个本土的 MVC 实现。像这样的 ControllerServlet:

/controller?cmd=EditUser&userid=55

从这个 URL,控制器创建一个EditUserCommand.class实例并调用一个execute()方法,该方法返回要显示的结果页面(例如user.jsp)。

然后控制器 servlet 执行...

getRequestDispatcher(resultPage).forward(request, response);

...并显示结果页面。

控制器所做的其中一件事是将消息(错误、信息等)设置为请求属性。例如:

request.setAttribute("infoMessage", "User was edited successfully.");

并且该消息从user.jsp页面中的请求中提取并显示。

工作正常。

现在我的问题来了。

有时我的命令不会返回类似的页面,user.jsp而是返回类似结果的 URL cmd=ShowUser&userid=55。这是因为在显示最终页面之前我可能要检查一些事情,例如查看用户的权限等。

当我这样做时,我放置在请求中的“infoMessage”永远不会出现,因为结果是一个对 servlet 进行新调用的 URL,这是一个新请求。新请求不保留第一个请求的请求属性;这是有道理的,我只是没有预见到会发生这种情况。

如何使我的请求变量“保持活动状态”,直到它实际显示在原始请求产生的最终页面上?

任何建议或意见表示赞赏。仅供参考,我无法重新编写整个应用程序以使用 JSF 的 Struts、Spring MVC 之类的东西。这不是一个选择。

谢谢!

4

3 回答 3

4

redirect由于来自浏览器的全新请求,通常会丢失请求数据。一种可能的方法可能是将您的消息作为属性附加到 url 字符串并在需要时阅读它。

根据您的编辑:在您的编辑之后,我的回答也很有意义。但是,只有一个更正是,它不是全新的请求,因为转发发生在服务器端。

于 2012-07-06T18:58:46.847 回答
2

您是否尝试过使用 RequestDispatcher 而不是 Redirect?

RequestDispatcher dispatcher = request.getRequestDispatcher("/myNextPage.jsp");
dispatcher.forward(request, response);
于 2012-07-06T18:57:45.340 回答
0

您可能给出了一个简单的示例,但您的控制流可能会导致“重新发送”错误?基本上,在对数据进行任何更改后,控制器必须立即通过重定向执行“获取”,并且屏幕应该完全无状态地显示。

请看一下: http ://en.wikipedia.org/wiki/Post/Redirect/Get

因此,属性不是一个很大的帮助。您可能需要考虑的是,为每个登录用户维护一个 Bean/Object,并将该对象保存在 LRU 缓存(JCache 或 MemcacheD)中,并在应用程序的每个条目上检索它。一旦你有了它,你就可以在那个对象中维护一个伪状态,比如以前的结果。

无论如何,使用 Attributes 来保留状态将严重限制您的选择。您需要有一个更通用的灵活的独立于路由的机制。

于 2012-07-06T19:02:43.663 回答