allenlee 2009-10-13 15:49
浏览 231
已采纳

webwork:打开网站任何一页前先查询变量然后设置到session里

webwork做的网站,现在需要无论从网站任何一个页面进入网站,都能先从后台查询变量x然后设置变量x到session里,然后再在这个页面里把变量x取出来。
 先在我的网站数据库中有个库存变量storage,int类型。设计网站时只是在打开首页index.jsp的时候先执行了后台index.action在里面查询了storage,然后设置到session中,在index.jsp页面中取到storage。但是如果首先打开其他页面由于没有先执行后台index.action,所以在这个页面取不到storage。我想在过滤器里打开每个页面时执行查询操作设置storage到session中,但是由于webwork中HttpSession httpSession = ServletActionContext.getRequest().getSession();但是由于不是在webwork的action中,所以ServletActionContext.getRequest()取到的request为空会报异常,所以该咋办?
  • 写回答

3条回答 默认 最新

  • Ryankay 2009-10-13 16:09
    关注

    楼主,看来你对serlvet-jsp编程的基础方面有些薄弱。不管是用struts1,struts2,还是webwork。他们的原理都还是jsp-serlvet,所以,你也可以直接使用jsp-servlet编程。

    所以你提到的过滤器里可以直接使用楼上所说的request.getSession(0;只不过,这里的request需要由ServletRequest 强制转换成HttpServletRequest。不要怀疑,直接强制转换即可!

    当然就这个问题,我想说的还不止这些,关于思路方面,我觉得你的这个思路未免把问题看得太复杂。

    事实上,你只需要写一个servlet,设置这个servlet在服务器启动的时候跟随启动[在web.xml里配置]
    比如[code="java"]

    JSPSupportServlet
    org.apache.struts2.views.JspSupportServlet
    4

    [/code]

    在这个servlet里把你的库级变量存到application里,虽然我不知道你的需求。但是,如果是放到session里,对于每个用户都有一个session.这就如同多线程,你的这个变量并非线程安全的,就是说用户A拿了变量a后,用户B可能会执行修改变量a的行为。而反过来当用户A执行更新行为的时候,那么这个变量就已经是无效数据了,比如用户A拿到得是100,用户B拿到的是100,此时用户B执行了+1,那么数据库里是101了,但用户A手上还是100,用户A在执行+1后也是101,然后存入数据库,显然,本来应该是100+1+1=102的。所以我建议你建立一起全局变量,public static a;
    并且在对a进行更新的方法内部必须调用加载a变量的方法。这样,在执行操作前变量a始终是最新的。

    我猜测你是做一个访问量统计吧,应该是类似的东西。但也许不是,希望对你有帮助。如果不是就权当讨论。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

悬赏问题

  • ¥50 永磁型步进电机PID算法
  • ¥15 sqlite 附加(attach database)加密数据库时,返回26是什么原因呢?
  • ¥88 找成都本地经验丰富懂小程序开发的技术大咖
  • ¥15 如何处理复杂数据表格的除法运算
  • ¥15 如何用stc8h1k08的片子做485数据透传的功能?(关键词-串口)
  • ¥15 有兄弟姐妹会用word插图功能制作类似citespace的图片吗?
  • ¥200 uniapp长期运行卡死问题解决
  • ¥15 latex怎么处理论文引理引用参考文献
  • ¥15 请教:如何用postman调用本地虚拟机区块链接上的合约?
  • ¥15 为什么使用javacv转封装rtsp为rtmp时出现如下问题:[h264 @ 000000004faf7500]no frame?