论坛首页 Java企业应用论坛

请教一个关于DirectLink的使用问题,麻烦各位看看,谢谢

浏览 6920 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2005-10-09  
在DirectLink的parameters参数中,是否任何类型的值都可以作为参数传递呢?为什么我任意放了一个参数(MyObj)作为值,会得到如下错误提示Could not find an adaptor for class com.ramon.test.MyObj.
   发表时间:2005-10-09  
你用的是Tapestry好多版本?
昨天发布了Tapestry4.0的最新beta-10版本。记得好像在beta-5已经修正了这个问题。

至于Tapestry3.0.x,我没有遇到过这种情况。
0 请登录后投票
   发表时间:2005-10-09  
我所使用的版本是tapestry3.x的版本,确实遇到了上述问题,按照我的理解parameters参数确实可以传入任何类型的值~~但是确实是出现了Could not find an adaptor for class com.ramon.test.MyObj这样的错误,不知道我的理解是否有误,谢谢
0 请登录后投票
   发表时间:2005-10-10  
呵呵,终于想起来了,你的com.ramon.test.MyObj没有序列化。。你实现Serializable接口就OK了。。。

好久以前遇到过这种错误,呵呵
0 请登录后投票
   发表时间:2005-10-10  
可能会使这种问题,因为我是直接把一个IAsset对象作为参数传递的,一会再去测试一下
0 请登录后投票
   发表时间:2005-10-10  
问题找到了,是myObj没有实现Serializable接口

因为一开始我是用一个IAsset对象作为myObj,IAsset只是个接口,不是对象,所以会出错。。。。。呵呵

不过我看了DirectLink的文档,并没有要求一定要实现Serializable接口阿。。。。奇怪

请gzdlw帮忙解释一下
0 请登录后投票
   发表时间:2005-10-10  
以下是tapestry网站关于DirectLink的parameters参数的解释
An array of objects to be encoded into the URL. These parameters will be decoded when the link is triggered.

In a web application built onto of Enterprise JavaBeans, the context is often the primary key of some Entity bean; typically such keys are Strings or Integers.

A listener method can retrieve the parameters three ways:
parameters are declared in the method itself, e.g. - listenerMethod(parameters)
parameters are declared along with the IRequestCycle, e.g. - listenerMethod(IRequestCycle cycle, parameters)
or through the request cycle, e.g. - listenerMethod(IReuqestCycle cycle), using IRequestCycle.getServiceParameters()

Prior to release 2.2, the parameters were always type String. They may now be of any type; type will be maintained when the parameters are later retrieved by a listener. See DataSqueezer for more details.
0 请登录后投票
   发表时间:2005-10-10  
我不知道你是否觉得有些特别:Tapestry能够将对象通过URL进行页面之间的传递,或者将一个对象完整地保存到客户端的浏览器上。我以前做的项目里面,传递的URL甚至长达一千多个字符。

回想一下在JSP里面,页面与页面之间参数的传递,全部都是String类型的,除非你放在Session中进行传递。而Tapestry却可以传递对象。为什么呢?

其实原因很简单,正如同你先前看见的错误:Could not find an adaptor for class com.ramon.test.MyObj。也就是说,Tapestry仍然是传递String类型的参数,保存在客户端浏览器上的也仍然是String。作为一个框架,Tapestry将你需要传递的对象转换了一遍,也就是说,通过一个“适配器(adaptor)”,在服务器端将一个对象转换为一段唯一的String,放到客户端浏览器上,当从客户端将这段String字符串返回到服务器段的时候,Tapestry又会将其还原为原先的对象,并保留了该对象的状态。

而你提到的“为什么DirectLink并没有提到序列化?”,因为序列化的目的就是为了在数据传输过程中保存对象的状态。序列化是一门非常庞大的学问,当然,也可以简单地片面解释为数据传输的一种规范。既然作为一种规范,有时候可能也就忽略不提了。

关于Tapestry的这个adaptor,在Tapestry4.0中,就可以按照自己的逻辑对官方提供adaptor进行重构。记得大概在Tapestry4.0-beta5之前,官方没有为T4提供adaptor,那个时候,在Tapestry的官方邮件列表里面,达人们就自己实现adaptor。
0 请登录后投票
   发表时间:2005-10-12  
gzdlw 写道
我不知道你是否觉得有些特别:Tapestry能够将对象通过URL进行页面之间的传递,或者将一个对象完整地保存到客户端的浏览器上。我以前做的项目里面,传递的URL甚至长达一千多个字符。

