3

我试图了解 Struts2 中的路径数据,数据是如何放置在 ValueStack 上的?如何找出 ValueStack 中当前存在的对象?我可以从不同范围的应用程序、会话、请求、页面访问哪些其他数据?如何确定我的变量应该具有的范围?

4

2 回答 2

3

这是很多问题。

值堆栈只是一种数据结构,是映射和堆栈的组合。命名对象(通过#OGNL 中的标签访问)在映射中(比如请求范围),用于搜索属性/方法的对象在堆栈上。

<s:debug>标签是找出值堆栈中内容的最简单方法。您还可以使用 JSP 中的“裸”数组表示法访问堆栈上的任意对象,例如"[0]"最顶层对象、"[1]"下一个对象等。这在现实生活中几乎从来都不是一个好主意。

您可以访问每个范围内的任何内容。

您自己的对象应该几乎总是通过操作本身放置在值堆栈上,或者如果您正在实现ModelDriven,则通过模型放置。除此之外,它与任何其他 Java EE 应用程序相同——客户端会话期间所需的对象应该在会话范围内,跨应用程序共享的对象应该在应用程序范围内,等等。

值堆栈本身在请求范围内。

于 2012-01-31T20:56:47.907 回答
1

我将专门讨论“数据如何传输”元素以及 ValueStack 的堆栈。至于什么数据可用,可以随上下文变化;拥有“堆栈”的全部意义在于支持范围内数据的上下文变化。此外,堆栈上的特定数据更好地包含在参考资料中,例如在 struts 网站上找到的。

Struts 2 有一个非常干净的架构。它在将软件的关注点分成不同的组件方面做得很好。这样做的主要标志之一是 Action 是 POJO。作为一个 pojo,action 的主要职责是携带数据。它是主要的数据传输对象;它的属性接收传入的请求数据,前提是命名所有行。移动数据的任务以及考虑何时移动数据的任务被另一个组件捕获:拦截器。

数据到 ValueStack 的移动几乎完全由拦截器完成。框架在处理请求时做的第一件事就是将新创建的操作对象放在值堆栈的顶部。这支持 OGNL 访问您的操作属性。然后,拦截器将数据移动到 valuestack 上,并且由于您的操作在那里,它的属性将接收匹配 setter 的数据。其他拦截器也会以类似的方式将内容移动到 valuestack 上,例如验证拦截器;如果他们发现错误,该错误消息也会进入堆栈。

除了作为集中式数据容器之外,ValueStack 当然还是一个堆栈。当您考虑诸如迭代器标签之类的事情时,这种堆栈性允许堆栈顶部的属性隐藏堆栈中较低的属性。例如,如果您对一组用户进行迭代,则每个用户都会进入堆栈顶部并在迭代主体期间保持在那里。这允许您的 OGNL 属性引用依次访问每个用户的属性。更重要的是,如果在堆栈的更下方找到具有类似名称属性的其他东西,它将被顶部的用户对象隐藏。请注意,考虑到这一点,push 标签允许您将任何您喜欢的对象推送到堆栈上,当您需要强制自己的上下文时提供了很好的灵活性。

于 2012-02-02T16:28:00.647 回答