友情提示:如果本网页打开太慢或显示不完整,请尝试鼠标右键“刷新”本网页!阅读过程发现任何错误请告诉我们,谢谢!! 报告错误
狗狗书籍 返回本书目录 我的书架 我的书签 TXT全本下载 进入书吧 加入书签

JSP入门教程(DOC格式)-第21章

按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!




    List onlineUserList = (List)  

application。getAttribute(〃onlineUserList〃);  

    // 第一次使用前,需要初始化  

    if  (onlineUserList == null) {  

        onlineUserList = new ArrayList();  

        application。setAttribute(〃onlineUserList〃; onlineUserList);  

    }  

    onlineUserList。add(this。username);  

}   



username 已经通过构造方法传递给 listener,在数据绑定时,可以直接把它放 

入用户列表。  



与之对应的 valueUnbound()方法,代码如下:  



public void valueUnbound(HttpSessionBindingEvent event) {  

    HttpSession session = event。getSession();  

    ServletContext application = session。getServletContext();  

  

    // 从在线列表中删除用户名  

    List onlineUserList = (List)  

application。getAttribute(〃onlineUserList〃);  



                                     81 / 148  


…………………………………………………………Page 82……………………………………………………………

                                            



    onlineUserList。remove(this。username);  

  

    System。out。println(this。username + 〃退出。〃);  

}    



这里可以直接使用 listener 的username 操作在线列表,不必再去担心 session 

中是否存在username。  



valueUnbound 的触发条件是以下三种情况:  



    1。  执行 session。invalidate()时。  

    2。  session 超时,自动销毁时。  

    3。  执行 session。setAttribute(〃onlineUserListener〃; 〃其他对象〃);或 

       session。removeAttribute(〃onlineUserListener〃);将 listener 从 

       session 中删除时。  



因此,只要不将 listener 从 session 中删除,就可以监听到 session 的销毁。  



例子在 08…02 目录下,可以与08…01 对比一下异同,两者的最终效果是相同的。  



                                        82 / 148  


…………………………………………………………Page 83……………………………………………………………

                                        



                   第 9 章 封装 taglib 组件  



注意  



这里讲介绍自定义标签库(taglib),将原本需要写在 jsp 中的 java 代码封装 

起来,成为可复用的组件。  



taglib 本意是为了弥补 jsp 的先天不足,但它的笨重与复杂也颇为经典,可惜 

有的地方又不得不用,如果对其没有耐心尽可跳过。  



如果你不满足以下任一条件,请继续阅读,否则请跳过此后的部分,进入下一章: 

第 10 章 综合电子留言板。  



    1。  了解 taglib 的使用和制作。  

   2。  根本不想消除 jsp 中的 java 代码,也不打算写一些可以复用的组件。  



9。1。 用 taglib 实现循环  



回到联系簿的例子第 5。2 节  “Read(读取)”,不觉得这个 list。jsp 中的 java 

代码太碍眼了吗?  



  

                  

                    {contact。username}  

                    {contact。sex}  

                    {contact。email}  

                    {contact。qq}  

                    {contact。descn}  

                    修改 |  

删除  

                  

  



                                     83 / 148  


…………………………………………………………Page 84……………………………………………………………

                                        



如果能像使用 jsp 动作(action)一样,使用的形式进行循环该多好 

啊?可惜 jsp 动作(action)的功能太少了,它没办法进行循环,我们只好自己 

实现 taglib。  



比较一下使用taglib 前后 jsp 中的样子。  



  

      

        {contact。username}  

        {contact。sex}  

        {contact。email}  

        {contact。qq}  

        {contact。descn}  

        修改 

 | 删除 

  

      

  

          



taglib 的写法和 jsp 动作(action)很相似,是由taglib 前缀,冒号,标签名 

三者的组合体。其中 taglib 前缀是用 jsp 指令(direction)定义的。  



  



这里的 jsp 指令 (direction)是专门用来定义标签库的,uri 指定 tld 定义文 

件的位置,prefix 指定对应的 taglib 前缀。通过这里的定义才能在下面使用 

taglib。  



看看 taglib 带给了我们什么?  



    1。  items=〃{list}〃表示将对 list 变量进行循环操作。  

   2。  var=〃contact〃表示循环得到的每个元素对应的变量名。  



       taglib 中循环 list,每获得一个数据就通过 

       pageContext。setAttribute(〃contact〃; contact);放到 pageContext 中, 

       接着处理标签中包含的内容,这样标签中间的内容就可以通过 

       {context。username}的形式获得每一行的数据。  



了解过如何使用我们的 taglib,现在可以看具体实现了,首先我们要编写一个 

ForTag。java。  



                                     84 / 148  


…………………………………………………………Page 85……………………………………………………………

                                      



1。  第一步,让 ForTag 继承 BodyTagSupport。  



   BodyTagSupport 专门用来制作带内容的 taglib,它为我们提供了几个好 

   用的方法来处理数据。  



2。  第二步,为 ForTag 设置两个自定义参数:var 和 items。  



   对应标签中的,我们需 

   要在 ForTag 中写两个与其名称对应的 setter 方法。  



   public void setVar(String var) {  

       this。var = var;  

   }  

   public void setItems(Collection items) {  

       this。iterator = items。iterator();  

   }   



   这两个方法会在标签使用的时候,自动获得参数的值,供以后使用。  



3。  第三步,让 ForTag 处理标签内容。  



   public int doStartTag() throws JspException {  

       this。index = 0;  

        if  (this。process()) {  

            return EVAL_BODY_INCLUDE;  

       } else  {  

           return EVAL_PAGE;  

返回目录 上一页 下一页 回到顶部 0 0
未阅读完?加入书签已便下次继续阅读!
温馨提示: 温看小说的同时发表评论,说出自己的看法和其它小伙伴们分享也不错哦!发表书评还可以获得积分和经验奖励,认真写原创书评 被采纳为精评可以获得大量金币、积分和经验奖励哦!