心得14--jsp遍历所有数据标签与转义标签
1.? 開發(fā)遍歷所有類型數據的標簽
標簽處理類: 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頁面?zhèn)鬟M來的屬性強轉為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. 開發(fā)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包中,就是要把標簽處理類的字節(jié)碼和標簽庫描述文件按照一定的存放方式添加到一個jar包中。具體做法如下。把標簽處理類字節(jié)碼和標簽庫描述文件按如下所示的結構組織。
?? 標簽庫描述符文件要放置在jar文件的META-INF目錄下(這里注意META-INF的書寫不要誤寫成MEAT-INF,本人就愛范這種低級錯誤,一定要正確,稍微寫錯一點就會導致打出來的包不能用);標簽處理類字節(jié)碼的根目錄和META-INF目錄平級放置。
可以利用myeclipse工具倒包,前面博客具體介紹過,這里再簡單說一下:就是右鍵導出(export)項目,選擇java下的jar文件。具體如下圖所示
如上圖顯示的.classpath和.project是jar包不需要的,可以不打進包中,所以不用勾選,然后點擊Browse選擇一個路徑輸出jar包,這就完成了打包,注意:這里是建一個java項目然后打包。打出來的是jar包用web項目打出的是war包。
也可以使用jar命令來創(chuàng)建jar文件,具體做法如下:jar cvf mytaglib_0.9.jar? META-INF(描述文件)? com(class字節(jié)碼)完成這兩個步驟之后,一個自定義標簽庫jar包就打好了,可以把它添加到任何想使用這個標簽庫的Web應用程序的WEB-INF/lib目錄下使用了。
?
?
?
轉載于:https://www.cnblogs.com/yangkai-cn/archive/2012/11/20/4017345.html
總結
以上是生活随笔為你收集整理的心得14--jsp遍历所有数据标签与转义标签的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MEF: MSDN 杂志上的文章(15)
- 下一篇: 在 Mac OS X Lion 下修改