我试图理解Struts2中的数据路径,如何将数据放在ValueStack上?如何找出ValueStack中当前存在的对象?我可以从不同的范围应用程序,会话,请求,页面访问哪些其他数据?如何确定我的变量应具有的范围?
答案 0 :(得分:3)
这是很多问题。
值栈只是一种数据结构,是地图和堆栈的组合。命名对象(通过OGNL中的#
标记访问)在地图中(比如请求范围),搜索属性/方法的对象在堆栈中。
<s:debug>
标记是查找值堆栈中的内容的最简单方法。您还可以使用JSP中的“裸”数组表示法访问堆栈中的任意对象,例如"[0]"
是最顶层的对象,"[1]"
是下一个,等等。这几乎不是一个好主意。现实生活。
您可以访问每个范围内的任何内容。
您自己的对象几乎总是通过动作本身放置在值堆栈上,或者如果您通过模型实现ModelDriven
。除此之外,它与任何其他Java EE应用程序相同 - 客户端会话期间所需的对象应该在会话范围内,应用程序中共享的对象应该在应用程序范围内等。
值堆栈本身位于请求范围内。
答案 1 :(得分:1)
我将专门解决“数据如何传播”元素以及ValueStack的堆栈性。至于关于什么数据可用的位,可以随着上下文而改变;拥有“堆栈”的全部意义是支持范围内数据的上下文变化。此外,堆栈上的特定数据可以通过参考资料更好地覆盖,例如struts网站上的参考资料。
Struts 2拥有非常干净的架构。它可以很好地将软件的关注点分成不同的组件。其中一个主要的标志是行动是一个POJO。作为一个极端,该行动的主要职责是携带数据。它是主要的数据传输对象;它的属性接收传入的请求数据,前提是命名所有排队。移动数据和考虑何时移动数据的任务被捕获在另一个组件中:拦截器。
数据在ValueStack上的移动几乎完全由拦截器完成。处理请求时框架首先要做的事情之一是将新创建的操作对象放在valuestack的顶部。这支持OGNL访问您的操作属性。然后,拦截器将数据移动到valuestack,并且由于您的操作在那里,它的属性将接收匹配的setter上的数据。其他拦截器也会以类似的方式将内容移动到valuestack,例如验证拦截器;如果他们发现错误,那么该错误消息也会进入堆栈。
除了作为集中式数据容器之外,ValueStack当然是一个堆栈。当您考虑迭代器标记之类的东西时,这种堆栈性允许堆栈顶部的属性隐藏堆栈中较低的属性。例如,如果迭代一组用户,每个用户都会进入堆栈顶部并在迭代体内保持不变。这允许您的OGNL属性引用依次命中每个用户的属性。更重要的是,如果在堆栈中找到了具有类似命名属性的其他内容,则顶部的用户对象将隐藏它。请注意,考虑到这一点,push标签允许您将任何您喜欢的对象推送到堆栈中,在您需要强制使用自己的上下文时提供了很好的灵活性。