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

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

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




            return EVAL_BODY_INCLUDE;  

       } else  {  

           return EVAL_PAGE;  

       }  

   }  

     

   public int doAfterBody() {  

       if  (this。process()) {  

           return EVAL_BODY_AGAIN;  

       } else  {  

           return EVAL_PAGE;  

       }  

   }  



   为了实现循环,我们需要监听两个事件。  



   doStartTag()方法在标签开始时执行,要记住每次都要对类进行初始化, 

   避免上一次的遗留数据对操作造成影响。然后判断是否有数据需要处理, 

   如果有,则返回 EVAL_BODY_INCLUDE 开始处理标签里的内容,如果没有, 

   返回 EVAL_PAGE 跳过标签内容执行标签下面的内容。  



                                  85 / 148  


…………………………………………………………Page 86……………………………………………………………

                                         



       doAfterBody()方法在每次处理完标签内部内容后执行,判断循环是否已 

       经结束,如果可以继续循环,返回 EVAL_BODY_AGAIN 用循环得到新的数据 

       再次处理标签内部内容,如果循环结束就返回 EVAL_PAGE 结束标签。  



   4。  第四步,进行循环时的处理。  



       private boolean process() {  

           if  (this。iterator。hasNext()) {  

               String row = this。index % 2 != 0 ? 〃odd〃  : 〃even〃 ;  

               pageContext。setAttribute(var + 〃_index〃; this。index);  

               pageContext。setAttribute (var + 〃_row〃; row);  

               Object item = this。iterator。next();  

               pageContext。setAttribute(var; item);  

               this。index++;  

               return true;  

           } else  {  

               return false;  

           }  

       }    



       process()方法在 doStartTag()和 doAfterBody()中都会用到,它的用途 

       是判断循环是否结束,如果还可以继续循环就返回 true,否则返回 false。  



       如果还可以继续循环,则从 iterator 中循环获得下一个数据,根据var 

       的值放到pageContext 中,同时放到pageContext 里的还有 index 索引值 

       和 row 索引值的奇偶,odd 代表奇数行,even 代表偶数行。var=〃contact〃 

       的情况下,{contact}表示循环数据,{contact_index}表示索引值, 

       {context_row}表示奇偶性,这些都可以在标签内部的 jsp 中直接使用。  



经过如此一番周折,ForTag 可以从标签获得参数,并对数据进行循环处理了。 

最后一步还要为它编写 tld (taglib definition)标签库定义文件,提供给 jsp 

指令(direction)引用。  



  

  

  

   1。0  

   1。2  

   lingirl  

   http://family168。/lingirl  

     

      for  



                                     86 / 148  


…………………………………………………………Page 87……………………………………………………………

                                          



      anni。ForTag  

        

         var  

         true  

         true  

         java。lang。String  

        

        

         items  

         true  

         true  

         java。util。Collection  

        

     

   



前面一大堆复杂难懂的标签指定我们使用 taglib 规范的版本,进入 tag 部分才 

开始定义名字为 for 的标签,使用 tag…class 指定对应的类,再定义两个参数: 

var 和 items。required 说明参数不能省略必须手工设置。rtexprvalue 表示参 

数部分可以使用 el,否则就只能用字符串。type 对应的是类中使用的真实类型, 

taglib 会根据它做类型转换。  



全部的例子在 09…01 目录下,注意编译taglib 需要将 jsp…api。jar 加入 

classpath,参考WEB…INF/src/pile。bat。  



结果,为了替换 4,5 行 java 代码,我们需要编写一个 ForTag。java,一个对应 

tld 文件,在 jsp 中引用 tld,最后才能使用ForTag 对 list 进行循环。不得不 

说一句:“太麻烦啦。”  



9。2。 关于 jstl  



taglib 太笨重,也太复杂了。编写一个 taglib 花费的力气太大,又不容易修改 

或扩展。一般情况下,taglib 都是由别人写好,我们再直接调用。sun 就为标签 

库定义了一套标准,叫做 jstl (java standard taglib)java 标准标签库,可 

以去http://jakarta。apache。org/taglibs/index。html 下载 apache 实现的 

jstl。  



想在项目里使用 jstl,首先要把 jstl。jar 和 standard。jar 两个文件放到 

/WEB…INF/lib/目录下。  



                                                                      



                                      87 / 148  


…………………………………………………………Page 88……………………………………………………………

                                       



然后在 list。jsp 中加入 jsp 指令(direction)引用 jstl 中定义的标签库。  



    



这里的 uri 是固定写法,只要写成这个就可以使用 jstl 了,jstl 中包含多个标 

签库,这里我们只用到 core。  



经过上述配置,现在可以使用 jstl 了,代码如下:  



  

    

      

        {contact。username}  

        {contact。sex}  

        {contact。email}  

        {contact。qq}  

        {contact。descn}  

        修改 

 | 删除 

  

      

  



这里使用的是 c:forEach,它也是一个执行循环的标签,var 和 items 参数的意 

义与上边谈到的 lingirl:for 标签已知,分别代表循环变量和循环数据。唯一不 

同的是多了一个varStatus 参数,这个参数表示当前行的状态,其中 

status。index 表示当前行的序号,我们就通过序号计算奇偶行。  



在 c:forEach 标签中,我们还看到一个 c:set 标签,它的作用是可以将指定的变 

量保存到作用域中,默认作用域是 page,这里我们使用 status。index 计算出行 

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