论坛首页 入门技术论坛

理解direct service

浏览 1703 次
该帖已经被评为新手帖
作者 正文
   发表时间:2007-10-15  
DirectLink组件和Form表单组件都使用这个service。
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
论坛首页 入门技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics