2012-01-31 56 views
3

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

回答

3

这是很多问题。

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

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

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

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

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

+0

我们可以验证ValueStack上的字符串值是否转换并填充到变量之前? – batbaatar 2012-02-01 06:29:55

+1

@batbaatar在转换之前进行验证没有任何意义,但S2为表单数据提供了验证机制。不知道什么时候你需要验证。 – 2012-02-01 12:05:09

1

我将特别讨论“数据传输如何”元素以及ValueStack的堆栈性。关于哪些数据可用,哪些可以随着上下文而改变;具有“堆栈”的整点是支持范围内数据的上下文更改。此外,堆栈中的具体数据更好地被参考资料所覆盖,例如struts网站上的资料。

Struts 2有一个非常干净的架构。它将软件的问题分解成不同的组件非常出色。其中一个主要的标志是行动是一个POJO。作为pojo,行动的主要职责是承载数据。它是主要的数据传输对象;它的属性接收传入的请求数据,只要命名所有的行。移动数据和考虑何时移动数据的任务被捕获在另一个组件中:拦截器。

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

除了作为集中式数据容器之外,ValueStack当然是一个堆栈。当您考虑诸如迭代器标记之类的东西时,这种堆栈性会让堆栈顶部的属性隐藏堆栈中较低层的属性。例如,如果您遍历一组用户,则每个用户都会进入堆栈的顶部,并在迭代的主体中保留在那里。这允许您的OGNL属性引用依次击中每个单独用户的属性。更重要的是,如果其他具有类似命名属性的其他内容在堆栈中进一步找到,它将被顶部的用户对象隐藏。请注意,考虑到这一点,使用push标签可以将任何你喜欢的对象推入堆栈,当你需要强制自己的上下文时提供很好的灵活性。