jsp自定义标签开发

上传人:ra****d 文档编号:112371176 上传时间:2022-06-22 格式:DOC 页数:13 大小:240KB
返回 下载 相关 举报
jsp自定义标签开发_第1页
第1页 / 共13页
jsp自定义标签开发_第2页
第2页 / 共13页
jsp自定义标签开发_第3页
第3页 / 共13页
点击查看更多>>
资源描述
一般情况下开发jsp自定义标签需要引用以下两个包import javax.servlet.jsp.*;import javax.servlet.jsp.tagext.*;首先我们需要大致了解开发自定义标签所涉及到的接口与类的层次结构(其中SimpleTag接口与SimpleTagSupport类是JSP2.0中新引入的)。目标1:自定义一个用表格显示用户信息的简单标签效果图:在jsp页面使用此自定义标签:假设我们有一个UserInfo的javabean,那么在JSP页面使用此标签只需调用此标签即可1. 2. 9. 10. 11. 开发步骤:简单标签的开发我们只要实现Tag接口即可,为了简单起见可以直接继承实现了此接口的TagSupport类1 创立自定义标签类1. publicclassUserInfoTagextendsTagSupport 2. 3. privateUserInfouser; 4. 5. Override 6. publicintdoStartTag()throwsJspException 7. try 8. JspWriterout=this.pageContext.getOut(); 9. if(user=null) 10. out.println(NoUserInfoFound.); 11. returnSKIP_BODY; 12. 13. out.println(); 14. out.println(); 15. out.println(Username:); 16. out.println(+user.getUserName()+); 17. out.println(); 18. out.println(); 19. out.println(Age:); 20. out.println(+user.getAge()+); 21. out.println(); 22. out.println(); 23. out.println(Email:); 24. out.println(+user.getEmail()+); 25. out.println(); 26. out.println(); 27. catch(Exceptione) 28. thrownewJspException(e.getMessage(); 29. 30. returnSKIP_BODY; 31. 32. 33. Override 34. publicintdoEndTag()throwsJspException 35. returnEVAL_PAGE; 36. 37. 38. Override 39. publicvoidrelease() 40. super.release(); 41. this.user=null; 42. 43. 44. /getterandsetters 45. publicUserInfogetUser() 46. returnuser; 47. 48. publicvoidsetUser(UserInfouser) 49. this.user=user; 50. 51. 52. 2 在Web-Inf创立标签库描述文件.tdl(Tag Library Description)1. 2. 5. 1.06. 2.07. cc8. /mytaglib9. 10. showUserInfo11. 12. empty13. 14. user15. false16. true17. 18. 19. 3 配置web.xml1. 2. 3. /mytaglib4. /WEB-INF/mytaglib.tld5. 6. 4 在需要使用此标签的jsp页面头部引入1. 5 使用(参照上面的使用步骤)此致,一个简单的JSP标签开发完成标签类说明:我们创立的UserInfoTag类继承了TagSupport类,而它又实现了Tag接口,Tag接口的生命周期由其所在的容器控制,如下列图:setPageContext() 将所在jsp页面的pageContext注入进来,目的是为了在后面的方法中可以访问到jsp页面对象的pageContext属性setParent() 设置此标签的父标签setAttribute() 将标签中的属性注入到此class的属性,不需要自己实现但要提供属性的get与set方法doStartTag() 在开始标签属性设置后调用,如果返回SKIP_BODY那么忽略标签之中的内容,如果返回EVAL_BODY_INCLUDE那么将标签体的内容进行输出doEndTag() 在结束标签之前调用,返回SKIP_PAGE跳过整个jsp页面后面的输出,返回EVAL_PAGE执行页面余下局部release() 生命周期结束时调用特别说明:在tomcat4.1之后的版本中默认开启了标签缓冲池(websphere和weblogic并不会这么做),所以执行完标签后并不会执行release()方法(_jspDestroy()时才释放),也就是说同一个jsp页面自定义标签不管使用多少次只会存在一个实例,但也并不是每一个标签都会为其创立一个缓冲池,要根据参数来判断,例如:1. 2. 上面例子中由于参数不同就会创立两个标签缓冲池。这个问题可以通过设定tomcat的配置文件加以解决:在%tomcat%confweb.xml参加enablePooling参数,并设置为false(不缓存自定义标签)。1. 2. enablePooling3. false4. 清空%tomcat%conf目录TagSupport类已经为我们实现并扩展了一些方法(比方在上述方法中我们可以直接使用pageContext对象,调用父标签getParent()等),所以一般情况下我们只需重写doStartTag(),doEndTag() 即可TLD文件说明:1.02.0ccshowUserInfocom.mytags.UserInfoTagemptyuserfalsetrueWeb.xml文件说明:!-标签库的uri路径即jsp头文件中声明的uri-/mytaglib/WEB-INF/mytaglib.tld目标2:自定义一个类似于Asp.Net中的Reapter控件的标签效果图:在jsp页面使用此自定义标签:1. 2. % 3. Listusers=newArrayList(); 4. users.add(newUserInfo(Zhangsan,12,Zhangsan163 ); 5. users.add(newUserInfo(Lisi,22,Lisisina ); 6. users.add(newUserInfo(Wangwu,33,Wangwuqq ); 7. pageContext.setAttribute(users,users); 8. %9. 10. 11. 12. 13. UserName14. Age15. Email16. 17. 18. 19. $item.userName20. $item.age21. $item.email22. 23. 24. 开发步骤:要完成此控件我们需要实现一个迭代接口,即IterationTag,由于TagSupport同样实现了此接口,所以我们继承此类1 创立自定义标签类1. publicclassRepeaterextendsTagSupport 2. privateCollectionitems; 3. privateIteratorit; 4. privateStringvar; 5. 6. Override 7. publicintdoStartTag()throwsJspException 8. if(items=null|items.size()=0)returnSKIP_BODY; 9. it=items.iterator(); 10. if(it.hasNext() 11. pageContext.setAttribute(var,it.next(); 12. 13. returnEVAL_BODY_INCLUDE; 14. 15. 16. Override 17. publicintdoAfterBody()throwsJspException 18. if(it.hasNext() 19. pageContext.setAttribute(var,it.next(); 20. returnEVAL_BODY_AGAIN; 21. 22. returnSKIP_BODY; 23. 24. 25. Override 26. publicintdoEndTag()throwsJspException 27. returnEVAL_PAGE; 28. 29. 30. publicvoidsetItems(Collectionitems) 31. this.items=items; 32. 33. 34. publicvoidsetVar(Stringvar) 35. this.var=var; 36. 37. 2在Web-Inf创立标签库描述文件.tdl(Tag Library Description)由于目标1种已经创立了此文件,我们只需增加此标签的配置即可1. 2. repeater3. 4. jsp5. 6. items7. false8. true9. 10. 11. var12. true13. true14. 15. 16. 3 配置web.xml 目标1中已完成,无需修改4 在需要使用此标签的jsp页面头部引入1. 5 使用(参照上面的使用步骤)标签类说明:我们用到了迭代接口,以下是容器处理此接口的流程作为目标1中的补充: 在doAfterBody()如果返回值是EVAL_BODY_AGAIN那么将重新执行此方法目标3:使用BodyTagSupport此目标并不会使用实际例子进行显示,主要是说明为什么,什么情况下需要使用到BodyTag接口或者BodyTagSupport类?如果我们需要在. 之间的标签体的头部和尾部加上一些标记或者是其他处理,一般的处理方法是在doStartTag和doEndTag方法中进行, 但是如果是个迭代标签,标签体的每段内容在循环输出时每次都需要在头部和尾部加上一些标记,我们使用BodyTagSupport就很方便了,此接口在doStartTag()方法返回值多了一个EVAL_BODY_BUFFERED,它将对主体进行计算,并输出到缓冲区(注:此处是缓冲区并非直接输出到客户端,需要我们手动(this.bodyContent.getEnclosingWriter().write(this.bodyContent.getString();)进行输出客户端的调用,否那么主体内容不会进行显示)标签类说明:关于BodyTagSupport接口的说明目标4:自定义的函数库1 创立函数库类1. publicclassMyFunctions 2. publicstaticStringformatMyName(Stringname) 3. returnyournameis+name; 4. 5. publicstaticintadd(inta,intb) 6. returna+b; 7. 8. 2 在TLD文件中配置 (引用于目标1中的tld文件)1. 2. formatMyName3. 4. java.lang.StringformatMyName(java.lang.String)5. 6. 7. 8. add9. 10. java.lang.Stringadd(int,int)11. 3 JSP中调用1. $cc:formatMyName(wangfei) 2. $cc:add(12,34)s
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 商业管理 > 商业计划


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!