1.  开发遍历所有类型数据的标签

标签处理类:

package com.csdn.web.example;import java.io.IOException;import java.lang.reflect.Array;import java.util.ArrayList;import java.util.Collection;import java.util.HashMap;import java.util.Iterator;import java.util.Map;import javax.servlet.jsp.JspException;import javax.servlet.jsp.tagext.SimpleTagSupport;publicclass ForEachAll extends SimpleTagSupport{private Collection collection;private String var;private Object items;publicvoid setVar(String var) {this.var = var;}publicvoid setItems(Object items) {this.items = items;}@Overridepublicvoid doTag() throws JspException, IOException {//判断是否是Map 下面的三个判断可以在doTage()方法中也可以在setItems()方法中if(itemsinstanceof Map){//这里要把jsp页面传进来的属性强转为Map类型,不能new HashMapMap map = (Map) items;collection = map.entrySet();      }//判断是否是set、listif(itemsinstanceof Collection){collection = (Collection) items;}//判断是否是数组,各种数组if(items.getClass().isArray()){collection = new ArrayList();int len = Array.getLength(items);for(int i=0;i<len;i++){collection .add( Array.get(items, i));}}Iterator it = collection.iterator();while(it.hasNext()){Object obj = it.next();this.getJspContext().setAttribute(var,obj);this.getJspBody().invoke(null);}}}Jsp文件<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%><%@ taglib uri="example"  prefix="example"%><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html><head><title>遍历各种类型数据</title></head><body><%List list = new ArrayList();list.add(1);list.add("aa");list.add("bb");list.add(2);request.setAttribute("list",list);%><example:forEachAll var="str" items="${list}">${ str }<br></example:forEachAll><hr><%Map map = new HashMap();map.put("1","aa");map.put(2,"aa");map.put(3,"aa");map.put(4,"aa");request.setAttribute("map",map);%><example:forEachAll items="${map}" var="map">${ map.key}-------${ map.value }<br></example:forEachAll><hr><%String[] strs = {"asd","fff","v","tt"};request.setAttribute("strs",strs);%><example:forEachAll items="${strs}" var="str">${str}<br></example:forEachAll><hr><%int[] i = {1,2,3,4};request.setAttribute("i",i);%><example:forEachAll items="${i}" var="num">${num}<br></example:forEachAll></body></html>注:描述文件与前面博客的forEach标签的定义一样,这里就不啰嗦的列出,不懂的可以去看上一篇博客2.     开发html转义标签案例分析:标签处理类:package com.csdn.web.example;import java.io.IOException;import java.io.StringWriter;import javax.servlet.jsp.JspException;import javax.servlet.jsp.tagext.JspFragment;import javax.servlet.jsp.tagext.SimpleTagSupport;publicclass HtmlFilter extends SimpleTagSupport {@Overridepublicvoid doTag() throws JspException, IOException {JspFragment jf = this.getJspBody();StringWriter sw = new StringWriter();jf.invoke(sw);String s = sw.toString();s = filter(s);this.getJspContext().getOut().write(s);}//这个模版文件tomcat下也有,可以参考那个。转移标签模版文件:D:\java\Tomcat\apache-tomcat-6.0.18\webapps\examples\WEB-INF\classes\utilpublic String filter(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());}}JSP文件<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%><%@ taglib uri="example" prefix="example" %><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html><head><title>自定义转义标签</title></head><body><example:HtmlFilter><a href="">自定义转义标签</a></example:HtmlFilter></body></html>

3.  自定义标签不报错,但是结果不对的原因及处理:

情况一:检查你的jsp页面上的taglib指令是否写了,如果写了,在检查一下你的uri路径是否正确;如果都正确,再看看你的tld描述文件中的tag标签定义的是否正确,它中的uri类路径是否正确,起的名字是否一致。

情况二:检查你的标签处理类是否正确,主要错误有你是不是忘了写输出到浏览器的代码,有两种形式:1).this.getJspContext().getOut().write(s);2).this.getJspBody.invoke(null);这两种输出分别是不同的输出,后者是JspFragment

