java自定义标签遍历_自定义标签 - CarlDing的个人页面 - OSCHINA - 中文开源技术交流社区...
EL的不足,由JSTL來(lái)加強(qiáng) ?-> 自定義標(biāo)簽來(lái)實(shí)現(xiàn)。
1:自定義標(biāo)簽
1:自定義標(biāo)簽也是類。
2:讓用戶在JSP頁(yè)面使用,不引用Java代碼的情況下,調(diào)用Java代碼。
2:標(biāo)簽開(kāi)的類的繼承關(guān)系
3:快速的標(biāo)簽示例
1:創(chuàng)建一個(gè)類實(shí)現(xiàn)接口Tag
packagecn.tag;
importjava.text.SimpleDateFormat;
importjava.util.Date;
importjavax.servlet.jsp.JspException;
importjavax.servlet.jsp.JspWriter;
importjavax.servlet.jsp.PageContext;
importjavax.servlet.jsp.tagext.Tag;
publicclassDateTagimplementsTag {
/**
* 為了在其他的方法中使用pageContext
*
*/
privatePageContextpageContext;
/**
* 當(dāng)在頁(yè)面上使用了這個(gè)標(biāo)簽,當(dāng)jsp在運(yùn)行時(shí),會(huì)先調(diào)用此方法
* 將pageContext傳遞到DataTag類中類
*/
@Override
publicvoidsetPageContext(PageContextpc) {
this.pageContext=pc;
}
/**
* 當(dāng)這個(gè)標(biāo)簽開(kāi)始時(shí),即容器來(lái)調(diào)用以下的方法標(biāo)簽的body部分
*/
@Override
publicintdoStartTag()throwsJspException {
// 輸出當(dāng)前時(shí)間,到頁(yè)面上去
SimpleDateFormatsdf=newSimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Stringstr=sdf.format(newDate());
// 輸出如果要輸出,獲取JspWriter就可以了
JspWriterout=pageContext.getOut();
try{
out.print("當(dāng)前時(shí)間是:"+str);
}catch(Exceptione) {
e.printStackTrace();
}
/*
* 返回值是有固定值的 這個(gè)的返回值,決定了這個(gè)標(biāo)簽后面的body部分如何執(zhí)行
Tag.EVAL_BODY_INCLUDE
* 執(zhí)行body部分 SKIP_BODY:不執(zhí)行body部分不顯示
*/
returnSKIP_BODY;
}
/**
* 當(dāng)執(zhí)行標(biāo)簽結(jié)束的時(shí)時(shí)執(zhí)行以下的代碼
* 返回的值是: SKIP_PAGE : 頁(yè)面的后面的部分,不執(zhí)行不顯
* EVAL_PAGE : 執(zhí)行頁(yè)面的 后面的部分
*/
@Override
publicintdoEndTag()throwsJspException {
returnEVAL_PAGE;
}
2:添加標(biāo)簽的配置文件
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-jsptaglibrary_2_1.xsd"
version="2.1">
以下是開(kāi)發(fā)完成的完整的配置:
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-jsptaglibrary_2_1.xsd"
version="2.1">
1.0
ql
/ql.com
date
cn.tag.DateTag
empty
3:在JSP頁(yè)面上引用
使用:
4:繼承TagSupport
publicclassDate2TagextendsTagSupport {
@Override
publicintdoStartTag()throwsJspException {
Stringstr=newSimpleDateFormat("yyyy-MM-dd HH:mm:ss:SSS").format(newDate());
JspWriterout=pageContext.getOut();
try{
out.print("當(dāng)前的時(shí)間為:"+str);
}catch(Exceptione) {
}
returnSKIP_BODY;
}
}
配置:
myDate2
cn.tag.Date2Tag
empty
以下是使用:
5:標(biāo)簽的功能
功能:
讓程序員在頁(yè)面上像是使用HTML標(biāo)簽一樣,使用Java代碼。
防止重復(fù)提交:
以下的情況下,可能會(huì)發(fā)生重復(fù)提交:
1:刷新頁(yè)面。
2:服務(wù)或是網(wǎng)絡(luò)比較慢。
如何防止重復(fù)提交:
使用Session
在JSP頁(yè)面上,生成一個(gè)UUID放放到Session中去。
同時(shí)在JSP頁(yè)面上,和驗(yàn)證碼一樣,自動(dòng)的提交這個(gè)UUID.
后臺(tái)代碼,從提交信息中,和Session中獲取這個(gè)UUID的值比較。
自定義標(biāo)簽:
publicclassTokenTagextendsTagSupport {
@Override
publicintdoStartTag()throwsJspException {
Stringuuid= UUID.randomUUID().toString().replace("-","");
pageContext.getSession().setAttribute("token",uuid);
// 向頁(yè)面上輸出
JspWriterout=pageContext.getOut();
try{
Stringhtml="";
out.print(html);
}catch(Exceptione) {
e.printStackTrace();
}
returnSKIP_BODY;
}
}
配置:
token
cn.tag.TokenTag
empty
6:標(biāo)簽的細(xì)節(jié)
JSP
JSP 可以包含任意的JSP代碼
在doStartTag中返回的是skip_body,則有內(nèi)容也不顯示。
Eval_body_include則顯示,執(zhí)行body部分內(nèi)容
Empty : 則不能包含任意的內(nèi)容
doEndTag的返回值
Skip_page : 頁(yè)面的后面的部分不顯示
Eval_page : 則頁(yè)面的后面的部分顯示。
7:接收屬性的標(biāo)簽、
?c前綴 ,out標(biāo)簽功能 ??value =“...”屬性。
讓標(biāo)簽接收屬性:
思想:
1:在標(biāo)簽類里面聲明setXxx方法用于接收屬性的值。
2:在*.tld的配置文件中,聲明這個(gè)標(biāo)簽類有xxx屬性。
3:在JSP頁(yè)面上,使用標(biāo)簽時(shí),設(shè)置屬性的值。
修改時(shí)間:
- = > ?你好張三,當(dāng)前時(shí)間是:...
name
true
true
java.lang.String
8:遍歷的標(biāo)簽
${name} - > EL - > 表示:pageContext.findAttribute(“name”);從四個(gè)域?qū)ο笾姓?/p>
多一個(gè)方法 :
packagecn.tag;
importjava.lang.reflect.Array;
importjava.util.ArrayList;
importjava.util.Collection;
importjava.util.Iterator;
importjava.util.List;
importjava.util.Map;
importjavax.servlet.jsp.JspException;
importjavax.servlet.jsp.tagext.TagSupport;
publicclassForTagextendsTagSupport {
// 聲明一個(gè)可以遍歷的對(duì)象
privateIteratorit;
publicvoidsetItems(Objectobj) {
if(objinstanceofCollection) {// List/Set
it=((Collection)obj).iterator();
}elseif(objinstanceofMap) {
it=((Map)obj).entrySet().iterator();
}elseif(obj.getClass().isArray()) {
// 獲取數(shù)組的長(zhǎng)度
intlen= Array.getLength(obj);
Listlist=newArrayList();
for(inti= 0;i
Objectval= Array.get(obj,i);
list.add(val);
}
it=list.iterator();
}else{
thrownewRuntimeException("不接收的類型"+obj.getClass());
}
}
privateStringvar;
publicvoidsetVar(Stringvar) {
this.var=var;
}
@Override
publicintdoStartTag()throwsJspException {
if(it.hasNext()) {
// 獲取這什個(gè)值
pageContext.setAttribute(var,it.next());
returnEVAL_BODY_INCLUDE;
}else{
returnSKIP_BODY;
}
}
@Override
publicintdoEndTag()throwsJspException {
pageContext.removeAttribute(var);
returnEVAL_PAGE;
}
@Override
publicintdoAfterBody()throwsJspException {
if(it.hasNext()) {
// 獲取這什個(gè)值
pageContext.setAttribute(var,it.next());
returnEVAL_BODY_AGAIN;
}else{
returnSKIP_BODY;
}
}
}
for
cn.tag.ForTag
JSP
items
true
true
java.lang.Object
var
true
false
java.lang.String
a
9:使用simpletagsupport實(shí)現(xiàn)
publicclassHelloTagextendsSimpleTagSupport {
@Override
publicvoiddoTag()throwsJspException, IOException {
Stringstr=newDate().toLocaleString();
JspWriterout= getJspContext().getOut();
out.print("你好當(dāng)前時(shí)間是:"+str);
}
}
hello
cn.tag.HelloTag
empty
接收屬性,就是聲明
setXxx,修改tld文件,在頁(yè)面上傳遞
privateStringname;
publicvoidsetName(Stringname) {
this.name=name;
}
hello
cn.tag.HelloTag
empty
name
yes
true
java.lang.String
總結(jié)
以上是生活随笔為你收集整理的java自定义标签遍历_自定义标签 - CarlDing的个人页面 - OSCHINA - 中文开源技术交流社区...的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: fp算法例题_机器学习(九)—FP-gr
- 下一篇: 微软codepush搭建服务器,通过 C