回想一下在JSP里面,页面与页面之间参数的传递,全部都是String类型的,除非你放在Session中进行传递。而Tapestry却可以传递对象。为什么呢?

其实原因很简单,正如同你先前看见的错误:Could not find an adaptor for class com.ramon.test.MyObj。也就是说,Tapestry仍然是传递String类型的参数,保存在客户端浏览器上的也仍然是String。作为一个框架,Tapestry将你需要传递的对象转换了一遍,也就是说,通过一个“适配器(adaptor)”,在服务器端将一个对象转换为一段唯一的String,放到客户端浏览器上,当从客户端将这段String字符串返回到服务器段的时候,Tapestry又会将其还原为原先的对象,并保留了该对象的状态。

而你提到的“为什么DirectLink并没有提到序列化?”,因为序列化的目的就是为了在数据传输过程中保存对象的状态。序列化是一门非常庞大的学问,当然,也可以简单地片面解释为数据传输的一种规范。既然作为一种规范,有时候可能也就忽略不提了。

关于Tapestry的这个adaptor,在Tapestry4.0中,就可以按照自己的逻辑对官方提供adaptor进行重构。记得大概在Tapestry4.0-beta5之前,官方没有为T4提供adaptor,那个时候,在Tapestry的官方邮件列表里面,达人们就自己实现adaptor。



persit="client" 是否要谨慎使用,虽然用起来很爽
我个人觉得对于大对象,是不合适的。该page中的XXXXLink都会有一个参数state:PageName=xxxxxxxx(非常长)。我碰到的问题是,因为GET方式对URL长度的限制,加了那些参数的链接是打不开的。

可能可以用其他方式来避免。但是我觉得最好是小对象,比如个把ID的传输还是很合适的。
0 请登录后投票
   发表时间:2005-10-12  
引用
persit="client" 是否要谨慎使用,虽然用起来很爽
我个人觉得对于大对象,是不合适的。该page中的XXXXLink都会有一个参数state:PageName=xxxxxxxx(非常长)。我碰到的问题是,因为GET方式对URL长度的限制,加了那些参数的链接是打不开的。

可能可以用其他方式来避免。但是我觉得最好是小对象,比如个把ID的传输还是很合适的。


实际上你多虑了,你可以仔细看看页面运行的源代码,如果是xxxLink,都是以post方式传递的。下面是我以前在T3时代用DirectLink的一个URL。
是我们【成都建信】www.cdcin.com实际在运行的项目中的一个链接。用word进行数字统计:741 ,当然,这并不是我们最长的链接。

http://www.cdcin.com/Work_safety_constructionFinishForm.html?sp=OH4sIAAAAAAAAAFvzloG1uIhBKTk_Vy85JTe5WC8_US8pX885P6-4pKg0uSQzP88tMy-zOONyjYkuy7Y_B5kYGCqKGLTRNSQlFqfqOQEJTJ3f_X1PPloh08DEwOnJwJGRWJzhnJ-S6sPAHZ-YnJxaUOKSWJJawiDgk5VYlqhfWpKZow8SsQYrKCjJLClNSfXLL2EQgijIScxL1w8uKcrMSwcq4YsHOiQ3s8Q5P7cgMa-ykKGOgdmHQQQoinAFqhx7fFpmDtBAKJc5PjOlhEEYyWzPvJLU9NQioOE88QVF-VmpySWOKSlFUPVwMb_E3FSwWEVBAwMDAzAQeUFm6BUX5uiB3C_yyy3D3jRtOiS8-MByIM-BJTOyGhm9I0skmYGSBeUcQP3_HeatYKgoYeA0MjAwNjSwMDQtYVB81jHhZfPepzuanq9Z87R19dPdu56vnfh0-9LnK7qftq552r-jhEEdqqZ31vOJ85517H86Z8OTXcuf7ml42j_x2ZzOlzMnwFSCTDYxNDCxsAC6VRDsHpB_9aD-FXq0YMn3xnYLJgZGTwbWssSc0lSguwUQ6vxKc5NSi9rWTJXlnvKgG-StAgYGxuvAiHk5d9LzfV1Plyx_2TjZ0MDwaf_2EgZZiIsgzn_RtfHp7LVPdnQ-mzPfGCQPABoE4-93AgAA

虽然这个链接中没有state数据,但是至少可以证明,URL是可以很长的。
那么你所说的GET方式,也就是以Form形式提交的时候。而此时persist的state数据,是以表单的一个hidden放在Form中的。

因此,我认为不会存在你所提的这种情况。
0 请登录后投票
论坛首页 Java企业应用版

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