类对象的输出,直接输出null就相当于情况一的输出;还有一点要注意的是:invoke()方法可以直接输出到浏览器也可以给它传一个流参数,常用的是StringWriter字符输出流,这是两种输出要同时配合使用,比如:

spFragment jf = this.getJspBody();

StringWriter sw = new StringWriter();

jf.invoke(sw);

String s = sw.toString();

s = filter(s);

this.getJspContext().getOut().write(s);

但是大多数人会忘了最后一句的输出浏览器的代码,这是就是情况二常犯的错误了

4. 打包标签库

一般情况下直接打包就行,但是有时候打出来的包不能用,还需要导入你class文件中需要的类文件jar包,这时候你需要到tomcat下的,比如我的是D:\java\Tomcat\apache-tomcat-6.0.18\lib这个路径下导入jsp-api.jar和servlet-api.jar这两个文件。

把自定义的标签打到一个jar包中,就是要把标签处理类的字节码和标签库描述文件按照一定的存放方式添加到一个jar包中。具体做法如下。把标签处理类字节码和标签库描述文件按如下所示的结构组织。

标签库描述符文件要放置在jar文件的META-INF目录下(这里注意META-INF的书写不要误写成MEAT-INF,本人就爱范这种低级错误,一定要正确,稍微写错一点就会导致打出来的包不能用);标签处理类字节码的根目录和META-INF目录平级放置。

可以利用myeclipse工具倒包,前面博客具体介绍过,这里再简单说一下:就是右键导出(export)项目,选择java下的jar文件。具体如下图所示

如上图显示的.classpath和.project是jar包不需要的,可以不打进包中,所以不用勾选,然后点击Browse选择一个路径输出jar包,这就完成了打包,注意:这里是建一个java项目然后打包。打出来的是jar包用web项目打出的是war包。

也可以使用jar命令来创建jar文件,具体做法如下:jar cvf mytaglib_0.9.jar  META-INF(描述文件)  com(class字节码)完成这两个步骤之后,一个自定义标签库jar包就打好了,可以把它添加到任何想使用这个标签库的Web应用程序的WEB-INF/lib目录下使用了。

转载于:https://www.cnblogs.com/yangkai-cn/archive/2012/11/20/4017345.html

心得14--jsp遍历所有数据标签与转义标签相关推荐

  1. 学会怎样使用Jsp 内置标签、jstl标签库及自定义标签

    学习jsp不得不学习jsp标签,一般来说,对于一个jsp开发者,可以理解为jsp页面中出现的java代码越少,对jsp的掌握就越好,而替换掉java代码的重要方式就是使用jsp标签.  jsp标签的分 ...

  2. JSP标签和JSTL标签注意点

    1.转发和重定向问题 当前项目:/Test 转发路径:"/"根目录表示当前项目"/Test","/login.jsp"就是"/Te ...

  3. 【JSP教科书】JSP知识在线指南(记录知识JSP体系、EL表达式、JSTL标签库、JSP开发模型和分页查询)

    文章目录 @[toc] 一.JSP简介 1.1 什么是JSP? 1.2 JSP的特点 1.3 JSP为什么也是Servlet 1.4 tomact服务器中的资源分析 1.4.1 tomact服务器中的 ...

  4. ajax 怎么input赋值,jQuery ajax请求返回list数据动态生成input标签,并把list数据赋值到input标签...

    jQuery ajax请求返回list数据动态生成input标签,并把list数据赋值到input标签 发布于 2016-11-25 16:26:40 | 111 次阅读 | 评论: 0 | 来源: ...

  5. 18、EL表达式、JSP标签、JSTL标签、自定义标签

    EL表达式 jsp的核心语法: jsp表达式 <%=%>和 jsp脚本<% %>. 以后开发jsp的原则: 尽量在jsp页面中少写甚至不写java代码. 使用EL表达式替换掉j ...

  6. at24c16如何划分出多个读写区_如何1分钟遍历100T数据?

    如何快速遍历一个超大数据集 ? 文件是存储在磁盘上的,文件的读写访问速度受限于磁盘的物理限. 如果才能在1 分钟内完成 100T 大文件的遍历呢? 磁盘存储结构 磁盘是一种可持久保存,持续读写数据的存 ...

  7. JSP标签:jsp内置标签、jstl标签、自定义标签

     一.jsp标签的分类: 1)内置标签(动作标签): 不需要在jsp页面导入标签 2)jstl标签: 需要在jsp页面中导入标签 3)自定义标签 : 开发者自行定义,需要在jsp页面导入标签    1 ...

  8. jsf标签,jsp标签与jstl标签

    JSF通过定制标签与JSP集成.之前展示过的所有 JSF标签,<h:inputText>.<h:outputText>.<h:form> 和<f:view&g ...

  9. jsp与servlet数据交互出现null或???解决方案

    jsp向servlet发送数据出现null: 检擦name值是否设置称中文,name值设置成中文servlet无法识别,会导致null的问题. jsp接收servlet的数据出现null: 检查数据库 ...

