学习二:关于Tapestry的池

来源:互联网 发布:动态壁纸制作软件 编辑:程序博客网 时间:2024/06/01 20:47

一:Tapestry Pages are Pooled

       这意味着一个Tapestry应用,可以轻松地处理大量的并发用户,他能用最小的努力,服务每一个人的要求。

       也就是说,用户请求一个页面。Tapestry能特别为此用户创造的一个实例,但是用户一旦转向另一个网页就将抛弃这个实例?这不是高效率,但是在下一个时刻,二十多个其他用户将前来,并要求一个起始网页的实例。那么重用前一个用户实例化后的页面是最合理的。

       然而,这里有一个潜在的问题,这个页面或许在第一个用户使用的时候输入了一些敏感的数据,比如密码或者其他的什么。为了避免这种问题,Tapestry在交给别的用户使用这个实例之前清除了第一个用户的数据(statelessbean),它将会重新给页面类赋初始值。

       实际上,Tapestry为所有的页面类管理着一个池,当一个页面被请求时,从适当的池中取出它的一个实例服务这一请求,然后将这个实例放回他的池中。当这个请求结束的时候,Tapestry会销毁所有这个用户使用这个实例的数据。

        这个机制使Tapestry非常的有效率,但我们必须注意,即使我们认为我们所处理的是同一个页面,在多数情况下页面将会是不同的实例来展现(在群集环境中,甚至可能来自一个完全不同的服务器上),并且下一个实例完全不知道我们刚刚赋给了前一个实例什么信息,也就是说,除非我们的当心并且确保这些信息能在实例间传递。

        当我们试图向Another page传一个信息,我们取出一个实例,并且赋给它一个值,这时候到底发生了什么?当时我们告诉Tapestry去展示Another page给用户。Tapestry在和用户浏览器交流的时候都说了什么:“OK,谢谢,我已经成功的捕获了你的请求@1;现在继续请求我给你展示Another page(now go on and ask me to show you Another page)@2”。当这个浏览器请求到这个nother page,它从池中拿了一个崭新的这个页面的实例去为用户展示。不幸的是,这个崭新的实例并不知道关于我们想要传递的信息。

         我们该怎样使我们的应用与所有的实例池和jiggling(不知道这是什么鸟意思)一起工作?应该有一个方法能使Tapestry记得我们在页面输入的信息,不管这个页面的实例是不是在使用。

       这里有两种方案:

       1、我们将页面的Field都持久化,这是一个非常简单的方法,但是这有一些缺点。

       2、我们使用页面激活上下文。这是一个优越的方法,但不是对每个案例都这样,并且它涉及到更多的编码。

        让我们尝试两种方法,看看我们喜欢哪一个的应用。

原创粉丝点击