深入体验JavaWeb开发内幕——使用简单标签控制页面逻辑案例
2012-11-26 16:59
531 查看
使用自定义简单标签我们可以将相应的控制页面逻辑的代码封装在标签中,在使用时只需引用标签,便可达到与使用java代码同样的效果。
来看几个具体的案例:
一个tld标签库描述文件:
相关的自定义标签处理器类及相应的jsp引用文件:
1、 开发<c:if>标签
Jsp引用文件:
效果:
2、 开发<c:if><c:else>标签
if子类
else子类
父类:
Jsp引用文件
效果:
3、开发迭代标签
Jsp引用文件
例3的效果图:
Jsp引用文件
效果如图:
好了赶快自己试试吧!
来看几个具体的案例:
一个tld标签库描述文件:
<?xml version="1.0"encoding="UTF-8" ?> <taglib xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd" version="2.0"> <description>A taglibrary exercising SimpleTag handlers.</description> <tlib-version>1.0</tlib-version> <short-name>c</short-name> <uri>http://www.hbsi.examplec</uri> <tag> <description>OutputsHello, World</description> <name>if</name> <tag-class>www.hbsi.web.example.IFSimpleTag</tag-class> <body-content>scriptless</body-content> <attribute> <name>flag</name> <required>true</required> <rtexprvalue>true</rtexprvalue> </attribute> </tag> <tag> <description>OutputsHello, World</description> <name>choice</name> <tag-class>www.hbsi.web.example.CElseSimpleTag</tag-class> <body-content>scriptless</body-content> </tag> <tag> <description>OutputsHello, World</description> <name>If</name> <tag-class>www.hbsi.web.example.CIFSimpleTag</tag-class> <body-content>scriptless</body-content> <attribute> <name>test</name> <required>true</required> <rtexprvalue>true</rtexprvalue> </attribute> </tag> <tag> <description>OutputsHello, World</description> <name>Else</name> <tag-class>www.hbsi.web.example.CElseSimpleTag</tag-class> <body-content>scriptless</body-content> </tag> </taglib>
相关的自定义标签处理器类及相应的jsp引用文件:
1、 开发<c:if>标签
publicclass IFSimpleTag extends SimpleTagSupport{ privatebooleanflag ; publicvoid setFlag(boolean flag) { this.flag = flag; } @Override publicvoid doTag() throws JspException, IOException { if(flag){ JspFragment jf= this.getJspBody(); jf.invoke(null); } } }
Jsp引用文件:
<%@taglib uri="http://www.hbsi.examplec" prefix ="c" %> <body> <c:if flag="true"> 当结果为真时我才会输出!<br/> </c:if> 不管结果是什么我都会输出!<br/> </body>
效果:
2、 开发<c:if><c:else>标签
if子类
publicclass CIFSimpleTag1 extends SimpleTagSupport { privatebooleantest ; publicvoid setTest(boolean test) { this.test = test; } @Override publicvoid doTag() throws JspException, IOException { IFElseSimpleTag cie = (IFElseSimpleTag) this.getParent(); if(test && !cie.isFlag()){ this.getJspBody().invoke(null);; cie.setFlag(true); } } }
else子类
publicclass CElseSimpleTag1 extends SimpleTagSupport { @Override publicvoid doTag() throws JspException, IOException { IFElseSimpleTag cie = (IFElseSimpleTag) this.getParent(); // if(!cie.isFlag()){ if(!cie.isFlag()){ this.getJspBody().invoke(null); cie.setFlag(true); } } }
父类:
publicclass IFElseSimpleTag extends SimpleTagSupport { privatebooleanflag; publicboolean isFlag() { returnflag; } publicvoid setFlag(boolean flag) { this.flag = flag; } @Override publicvoid doTag() throws JspException, IOException { this.getJspBody().invoke(null); } }
Jsp引用文件
<%@ taglib uri="http://www.hbsi.c" prefix="c"%> <body> <c:choice> <c:if test ="<%=1==2 %>"> 当结果为真时我才会输出!<br/> </c:if> <c:else> 当结果为假时我才会输出!<br/> </c:else> </c:choice> </body>
效果:
3、开发迭代标签
publicclass ForEachSimpleTag2 extends SimpleTagSupport { private Collection collection; private String var ; private Object items; publicvoid setItems(Objectitems) { this.items = items; if(itemsinstanceof Collection){ collection = (Collection) items; } if(itemsinstanceof Map){ Map map = (Map) items; collection = map.entrySet(); } if(items.getClass().isArray()){ collection = new ArrayList(); for(int i=0;i<Array.getLength(items);i++){ collection.add(Array.get(items, i)) ; } } } publicvoid setVar(String var) { this.var = var; } @Override publicvoid doTag() throws JspException, IOException { Iterator it = collection.iterator(); while(it.hasNext()){ Object object = it.next(); this.getJspContext().setAttribute(var, object); JspFragment jf= this.getJspBody(); jf.invoke(null); } } }
Jsp引用文件
<%@ taglib uri="http://www.hbsi.c"prefix ="c" %> <body> <% List list = new ArrayList(); list.add("aa"); list.add("bb"); list.add("cc"); request.setAttribute("list",list); %> <c:ForEach items="${list}" var="l"> ${l} </c:ForEach> <hr/> <% Map map = new LinkedHashMap(); map.put("1","aaa"); map.put("2","aaa"); map.put("3","aaa"); request.setAttribute("map",map); %> <c:ForEach items="${map}" var="me"> ${me.key}----------${me.value} </c:ForEach> <hr/> <% String str [] = {"aaaaa","bbbbbb","ccccccc"}; request.setAttribute("str",str); %> <c:ForEach items="${str}" var="str"> ${str} </c:ForEach> <hr/> <% int i [] = {1,3,4}; request.setAttribute("in",i); %> <c:ForEach items="${in}" var="in"> ${in} </c:ForEach> <hr/> </body> 效果如图: 4、开发html转义标签 publicclass HTMLFilter extends SimpleTagSupport { @Override publicvoid doTag() throws JspException,IOException { JspFragment jf = this.getJspBody(); StringWriter sw = newStringWriter(); jf.invoke(sw); String content = sw.toString(); String contents = filter(content); this.getJspContext().getOut().write(contents); } public Stringfilter(String message) { if (message == null) return (null); char content[] = newchar[message.length()]; message.getChars(0, message.length(), content, 0); StringBuffer result = new StringBuffer(content.length + 50); for (int i =0; i < content.length; i++) { switch (content[i]) { case'<': result.append("<"); break; case'>': result.append(">"); break; case'&': result.append("&"); break; case'"': result.append("""); break; default: result.append(content[i]); } } return (result.toString()); } }
例3的效果图:
Jsp引用文件
<%@ taglib uri="http://www.hbsi.c"prefix="c"%> <body> <c:filter> 将文件中的HTML原作用除去! <a href = "#">Hello!</a> </c:filter> </body>
效果如图:
好了赶快自己试试吧!
相关文章推荐
- 使用标签控制页面逻辑案例
- 简单标签的使用自定义标签控制页面内容(标签体)是否输出、
- 深入体验JavaWeb开发内幕——使用简单标签实现传统标签开发实现的几个功能
- Struts2 标签 迭代标签和控制标签的简单使用
- 使用WdatePicker时间插件简单的控制页面上两个时间选择的前后范围
- 最新简单标签JSP页面控制详解
- jQuery datatables使用(前台页面分页 简单案例 1 未完待续...)
- 自定义标签之三—传统自定义标签与简单自定义标签关于控制整个页面是否输出
- 使用WdatePicker时间插件简单的控制页面上两个时间选择的前后范围
- IOS开发:使用animateWithDuration简单地控制页面切换效果
- 简单自定义标签的使用案例
- 【自定义标签】开发流程、执行流程、传统标签库、简单标签库——控制往内容是否输出、控制页面是否输出
- 【STM32小案例 04 】STM32简单使用L298N电机驱动模块 控制直流电机正反转
- HTML5 入门:一个最简单的HTML页面(doctype、meta、Head、标签的使用)
- 游戏简单控制逻辑 一个轻量级的状态机
- 请写一个简单的幻灯效果页面。如果不使用JS来完成,可以加分。
- 【REACT NATIVE 系列教程之八】不使用NAVIGATOR实现切换(页面)场景的两种形式(逻辑与MODAL)
- Java使用MyEclipse构建webService简单案例
- 史上最全的CSS hack方式一览 jQuery 图片轮播的代码分离 JQuery中的动画 C#中Trim()、TrimStart()、TrimEnd()的用法 marquee 标签的使用详情 js鼠标事件 js添加遮罩层 页面上通过地址栏传值时出现乱码的两种解决方法 ref和out的区别在c#中 总结
- 自定义标签之五—传统自定义标签与简单自定义标签关于更新页面内容(小写变大写)