我正在尝试将使用 Struts 和 OpenSymphony 编写的 Web 应用程序转换为 JSF 和 Spring(现在这是一个死项目)。
该 Web 项目的问题在于,Struts 操作是用其中的大量代码编写的,这些代码直接执行并获取视图的数据(生成的 JSP)。很多时候,他们的 Struts 动作也扩展了其他动作,因此当我以某种形式调用某个动作时,很难跟踪正在执行的逻辑。
因此,如果我想在我的 JSF 托管 bean 中获取这些数据,我会看到两个选项:
在每种情况下准确地确定在该操作层次结构中发生了什么,并在某些 UI 服务(独立于框架)中重新创建该代码,然后从我的托管 bean 调用该服务。
在我的 UI 服务中,以某种方式模拟 HTTP 请求对该操作的操作,获取该数据,然后从我的托管 bean 调用该服务。
(1) 是很多我现在不想做的工作,也许在将来。(2) 快得多,但我不知道在 Struts 的情况下如何做。
如果我尝试做类似的事情:
SomeAction Action = new SomeAction();
action.execute();
这通常不起作用......因为有时SomeAction
继承自的 Actions 会从中获取request
并获取数据。因此,克服它的一种方法是:
HttpServletRequest request = (HttpServletRequest)FacesContext.getCurrentInstance().getExternalContext().getRequest();
SomeAction Action = new SomeAction();
action.setServletRequest(request);
action.execute();
这仍然不起作用,因为有时SomeAction
继承自的 Actions 会创建一些稍后将由SomeAction
.
有没有办法简单地模拟当前请求在特定 Struts 操作上的提交,并完全按照 Struts 容器的方式进行操作,这样我就可以获得该操作的所有预期结果?
我想这样的事情可以在测试类中完成,我该如何为 Struts 做呢?