java自定义标签遍历_自定义标签 - CarlDing的个人页面 - OSCHINA - 中文开源技术交流社区...
EL的不足,由JSTL來加強 ?-> 自定義標簽來實現。
1:自定義標簽
1:自定義標簽也是類。
2:讓用戶在JSP頁面使用,不引用Java代碼的情況下,調用Java代碼。
2:標簽開的類的繼承關系
3:快速的標簽示例
1:創建一個類實現接口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;
/**
* 當在頁面上使用了這個標簽,當jsp在運行時,會先調用此方法
* 將pageContext傳遞到DataTag類中類
*/
@Override
publicvoidsetPageContext(PageContextpc) {
this.pageContext=pc;
}
/**
* 當這個標簽開始時,即容器來調用以下的方法標簽的body部分
*/
@Override
publicintdoStartTag()throwsJspException {
// 輸出當前時間,到頁面上去
SimpleDateFormatsdf=newSimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Stringstr=sdf.format(newDate());
// 輸出如果要輸出,獲取JspWriter就可以了
JspWriterout=pageContext.getOut();
try{
out.print("當前時間是:"+str);
}catch(Exceptione) {
e.printStackTrace();
}
/*
* 返回值是有固定值的 這個的返回值,決定了這個標簽后面的body部分如何執行
Tag.EVAL_BODY_INCLUDE
* 執行body部分 SKIP_BODY:不執行body部分不顯示
*/
returnSKIP_BODY;
}
/**
* 當執行標簽結束的時時執行以下的代碼
* 返回的值是: SKIP_PAGE : 頁面的后面的部分,不執行不顯
* EVAL_PAGE : 執行頁面的 后面的部分
*/
@Override
publicintdoEndTag()throwsJspException {
returnEVAL_PAGE;
}
2:添加標簽的配置文件
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">
以下是開發完成的完整的配置:
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頁面上引用
使用:
4:繼承TagSupport
publicclassDate2TagextendsTagSupport {
@Override
publicintdoStartTag()throwsJspException {
Stringstr=newSimpleDateFormat("yyyy-MM-dd HH:mm:ss:SSS").format(newDate());
JspWriterout=pageContext.getOut();
try{
out.print("當前的時間為:"+str);
}catch(Exceptione) {
}
returnSKIP_BODY;
}
}
配置:
myDate2
cn.tag.Date2Tag
empty
以下是使用:
5:標簽的功能
功能:
讓程序員在頁面上像是使用HTML標簽一樣,使用Java代碼。
防止重復提交:
以下的情況下,可能會發生重復提交:
1:刷新頁面。
2:服務或是網絡比較慢。
如何防止重復提交:
使用Session
在JSP頁面上,生成一個UUID放放到Session中去。
同時在JSP頁面上,和驗證碼一樣,自動的提交這個UUID.
后臺代碼,從提交信息中,和Session中獲取這個UUID的值比較。
自定義標簽:
publicclassTokenTagextendsTagSupport {
@Override
publicintdoStartTag()throwsJspException {
Stringuuid= UUID.randomUUID().toString().replace("-","");
pageContext.getSession().setAttribute("token",uuid);
// 向頁面上輸出
JspWriterout=pageContext.getOut();
try{
Stringhtml="";
out.print(html);
}catch(Exceptione) {
e.printStackTrace();
}
returnSKIP_BODY;
}
}
配置:
token
cn.tag.TokenTag
empty
6:標簽的細節
JSP
JSP 可以包含任意的JSP代碼
在doStartTag中返回的是skip_body,則有內容也不顯示。
Eval_body_include則顯示,執行body部分內容
Empty : 則不能包含任意的內容
doEndTag的返回值
Skip_page : 頁面的后面的部分不顯示
Eval_page : 則頁面的后面的部分顯示。
7:接收屬性的標簽、
?c前綴 ,out標簽功能 ??value =“...”屬性。
讓標簽接收屬性:
思想:
1:在標簽類里面聲明setXxx方法用于接收屬性的值。
2:在*.tld的配置文件中,聲明這個標簽類有xxx屬性。
3:在JSP頁面上,使用標簽時,設置屬性的值。
修改時間:
- = > ?你好張三,當前時間是:...
name
true
true
java.lang.String
8:遍歷的標簽
${name} - > EL - > 表示:pageContext.findAttribute(“name”);從四個域對象中找
多一個方法 :
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 {
// 聲明一個可以遍歷的對象
privateIteratorit;
publicvoidsetItems(Objectobj) {
if(objinstanceofCollection) {// List/Set
it=((Collection)obj).iterator();
}elseif(objinstanceofMap) {
it=((Map)obj).entrySet().iterator();
}elseif(obj.getClass().isArray()) {
// 獲取數組的長度
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()) {
// 獲取這什個值
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()) {
// 獲取這什個值
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實現
publicclassHelloTagextendsSimpleTagSupport {
@Override
publicvoiddoTag()throwsJspException, IOException {
Stringstr=newDate().toLocaleString();
JspWriterout= getJspContext().getOut();
out.print("你好當前時間是:"+str);
}
}
hello
cn.tag.HelloTag
empty
接收屬性,就是聲明
setXxx,修改tld文件,在頁面上傳遞
privateStringname;
publicvoidsetName(Stringname) {
this.name=name;
}
hello
cn.tag.HelloTag
empty
name
yes
true
java.lang.String
總結
以上是生活随笔為你收集整理的java自定义标签遍历_自定义标签 - CarlDing的个人页面 - OSCHINA - 中文开源技术交流社区...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: fp算法例题_机器学习(九)—FP-gr
- 下一篇: 微软codepush搭建服务器,通过 C