最新文章

  1. Fiddler 抓包高级进阶篇-天罗地网抓包大法
  2. visio 科学图形包_R可视乎|混合多个图形
  3. boost::mp11::mp_and相关用法的测试程序
  4. nusoap php 7,nusoap-用php的NuSoap 访问webservice遇到的问题。
  5. 使用事件和消息队列实现分布式事务
  6. Spring Cloud的应用程序—上下文服务
  7. 内存优化-使用tcmalloc分析解决内存泄漏和内存暴涨问题
  8. 一位技术校招生在支付宝的成长笔记
  9. OpenHarmony移植案例:如何适配服务启动引导部件bootstrap_lite
  10. (40)Xilinx PLL IP核配置(一)(第8天)
  11. gauge对应的JAVA类型_spring boot 源码解析38-GaugeService详解
  12. week one(1)—What is machine learning?
  13. css背景透明度不影响文字_唯美文字背景图 | 生活不一定很酷
  14. 软件工程 超市库存管理系统 UML模型
  15. 计算机一级在线模拟试题,全国计算机等级考试一级模拟试题(一)
  16. 【竞赛篇-国创(大创)线上报告撰写(常用套话总结)】季度报告、中期报告、结题报告怎么写,用什么格式,附件传什么比较好
  17. h5的横线_使用HTML5 Canvas绘制直线或折线等线条的方法讲解
  18. centos环境更换IP地址为静态并且正常联网
  19. FX5u控制4个伺服,一个完整的项目 程序用 标签分层,说明了定位控制中的公共参数设定、回原点、
  20. 有n堆石子,每次取出两堆合成一堆,每堆石子的个数即为合并石子所需要耗费的体力,求出合并所有石子堆所需要耗费的最小体力

热门文章

  1. 移动端WEB开发之响应式布局(响应式开发原理、bootstrap、阿里百秀案例)
  2. LeetCode 1673. 找出最具竞争力的子序列(单调栈)
  3. LeetCode 1072. 按列翻转得到最大值等行数(查找相同的模式,哈希计数)
  4. LeetCode 826. 安排工作以达到最大收益(map)
  5. LeetCode 1289. 下降路径最小和 II(DP)
  6. python--从入门到实践--chapter 11 代码测试unittest
  7. junit跳过datasource_maven – spring集成测试无法加载上下文“另一个资源已存在,名称为dataSource”...
  8. python面试总结(五)内存管理与MYSQL引擎选择
  9. webgis 行政图报错_WebGIS 地图 示例源码下载
  10. html仿手机界面,javascript新手实例3-仿手机聊天界面(if else运用)