浏览 1703 次
锁定老帖子 主题:理解direct service
该帖已经被评为新手帖
|
|
---|---|
作者 | 正文 |
发表时间:2007-10-15
direct service生成的URL中包含了应用程序是否是stateful。当这个URL被用户单击的时候,direct service会验证session是否仍然存在, 还是已经过期。direct service的这一特性,使得我们不需要单独对form表单和某些校验session的链接进行验证(但是最近项目中由于使用了多个frame嵌套 造成过期后是在当前使用的frame刷登录页面而不是整个页面,所以比较麻烦还没想到好的方案) DirectLink组件和Form组件都包含了一个stateful参数,默认为true,我们可以开通对该参数的绑定,制定direct service是否校验session。 如果stateful参数为true,将对session校验,如果session过期Tapestry跳转到StatleSession页面,提示过期。 direct service执行过程 1)IEngine通过分析URL(service=direct)获知调用direct service。然后通过service()方法出发DirectService类的service()方法,而DirectService类的实例在 servlet启动时就已经被初始化并作为全局共享实例存放在Infrastructrue对象中。DirectService对象在被初始化的时候,已经通过hivemind注入了 ResponseRenderer对象、LinkFactory对象和WebRequest对象。 2)direct service接着通过页面名称找到DirectLink组件所在的页面实例,然后激活该页面实例 3)页面对象中包含该页面所调用的所有组件的实例,通过组件ID找到制定的DirectLink组件实例,验证session。 4)LinkFactory对象从请求中解析出URL携带的传递参数。 5)Tapestry通过反射机制出发DirectLink组件的监听方法,然后根据监听方法所返回的页面名称或者页面实例(IPage对象)激活并跳转页面。或者我们在监听方法中自己使用 IRequestCycle.activate()方法激活页面实例。如果监听方法是无返回值类型你个的void方法, 并且该方法中没有激活任何页面那么将默认跳转到当前页面。 6)由ResponRenderer对象将服务器端响应表现到客户端。 触发组件所绑定的监听方法是direct service最本质的目的,虽然direct service通过页面名称和组件ID找到了触发direct service的组件实例,但是direct service 并不知道也不需要知道这是什么组件(DirectLink或者Form)。 ResponseRenderer Deprecated. To be replaced with ResponseBuilder 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |