1. 開發遍歷所有類型數據的標簽
[java]
<span style="color:#009900;BACKGROUND-COLOR: #ffffff">標簽處理類:
</span>
<span style="BACKGROUND-COLOR: #ffffff">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;
}
@Override
publicvoid doTag() throws JspException, IOException {
//判斷是否是Map 下面的三個判斷可以在doTage()方法中也可以在setItems()方法中
if(itemsinstanceof Map){
//這裡要把jsp頁面傳進來的屬性強轉為Map類型,不能new HashMap
Map map = (Map) items;
collection = map.entrySet();
}
//判斷是否是set、list
if(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 {
@Override
publicvoid 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\util
public 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>
<span style="BACKGROUND-COLOR: #ffffff"></span><span style="BACKGROUND-COLOR: #ffffff"></span> </example:HtmlFilter>
</body>
</html>
</span>
3. 自定義標簽不報錯,但是結果不對的原因及處理:
情況一:檢查你的jsp頁面上的taglib指令是否寫了,如果寫了,在檢查一下你的uri路徑是否正確;如果都正確,再看看你的tld描述文件中的tag標簽定義的是否正確,它中的uri類路徑是否正確,起的名字是否一致。
情況二:檢查你的標簽處理類是否正確,主要錯誤有你是不是忘了寫輸出到浏覽器的代碼,有兩種形式:1).this.getJspContext().getOut().write(s);2).this.getJspBody.invoke(null);這兩種輸出分別是不同的輸出,後者是JspFragment www.2cto.com
類對象的輸出,直接輸出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目錄下使用了。