自定義標籤:html
jsp中自定義標籤使用形式
代碼:
1<itcast:showtime/>
itcast 爲標籤的名字,即tld配置文件的名稱
showtime爲tld配置文件中tag標籤中的name值java
2書寫java類:
public class ShowTime extends SimpleTagSupport {程序員
public void doTag() throws JspException, IOException {
Date now=new Date();
PageContext pc=(PageContext)getJspContext(); //繼承SimpleTagSupport的類中有jspContext的對象,這裏強轉成pagecontext的對象
pc.getOut().write(now.toLocaleString());
}
}web
java類須要實現simpleTag接口,咱們一把繼承SimpleTagSupport類
覆蓋doTag方法
java類中封裝須要執行的java代碼便可數組
3書寫配置文件 tld文件
<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">
<tlib-version>1.0</tlib-version>
<short-name>itcast</short-name> //name和uri只是和jsp創建聯繫,並無實際意義
<uri>www.itcast.cn</uri>
<tag>
<name>showtime</name> //標籤的方法名
<tag-class>text.jsp.ShowTime</tag-class> //java類的全名
<body-content>empty</body-content> //開始標籤和結束標籤有沒有內容
</tag>
</taglib>緩存
simpleTag接口中的方法:
void doTag():由服務器調用。在JSP中遇到標籤時調用。
JspTag getParent():由程序員調用。獲取該標籤的父標籤對象。沒有返回nulltomcat
如下三個方法的共同特色:由服務器調用,在調用doTag以前就調完了。
void setJspBody(JspFragment jspBody):由服務器調用。傳入標籤的內容。
void setJspContext(JspContext pc):由服務器調用。傳入當前頁面的pageContext對象
void setParent(JspTag parent):由服務器調用。傳入你的爹。沒爹傳入null服務器
標籤的實際做用:
得到主體內容並輸出:
JspFragment jf=getJspBody();
jf.invoke(null);session
簡易寫法:
getJspBody().invoke(null);app
1 使得主體內容不顯示
<body-content>scriptless</body-content>//主體內容爲非腳本
2控制結束標籤後的內容不執行
throw new SkipPageException();
3控制主體內容重複運行
在類中寫入循環代碼便可
循環輸出主體內容代碼體現:
jsp:<itcast:ShowFor count="5">saq</itcast:ShowFor> //count爲標籤屬性
itcast.tld:
<tag>
<name>ShowFor</name>
<tag-class>text.jsp.ShowFor</tag-class>
<body-content>scriptless</body-content>
//配置屬性
<attribute>
<name>count</name>//屬性名
<required>true</required>//是否必須輸入屬性值
<rtexprvalue>true</rtexprvalue>//是否支持表達式
</attribute>
</tag>
類:
public class ShowFor extends SimpleTagSupport {
private int count;
public void setCount(int count) {
this.count = count;
}
public void doTag() throws JspException, IOException {
for(int i=0;i<count;i++){
getJspBody().invoke(null);//輸出主體內容,當爲null時,就輸出主體內容
}
}
}
4獲取主體內容,並操做主體內容後輸出
public void doTag() throws JspException, IOException {
//獲取主體內容
JspFragment jf=getJspBody();
//將主體內容寫入字符緩存
StringWriter sw=new StringWriter();
jf.invoke(sw);
//調用string的大寫轉換方法
String jfString=sw.getBuffer().toString();
jfString=jfString.toUpperCase();
//輸出
PageContext pc=(PageContext) getJspContext();
pc.getOut().write(jfString);
}
body-content中的內容:
1 jsp 不考慮,傳統標籤處理類中
2 empty 傳統標籤和普通標籤都能用,主體中不能有內容
3 scriptless 簡單標籤使用,要求主體中有內容,但不能有「<」「%」,能夠有EL表達式,但不能有java表達式
4 tagdependent 簡單標籤使用,告訴類,主體標籤中的爲文本
實現if功能的標籤:
類:
public class IfSimpleTag extends SimpleTagSupport{
private Boolean test;
public void setTest(Boolean test) {
this.test = test;
}
public void doTag() throws JspException, IOException {
if(test){
getJspBody().invoke(null);
}
}
}
jsp:
<%session.setAttribute("user", "djw");%>
<itcast:if test="${SessionScope.user==null}">
<a href="#">登陸</a>
</itcast:if>
<itcast:if test="${SessionScope.user!=null }">
<a href="#">註銷</a>
</itcast:if>
實現ifelse功能:
jsp:
<%pageContext.setAttribute("gender", "man");%>
<itcast:choose>
<itcast:when test="${gender=='man'}">
男性
</itcast:when>
<itcast:else>
女性
</itcast:else>
</itcast:choose>
父標籤類:
public class ChooseSimpleTage extends SimpleTagSupport {
private Boolean flag=true;
public Boolean getFlag() {
return flag;
}
public void setFlag(Boolean flag) {
this.flag = flag;
}
public void doTag() throws JspException, IOException {
getJspBody().invoke(null);
}
}
when類:
public class WhenSimpleTage extends SimpleTagSupport{
private boolean test;
public void setTest(boolean test) {
this.test = test;
}
public void doTag() throws JspException, IOException {
if(test){
getJspBody().invoke(null);
ChooseSimpleTage cst=(ChooseSimpleTage) getParent();
cst.setFlag(false);
}
}
}
else類:
public class ElseSimpleTage extends SimpleTagSupport {
public void doTag() throws JspException, IOException {
ChooseSimpleTage cst=(ChooseSimpleTage) getParent();
if(cst.getFlag()){
getJspBody().invoke(null);
}
}
}
for循環標籤(簡易)
jsp:
<body>
<%
List list=new ArrayList();
list.add("aaa");
list.add("bbb");
list.add("ccc");
pageContext.setAttribute("list", list);
%>
<itcast:for items="${list}" var="s">
${s}<br/>
</itcast:for>
</body>
處理類:
private List items;
private String var;
public void setItems(List items) {
this.items = items;
}
public void setVar(String var) {
this.var = var;
}
public void doTag() throws JspException, IOException {
PageContext pc=(PageContext) getJspContext();
if(items!=null){
for(Object obj:items){
pc.setAttribute(var, obj);
getJspBody().invoke(null);
}
}
}
for循環加強版:
jsp:
<%
Map map=new HashMap();
map.put("a", "aaa");
map.put("b", "bbb");
map.put("c", "ccc");
pageContext.setAttribute("map", map);
%>
<itcast:for2 items="${map.}" var="me">
${me.key}=${me.value}<br/>
</itcast:for2>
處理類:
public class ForSimpleTage2 extends SimpleTagSupport {
private Object items;
private String var;
private Collection collection=new ArrayList();
public void setItems(Object items) {
if(items instanceof List){
collection=(Collection) items;
}else if(items instanceof Map){
collection=((Map) items).entrySet();
}else if(items.getClass().isArray()){
//基本類型數組不屬於Object[],屬於基本類型的數組,
這裏的處理方式一併處理了基本類型數組和Object[]類型的數組
int len=Array.getLength(items);
for(int i=0;i<len;i++){
collection.add(Array.get(items, i));
}
}
}
public void setVar(String var) {
this.var = var;
}
public void doTag() throws JspException, IOException {
PageContext pc=(PageContext) getJspContext();
for(Object obj:collection){
pc.setAttribute(var, obj);
getJspBody().invoke(null);
}
}
}
實現html轉義的標籤:
jsp代碼:
<%
pageContext.setAttribute("s", "<hr/>");
%>
<itcast:filter>
${s}
</itcast:filter>
處理類代碼:
public class Filter extends SimpleTagSupport {
public void doTag() throws JspException, IOException {
StringWriter sw=new StringWriter();
getJspBody().invoke(sw);
String str=sw.getBuffer().toString();
String new_str=filter(str);
getJspContext().getOut().write(new_str);
}
private String filter(String message) {
if (message == null)
return (null);
char content[] = new char[message.length()];
message.getChars(0, message.length(), content, 0);
StringBuilder result = new StringBuilder(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());
}
}
其中filter方法在tomcat中有例子代碼,複製便可
導入標籤庫:<%@ taglib uri="http://java.sun.com/jstl/core" prefix="c" %>
jsptlcore核心標籤:
1 out:
<%
pageContext.setAttribute("s", "<hr/>");
%>
<c:out value="${s}" default="輸入錯誤" escapeXml="true"></c:out>
default:輸入的對象沒法找到時輸出的值
escapeXml:自動轉義html符號,默認值爲true
2 set標籤:
<c:set value="上海" var="s" scope="page"></c:set>
3 設置javabean的屬性:
<jsp:useBean id="person" class="jsp.core.Person"></jsp:useBean>
<c:set property="name" target="${person }" value="djw"></c:set>
${person.name}
4設置map的值:
<%
Map map=new HashMap();
map.put("a", "aaa");
pageContext.setAttribute("map", map);
%>
<c:set property="b" value="bbb" target="${map }"></c:set>
${map.a}<br/>
${map.b }
5從指定域中刪除數據
<c:set var="s1" value="pp" scope="page"></c:set>
<c:remove var="s1" scope="page"/>
入股scope不設置,則爲全部域範圍
6 除咯i異常:
<c:catch>
</c:catch>
7 循環遍歷:
<c:forEach items="" begin="" end="" step=""> 須要遍歷的內容</c:forEach>
items:須要遍歷的對象
begin:起始索引
end:結束索引
step: 遍歷間隔 默認爲1
foreach 遍歷集合數組和表格集合:
<%
List<Person> list=new ArrayList<Person>();
list.add(new Person("djw","男","上海"));
list.add(new Person("www","男","北京"));
pageContext.setAttribute("p", list);
%>
<table border="1">
<tr>
<th>姓名</th>
<th>性別</th>
<th>城市</th>
</tr>
<c:forEach items="${p}" var="fp" varStatus="vs">
//varStatus是指向一個對象,該對象記錄着當前元素的一些信息
//int getIndex 元素的索引
//int getCount 元素的位數
//boolean isFirst 是不是第一個元素
//boolean isLast 是否爲最後一個元素
<tr>
<td>
${fp.name}
</td>
<td>
${fp.gender}
</td>
<td>
${fp.city}
</td>
</tr>
</c:forEach>
</table>
8 遍歷字符串標籤:
<%
pageContext.setAttribute("s", "2014-06-11");
%>
<c:forTokens items="${s }" delims="-" var="p">
${p}<br/>
</c:forTokens>
9 包含標籤:
</c:forTokens>
<c:import url="/3.jsp"></c:import> 包含本應用中的地址
<c:import url="http://www.baidu.com"></c:import> 包含外部地址
10轉發:
<c:redirect url="/3.jsp"></c:redirect>
11 url(這裏完成了中文參數的編碼和url的重寫)<c:url value="/3.jsp" var="url"></c:url><c:param name="username" value="djw"></c:param>//上面語句至關調用了(<%pageContext.setAttribute("url", request.getContextPath()+"/3.jsp");%>)這個語句<a href="url"></a>