The NoteBook of EricKong

  BlogJava :: 首页 :: 联系 :: 聚合  :: 管理
  611 Posts :: 1 Stories :: 190 Comments :: 0 Trackbacks
ASP中的Session本身是可以储存对象的,它可以保存基本变量,数组,自动化对象(Automation Object)等,但在储存自定义类的对象时会碰到问题。

如下面的代码:

以下是引用片段:
<%
If isempty(Session("node")) Then Set Session("node")=New ListNode
Set n=Session("node")
Response.Write n.Content
%>
<%

If isempty(Session("node")) Then Set Session("node")=New ListNode

Set n=Session("node")

Response.Write n.Content

%>

还是上面的ListNode这个类,这段代码意图在一个用户会话中只保留一个ListNode的对 象。所以在用户第一次访问该网页时,会生成ListNode的一个对象,并保存在Session("node")中;后面访问该网页时,因为 Session("node")不为空了,所以不会生成一个新的对象,而是到 Session("node")中取出保存的对象。

理论上应该也会输出100,但是问题来了,ASP一直会报错:

Microsoft VBScript runtime error '800a01b6'

Object doesn't support this property or method: 'n.Content'

用n.Type也会出错。同样的代码翻译成PHP,运行却是可以通过的。为什么?

个人分析下来,认为Session可以保存对象是没错,只是VBScript中类型转换的机制太 弱,而且没有显式的强制类型转换供用户使用,无法将 Session("node")正确转换为ListNode类型。因为是自定义的类,我们只能在每个页面中都出现类的定义语句,这样在ASP看来,每次读 取这个页面时,ListNode类都是一个新类,所以就不认得Session中的这个类的对象了。

结论:尽量不要想到用Session或Application来存储ASP中自定义类的对象。如果 确实需要,可以考虑用COM来编写类,然后在VBScript中用:Set Session("obj") = Server.CreateObject("YourApp.YourClass")来创建一个对象,然后即可实现上面预想的功能了。

posted on 2010-05-13 10:07 Eric_jiang 阅读(215) 评论(0)  编辑  收藏 所属分类: ASP

只有注册用户登录后才能发表评论。


网站导航: