posts - 256, comments - 1319, trackbacks - 41, articles - 8
  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理

WebWork深度探索之Session

Posted on 2004-08-26 15:38 FantasySoft 阅读(4575) 评论(9)  编辑 收藏 所属分类: All About SoftExcellent WebWork

        昨天上午刚写完WebWork的Pitfall[1],特别提到了文档的问题,结果下午就深受其害了。其实,我想做的功能很简单,就是在页面上判断一下某个字段在Session中是否存在,如果存在则显示内容A,否则就显示内容B。原本以为可以很快的找到这个方面的参考资料,结果是找了一个下午都没有从官方文档中找到相应的说明,最终还是通过Mail-List Archive找到了解答。
        由于WebWork对request,parameter,Session和Application都进行了封装,将这些隐含的对象封装成了相应的
Map,如RequestMap,ParameterMap,SessionMap和ApplicationMap,而这些Map就组成了ActionContext,因此我们通常都不再需要与request,session这些底层的对象打交道了,这也是我一开始觉得迷惑的地方,因为我找不到Session了。事实上,对于SessionMap的处理即是对Session的处理了。我们可以通过ActionContext的静态方法getContext返回一个ActionContext的实例,然后再调用其getSession方法获得SessionMap,接着就可以利用put和get方法对session进行读写的操作了。
        而在页面上,我们可以通过以下的方式对session进行操作:

<webwork:property value="#session.name" />

        #session.name表示从SessionMap中取得与"name"这个key对应的对象,实际上是调用了如下的statement:ActionContext.getContext().getSession().get("name"),并且进行了类型的转换。又如:     

<webwork:property value="#session.player.name" />

        则是在SessionMap中获得了Player对象之后,并调用类Player的getter方法:getName()获得name属性。
        简而言之,为了能够降低与部署环境的耦合程度,WebWork将Servlet的隐含对象进行了封装,这在很大程度上简
化了开发的工作。而且WebWork也提供了类ServletActionContext,我们通过这个类中的getRequest方法获得原始的HttpServletRequest,然后就可以对request和session这些底层对象进行操作了。但是,一般情况下,利用ActionContext.getSession()可以完成几乎所有的工作了,我们又为什么要去碰那些底层的东西呢?因此我们应该优先考虑使用SessionMap,而不是底层的session。
        另外一个需要注意的问题,就是SessionMap和隐藏对象session的作用域是不同的。也就是说,通过 ActionContext.getContext().getSession().put("name","Fantasy Soft"),往SessionMap中写入了与"name"这
个key相对应的内容,但是在页面上通过session.getAttribute("name")得到的将会是null。
        最后,我不得不再次说一下WebWork的文档,由于文档也是开源的,是依靠热心的开发人员去撰写的,因此质量与数量上都与WebWork本身相去甚远。尽管酒香不怕巷子深,但是这是一个注意力经济的时代,信息匮乏造成的受注意程度降低会让自己处于一个不利的位置。
       
        [1] WebWork深度探索之Pitfall

Feedback

#1楼    回复  引用    

2004-09-19 01:26 by songws [未注册用户]
我在action定义了一个session,在页面中用你的方法没法得到session的值 ,反而用session.getattribute能取到session的值 。不知是何原因?望回复songws@msn.com.

 谢谢!
           2004.9.18

#2楼    回复  引用  查看    

2004-09-19 01:50 by Fantasy Soft      
我在文章中已经回答了你提出的所有问题。

当一个action被初始化之后,就会有一个Session Map与之相关联,不需要自己去定义session。只要在Action中调用ActionContext.getContext().getSession().put(String, Object),就可以将特定的Object和一个特定的String进行绑定,并且放进Session Map中。

如果你直接对session进行操作而不是Session Map的话,操作对象都已经变了,通过文章中的方法当然得不到值了。

#3楼    回复  引用    

2005-03-20 16:42 by kk [未注册用户]
怎么使一个 session 失效呢?

#4楼    回复  引用    

2005-10-30 12:19 by wagner.lv [未注册用户]
使用
session.invalidate();

# re: WebWork深度探索之Session
2005-03-20 16:42 by kk
怎么使一个 session 失效呢?

#5楼    回复  引用    

2006-04-19 12:05 by zs [未注册用户]
如果我的数据是放在servlet的session中。那么我该怎么通过webwork标签取到这个对象呢?
<webwork:property value="#session.name" />这访问的是actioncontext里的map.但我要访问真正的session该怎么办?标签的语法该怎么写。

教教我!!!!!!谢谢啦。

#6楼 [楼主]   回复  引用  查看    

2006-04-19 14:01 by FantasySoft      
@zs
使用webwork标签估计是无法做到你想要的功能了。 你可以考虑用JSTL的c标签,你在JSP页面上是可以访问到HttpSession的。

BTW:建议你多使用封装后的SessionMap~~

#7楼    回复  引用    

2006-06-30 14:29 by wml [未注册用户]
如何设置 SessionMap 的超时时间呢 ?

#8楼    回复  引用    

2007-01-22 14:06 by memory [未注册用户]
谢谢,你的文章我都看了,对webwork有了一个稍微清晰的印象了,谢谢~

#9楼    回复  引用    

2007-11-13 00:56 by 姓名 [未注册用户]
为什么我用ajax得到的session是null呢

标题  
姓名  
主页
Email (只有博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
该文被作者在 2004-10-14 17:03 编辑过
 
另存  打印