JSP自定義標(biāo)簽入門(mén)學(xué)習(xí)
本文為大家分享了JSP自定義標(biāo)簽入門(mén)學(xué)習(xí)教程,希望大家喜歡。
1.JSP自定義標(biāo)簽:
自定義標(biāo)簽是用戶(hù)定義的JSP語(yǔ)言元素。當(dāng)JSP頁(yè)面包含一個(gè)自定義標(biāo)簽時(shí)將被轉(zhuǎn)化為servlet,標(biāo)簽轉(zhuǎn)化為對(duì)被 稱(chēng)為tag handler的對(duì)象的操作,即當(dāng)servlet執(zhí)行時(shí)Web container調(diào)用那些操作。JSP標(biāo)簽擴(kuò)展可以讓你創(chuàng)建新的標(biāo)簽并且可以直接插入到一個(gè)JSP頁(yè)面。 JSP 2.0規(guī)范中引入Simple Tag Handlers來(lái)編寫(xiě)這些自定義標(biāo)記。你可以繼承SimpleTagSupport類(lèi)并重寫(xiě)的doTag()方法來(lái)開(kāi)發(fā)一個(gè)最簡(jiǎn)單的自定義標(biāo)簽。
2.開(kāi)發(fā)自定義標(biāo)簽
下面的步驟建立一個(gè)自定義標(biāo)簽用于戰(zhàn)術(shù)客戶(hù)端的ip地址:
編寫(xiě)一個(gè)普通的java類(lèi),繼承SimpleTagSupport類(lèi),
public class ShowIp extends SimpleTagSupport {
/**
* 以下屏蔽的代碼在SimpleTagSupport代碼中已經(jīng)做了!這里不需要重復(fù)再做!
*/
/*private JspContext context;
*//**
* 傳入pageContext
*//*
@Override
public void setJspContext(JspContext pc) {
this.context = pc;
}*/
@Override
public void doTag() throws JspException, IOException {
PageContext pageContext=(PageContext)this.getJspContext();
ServletRequest request = pageContext.getRequest();
String ip=request.getRemoteHost();
JspWriter out = pageContext.getOut();
out.write("使用自定義標(biāo)簽展示客戶(hù)ip地址"+ip);
List<String> a=null;
}
}
在web項(xiàng)目的WEB-INF目錄下建立mytaglib.tld文件,這個(gè)tld叫標(biāo)簽庫(kù)的聲明文件。(參考核心標(biāo)簽庫(kù)的tld文件)
<?xml version="1.0" encoding="UTF-8" ?> <taglib xmlns="http://java.sun.com/xml/ns/javaee" 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"> <description>A tag library exercising SimpleTag handlers.</description> <!-- 標(biāo)簽庫(kù)的版本 --> <tlib-version>1.0</tlib-version> <!-- 標(biāo)簽庫(kù)前綴 --> <short-name>rlovep</short-name> <!-- tld文件的唯一標(biāo)記 --> <uri>http://rlovep.com</uri> <!-- 定義標(biāo)簽,標(biāo)簽要放在方法前面 --> <tag> <!-- 標(biāo)簽名 --> <name>showIp</name> <!-- 標(biāo)簽處理類(lèi) --> <tag-class>com.rlovep.tags.ShowIp</tag-class> <body-content>empty</body-content> </tag> <tag> </taglib>
在jsp頁(yè)面的頭部導(dǎo)入自定義標(biāo)簽庫(kù):url為你在tld中寫(xiě)的url,前綴也是你在tld文件中定義的
<%@ taglib uri="http://rlovep.com" prefix="rlovep" %>
在jsp中使用自定義標(biāo)簽
<%-- 測(cè)試簡(jiǎn)單的自定義標(biāo)簽,標(biāo)簽體(我是你)不顯示 --%> <rlovep:showIp>我是你 </rlovep:showIp>
3.自定義標(biāo)簽的執(zhí)行過(guò)程
當(dāng)訪(fǎng)問(wèn):http://localhost:8080/stuJsp/Hellotags.jsp 時(shí);要重啟Tomcat使服務(wù)器啟動(dòng)時(shí),加載每個(gè)web應(yīng)用的WEB-INF目錄下的所有文件!??!例如。web.xml, tld文件?。?!
步驟如下:
- 檢查jsp文件的taglib指令,是否存在一個(gè)url為http://rlovep.com的tld文件。如果沒(méi)有,則報(bào)錯(cuò)。
- 執(zhí)行jsp文件的轉(zhuǎn)化:把jsp文件翻譯成java源文件->編譯class->構(gòu)造類(lèi)對(duì)象->調(diào)用_jspService()方法
- 讀到到mytaglib.tld文件中查詢(xún)是否存在為showIp的標(biāo)簽
- 找到對(duì)應(yīng)的標(biāo)簽,則讀到內(nèi)容,得到com.rlovep.tags.ShowIp
- 構(gòu)造ShowIp對(duì)象,然后調(diào)用ShowIp里面的方法:dotag方法;
4.訪(fǎng)問(wèn)標(biāo)簽體
你可以像標(biāo)準(zhǔn)標(biāo)簽庫(kù)一樣在標(biāo)簽中包含消息內(nèi)容。如我們要在我們自定義的中包含內(nèi)容
格式如下:
<rlovep:showIp>我是你 </rlovep:showIp>
但要文字顯示需要修改處理類(lèi)和tld文件:
修改處理類(lèi)在doTag方法中增加如下內(nèi)容:
JspContext jspContext2 = this.getJspContext(); //顯示標(biāo)簽體的兩種方法 //方法1直接調(diào)用 //jspBody.invoke(null); //方法2通過(guò)輸出到out //jspBody.invoke(jspContext2.getOut());
修改tld文件:
<tag> <!-- 標(biāo)簽名 --> <name>showIp</name> <!-- 標(biāo)簽處理類(lèi) --> <tag-class>com.rlovep.tags.ShowIp</tag-class> <!-- 輸出標(biāo)簽體的內(nèi)容格式標(biāo)簽體不可以寫(xiě)jsp的java代碼 --> <body-content>scriptless</body-content> </tag>
現(xiàn)在你可以將標(biāo)簽體的內(nèi)容顯示了;
<%-- 標(biāo)簽提會(huì)顯示 --%> <rlovep:showIp>我是你 </rlovep:showIp>
輸出標(biāo)簽體的內(nèi)容格式:
JSP: 在傳統(tǒng)標(biāo)簽中使用的??梢詫?xiě)和執(zhí)行jsp的java代碼。
scriptless: 標(biāo)簽體不可以寫(xiě)jsp的java代碼
empty: 必須是空標(biāo)簽。
tagdependent : 標(biāo)簽體內(nèi)容可以寫(xiě)jsp的java代碼,但不會(huì)執(zhí)
5.給標(biāo)簽體帶屬性:
你可以在自定義標(biāo)準(zhǔn)中設(shè)置各種屬性,要接收屬性,值自定義標(biāo)簽類(lèi)必須實(shí)現(xiàn)setter方法;
格式如下:
<!-- 測(cè)試帶屬性的標(biāo)簽,標(biāo)簽體顯示通過(guò)類(lèi)處理 --> <rlovep:AttributeTags name="peace" value="12345
定義屬性步驟如下:
編寫(xiě)處理類(lèi):AttributeTags extends SimpleTagSupport
添加倆個(gè)屬性: //聲明屬性的成員變量 private Integer value; private String name; 并為兩個(gè)成員屬性寫(xiě)setter方法; public void setValue(Integer value) public void setName(String name)
在標(biāo)簽庫(kù)文件tld注明此標(biāo)簽和屬性:
<!-- 標(biāo)簽名 --> <name>AttributeTags</name> <!-- 標(biāo)簽處理類(lèi) --> <tag-class>com.rlovep.tags.AttributeTags</tag-class> <!-- 輸出標(biāo)簽體的內(nèi)容格式標(biāo)簽體不可以寫(xiě)jsp的java代碼 --> <body-content>scriptless</body-content> <!-- 配置屬性name --> <attribute> <name>name</name> <!-- 是否必填 --> <required>true</required> <!-- 是否支持EL表達(dá)式 --> <rtexprvalue>true</rtexprvalue> </attribute> <!-- 配置屬性value --> <attribute> <name>value</name> <!-- 是否必填 --> <required>true</required> <!-- 是否支持EL表達(dá)式 --> <rtexprvalue>true</rtexprvalue> </attribute> </tag>
現(xiàn)在就可以用帶屬性的標(biāo)簽了
在tld配置屬性時(shí)你可以配置下面的屬性:

6.帶有子標(biāo)簽的自定義標(biāo)簽:
就像核心標(biāo)簽庫(kù)的choose標(biāo)簽一樣我們也可以定義嵌套的自定義標(biāo)簽,這部分我們主要講解自己創(chuàng)建一個(gè)類(lèi)似核心標(biāo)簽庫(kù)的choose標(biāo)簽。步驟如下:
建立處理類(lèi),處理類(lèi)還是與前面一樣的方法。需要介紹的是用到了一個(gè)getParent()方法,從名字上就可以知道是為了獲得父標(biāo)簽,對(duì)就是獲得父標(biāo)簽類(lèi);
建立三個(gè)處理類(lèi)文件: ChooseTag,OtherWiseTag,whenTag
//ChooseTag類(lèi):
public class ChooseTag extends SimpleTagSupport{
//此去時(shí)變量不是標(biāo)簽屬性,由when標(biāo)簽更改;othewise獲得;
private boolean flag;
public boolean isFlag() {
return flag;
}
public void setFlag(boolean flag) {
this.flag = flag;
}
@Override
public void doTag() throws JspException, IOException {
// Choose標(biāo)簽作用顯示標(biāo)簽體,以及作為其他兩個(gè)標(biāo)簽的父標(biāo)簽;
getJspBody().invoke(null);
}
}
//whenTag類(lèi)
public class whenTag extends SimpleTagSupport{
//增加test屬性
private boolean test;
public boolean isTest() {
return test;
}
public void setTest(boolean test) {
this.test = test;
}
@Override
public void doTag() throws JspException, IOException {
//如果標(biāo)簽屬性為true,顯示標(biāo)簽體
if(test){
getJspBody().invoke(null);
}
//設(shè)置父標(biāo)簽給otherwise用
ChooseTag parent=null;
if(getParent() instanceof ChooseTag){
parent=(ChooseTag)getParent();
parent.setFlag(test);
}
}
}
//OtherWiseTag類(lèi):
public class OtherWiseTag extends SimpleTagSupport {
@Override
public void doTag() throws JspException, IOException {
boolean test=true;
//獲取父標(biāo)簽的test,由他的上一個(gè)when設(shè)置
if(getParent() instanceof ChooseTag)
{
//獲取父標(biāo)簽的test,由他的上一個(gè)when設(shè)置
ChooseTag parent=(ChooseTag)getParent();
test=parent.isFlag();
}
if(!test){
getJspBody().invoke(null);
}
}
}
編寫(xiě)tld文件:與其他的標(biāo)簽定義一模一樣
<!-- 定義標(biāo)簽,choose--> <tag> <!-- 標(biāo)簽名 --> <name>choose</name> <!-- 標(biāo)簽處理類(lèi) --> <tag-class>com.rlovep.tags.ChooseTag</tag-class> <!-- 輸出標(biāo)簽體的內(nèi)容格式標(biāo)簽體不可以寫(xiě)jsp的java代碼 --> <body-content>scriptless</body-content> </tag> <!-- 定義標(biāo)簽,when--> <tag> <!-- 標(biāo)簽名 when --> <name>When</name> <!-- 標(biāo)簽處理類(lèi) --> <tag-class>com.rlovep.tags.whenTag</tag-class> <!-- 輸出標(biāo)簽體的內(nèi)容格式標(biāo)簽體不可以寫(xiě)jsp的java代碼 --> <body-content>scriptless</body-content> <!-- 配置屬性name --> <attribute> <name>test</name> <!-- 是否必填 --> <required>true</required> <!-- 是否支持EL表達(dá)式 --> <rtexprvalue>true</rtexprvalue> </attribute> </tag> <!-- 定義標(biāo)簽,Otherwise--> <tag> <!-- 標(biāo)簽名 --> <name>otherwise</name> <!-- 標(biāo)簽處理類(lèi) --> <tag-class>com.rlovep.tags.OtherWiseTag</tag-class> <!-- 輸出標(biāo)簽體的內(nèi)容格式標(biāo)簽體不可以寫(xiě)jsp的java代碼 --> <body-content>scriptless</body-content> </tag>
使用帶子標(biāo)簽的標(biāo)簽:與使用其他標(biāo)簽稍微有些不同,需要嵌套
<!-- 測(cè)試choose -->
<rlovep:choose>
<rlovep:When test="${10<5 }">
條件成立執(zhí)行when
</rlovep:When>
<rlovep:otherwise>
條件不成立執(zhí)行otherwise
</rlovep:otherwise>
</rlovep:choose>
自定義標(biāo)簽就介紹到這里;
404頁(yè)面,505頁(yè)面,錯(cuò)誤頁(yè)面配置方法:
可以在web.xml中給你的網(wǎng)站配置全局的404頁(yè)面,505頁(yè)面,錯(cuò)誤頁(yè)面;配置方法如下:記得建立相應(yīng)的跳轉(zhuǎn)文件。
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0"> <!-- 配置空指針異常 --> <error-page> <exception-type>java.lang.NullPointerException</exception-type> <location>/error.jsp</location> </error-page> <!-- 配置505錯(cuò)誤頁(yè)面 --> <error-page> <error-code>500</error-code> <location>/common/500.jsp</location> </error-page> <!-- 配置404錯(cuò)誤頁(yè)面 --> <error-page> <error-code>404</error-code> <location>/common/404.html</location> </error-page> </web-app>
JSP入門(mén)就介紹到這里,希望對(duì)大家的學(xué)習(xí)有所幫助。
- JSP經(jīng)典學(xué)習(xí)筆記(包含各種入門(mén)常用語(yǔ)法)
- 通用JSP頁(yè)面 jsp入門(mén)級(jí)文章
- jsp Hibernate入門(mén)教程
- JSP迅速入門(mén)
- 幾則JSP入門(mén)知識(shí)總結(jié)
- JSP開(kāi)發(fā)入門(mén)(一)--安裝好你的機(jī)器來(lái)使用JSP
- JSP開(kāi)發(fā)入門(mén)(五)--JSP其他相關(guān)資源
- JSP開(kāi)發(fā)入門(mén)(四)--JSP的內(nèi)部對(duì)象
- JSP開(kāi)發(fā)入門(mén)(三)--JSP與JavaBean
- JSP開(kāi)發(fā)入門(mén)(二)----JSP語(yǔ)法的基本原理
- JSP開(kāi)發(fā)入門(mén)
- JSP入門(mén)之HelloWorld程序?qū)嵗?/a>
相關(guān)文章
jsp 連接sql server 2008 連接不上的解決方法
需要用到j(luò)sp 通過(guò)jdbc來(lái)訪(fǎng)問(wèn)sql serve2008 , 結(jié)果在遇到好多問(wèn)題,感覺(jué)被坑了個(gè)大。。2013-05-05
servlet+jsp實(shí)現(xiàn)過(guò)濾器 防止用戶(hù)未登錄訪(fǎng)問(wèn)
這篇文章主要為大家詳細(xì)介紹了servlet+jsp實(shí)現(xiàn)過(guò)濾器,防止用戶(hù)未登錄訪(fǎng)問(wèn),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-04-04
jsp中使用frameset框架 邊框固定不讓更改邊框的大小
有時(shí)候可能要對(duì)自己布局好的頁(yè)面不讓用戶(hù)更改邊框的大小,這樣我們可以在frame里面添加noresize="noresize"屬性就可以實(shí)現(xiàn)其中的功能2014-07-07
詳解JSP中的語(yǔ)句對(duì)象Statement操作MySQL的使用實(shí)例
這篇文章主要介紹了JSP中的語(yǔ)句對(duì)象Statement操作MySQL的使用實(shí)例,講解了添加記錄、更新記錄、刪除記錄三種操作,說(shuō)明都在代碼注釋中簡(jiǎn)單明了,需要的朋友可以參考下2016-04-04
JBuilder2005開(kāi)發(fā)Web應(yīng)用程序
JBuilder2005開(kāi)發(fā)Web應(yīng)用程序...2006-10-10

