javascript
09.JSP自定义标签01
為什么要自定義開發(fā)標(biāo)簽?
相信很多人很好奇為啥有現(xiàn)成的標(biāo)簽庫,還要去自定義開發(fā)標(biāo)簽,舉個(gè)例子:我們?cè)趈sp使用修改時(shí),傳值給界面單選按鈕是否選中,是這樣的:
????????<c:if test="${ name=='男' }">
????????<input type="radio" checked="checked" value="男">
????????</c:if>
那如果是愛好類型的復(fù)選框呢?愛好有幾百種,打個(gè)比方,那頁面上就全是標(biāo)簽代碼了,所以,了解掌握自定義標(biāo)簽開發(fā)出適合自己項(xiàng)目的標(biāo)簽,可以減少多余的代碼,頁面更加直觀簡潔
標(biāo)簽的語言特點(diǎn)
我們比較常用的標(biāo)簽就是jstl標(biāo)準(zhǔn)標(biāo)簽庫---->c標(biāo)簽,我們自定義jsp標(biāo)簽是在此基礎(chǔ)上,開發(fā)出符合自己的標(biāo)簽使用,它有哪些語言特點(diǎn),下面帶大家看看:
????????<開始標(biāo)簽 屬性="屬性值">標(biāo)簽體</結(jié)束標(biāo)簽>
????????空標(biāo)簽 : <br/><hr/> <開始標(biāo)簽></結(jié)束標(biāo)簽> <開始標(biāo)簽/>
標(biāo)簽的類型大概有三種:
1.ui標(biāo)簽,例如:<c:out value=""></c:out>
2.控制標(biāo)簽,例如:<c:if test="">標(biāo)簽體</c:if>
3.數(shù)據(jù)標(biāo)簽,例如自定義的數(shù)據(jù)顯示標(biāo)簽:<x:select/>,c標(biāo)簽的<c:set var="" value=""></c:set>
開發(fā)和使用步驟
2. 自定義標(biāo)簽的開發(fā)及使用步驟
? 2.1 創(chuàng)建一個(gè)標(biāo)簽助手類(繼承BodyTagSupport)
? ? ? 標(biāo)簽屬性必須與助手類的屬性對(duì)應(yīng)、且要提供對(duì)應(yīng)get/set方法
? ? ? rtexprvalue
1.例如自定義一個(gè)<x:if test=" ">標(biāo)簽體</c:if>標(biāo)簽:
?
package com.zking.tag;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.BodyTagSupport;
public class IfTag extends BodyTagSupport{
?? ?
?? ?private boolean test;//屬性
?? ?
?? ?public boolean isTest() {
?? ??? ?return test;
?? ?}
?? ?public void setTest(boolean test) {
?? ??? ?this.test = test;
?? ?}
@Override
?? ?public int doStartTag() throws JspException {
?? ??? ?//如果為真則計(jì)算主體輸出,否則跳過主體
?? ??? ?return test ? EVAL_BODY_INCLUDE:SKIP_BODY;
?? ?}
}
2.
? 2.2 創(chuàng)建標(biāo)簽庫描述文件(tld),添加自定義標(biāo)簽的配置
? ? ? 注:tld文件必須保存到WEB-INF目錄或其子目錄
? ? ? jstl標(biāo)簽庫
?<tag>
?? ??? ?<!-- 標(biāo)簽名 -->
?? ??? ?<name>if</name>
?? ??? ?<!-- 標(biāo)簽工具類 -->
?? ??? ?<tag-class>com.zking.tag.IfTag</tag-class>
?? ??? ?<!-- 標(biāo)簽的內(nèi)容類型:empty表示空標(biāo)簽,jsp表示可以為任何合法的JSP元素 -->
?? ??? ?<body-content>jsp</body-content>
?? ??? ?<!-- 自定義標(biāo)簽的屬性定義,請(qǐng)注意一定要在標(biāo)簽類中提供對(duì)應(yīng)的get/set方法 -->
?? ??? ?<attribute>
?? ??? ??? ?<!-- 自定義標(biāo)簽的屬性名稱 -->
?? ??? ??? ?<name>test</name>
?? ??? ??? ?<!-- true表示必填 -->
?? ??? ??? ?<required>true</required>
?? ??? ??? ?<!-- true支持動(dòng)態(tài)值,可以向值里面填jsp表達(dá)式、EL表達(dá)式,false則不支持 -->
?? ??? ??? ?<rtexprvalue>true</rtexprvalue>
?? ??? ?</attribute>?
?? ?</tag>
類放導(dǎo)包:
?
?
?2.3 在JSP通過taglib指令導(dǎo)入標(biāo)簽庫,并通過指定后綴訪問自定義標(biāo)簽
從我們常用的·jstl核心標(biāo)簽庫開始入手:
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
如上,我們?cè)谑褂胏標(biāo)簽庫時(shí),不僅要導(dǎo)入jar包,還要在頁面引入一行代碼。接下來點(diǎn)擊uri地址,我們可以看到:
<taglib xmlns="http://java.sun.com/JSP/TagLibraryDescriptor">
?? ?<!-- 代表標(biāo)簽庫的版本號(hào) -->
?? ?<tlib-version>1.0</tlib-version>
?? ?<!-- 代表jsp的版本 -->
?? ?<jsp-version>1.2</jsp-version>
?? ?<!-- 你的標(biāo)簽庫的簡稱 -->
?? ?<short-name>z</short-name>
?? ?<!-- 你標(biāo)簽庫的引用uri -->
?? ?<uri>/zking</uri>
在頁面引入:
<%@ taglib uri="/zking" prefix="z" %>
3. 標(biāo)簽生命周期
??
? 流程A:
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? SKIP_BODY
? 3.1 ?實(shí)例化標(biāo)簽助手類->doStartTag()------------->doEndTag()
? ? ? ?//主要用開發(fā)簡單標(biāo)簽
? 流程B:
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? EVAL_BODY_INCLUDE ? ? ? ? SKIP_BODY
? 3.2 ?實(shí)例化標(biāo)簽助手類->doStartTag()------------->doAfterBody---------------->doEndTag()...
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? EVAL_BODY_AGAIN
? 3.3??
? jrebal 熱加載
? SKIP_BODY:跳過主體
? EVAL_BODY_INCLUDE:計(jì)算標(biāo)簽主體內(nèi)容并[輸出]
? EVAL_PAGE:計(jì)算頁面的后續(xù)部分
? SKIP_PAGE:跳過頁面的后續(xù)部分
? EVAL_BODY_AGAIN:再計(jì)算主體一次
?<%
?? ??? ?String[] students = {"彭玉","唐尼","黃蓉"};
?? ??? ?
?? ??? ?request.setAttribute("students",students);
?? ??? ??? ??? ?
?? ?%>
?? ?
?? ?<c:forEach items="${students}" var="s" varStatus="vs">
?? ??? ?<z:out value="${s}">
?? ??? ?${s},${vs.count}
?? ??? ?
?? ??? ?</z:out>
?? ?</c:forEach>
?
package com.zking.tag;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.BodyTagSupport;
public class TestTag extends BodyTagSupport{
?? ?private String name;
?? ?
?? ?
?? ?
?? ?public String getName() {
?? ??? ?return name;
?? ?}
?? ?public void setName(String name) {
?? ??? ?this.name = name;
?? ?}
?? ?/**
?? ? * 在結(jié)束 標(biāo)簽時(shí)執(zhí)行的動(dòng)作
?? ? * 返回值有兩種結(jié)果
?? ? * 1.計(jì)算頁面的后續(xù)部分(默認(rèn)): EVAL_PAGE
?? ? * 2.SKIP_PAGE:跳過頁面的后續(xù)部分
?? ? */
?? ?@Override
?? ?public int doEndTag() throws JspException {
?? ??? ?System.out.println(" doEndTag().......");
?? ??? ?return EVAL_PAGE;
?? ?}
?? ?/**
?? ? * 在開始 標(biāo)簽時(shí)執(zhí)行的動(dòng)作
?? ? * 返回值有兩種
?? ? * 1.跳過標(biāo)簽體內(nèi)容 SKIP_BODY
?? ? * 2.計(jì)算標(biāo)簽體 并輸出內(nèi)容
?? ? */
?? ?@Override
?? ?public int doStartTag() throws JspException {
?? ??? ?System.out.println("doStartTag");
?? ??? ?System.out.println("我的名字叫"+this.name);
?? ??? ?return EVAL_BODY_INCLUDE;
?? ?}
}
?
如圖:
?首先看x:if:
在開發(fā)時(shí),首先仿照c:if分析:
x:If助手類:
<tag>
?? ??? ?<!-- 標(biāo)簽名 -->
?? ??? ?<name>if</name>
?? ??? ?<!-- 標(biāo)簽工具類 -->
?? ??? ?<tag-class>com.zking.tag.IfTag</tag-class>
?? ??? ?<!-- 標(biāo)簽的內(nèi)容類型:empty表示空標(biāo)簽,jsp表示可以為任何合法的JSP元素 -->
?? ??? ?<body-content>jsp</body-content>
?? ??? ?<!-- 自定義標(biāo)簽的屬性定義,請(qǐng)注意一定要在標(biāo)簽類中提供對(duì)應(yīng)的get/set方法 -->
?? ??? ?<attribute>
?? ??? ??? ?<!-- 自定義標(biāo)簽的屬性名稱 -->
?? ??? ??? ?<name>test</name>
?? ??? ??? ?<!-- true表示必填 -->
?? ??? ??? ?<required>true</required>
?? ??? ??? ?<!-- true支持動(dòng)態(tài)值,可以向值里面填jsp表達(dá)式、EL表達(dá)式,false則不支持 -->
?? ??? ??? ?<rtexprvalue>true</rtexprvalue>
?? ??? ?</attribute>?
?? ?</tag>
?iftld配置
package com.zking.tag;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.BodyTagSupport;
public class IfTag extends BodyTagSupport{
?? ?
?? ?private boolean test;//屬性
?? ?
?? ?public boolean isTest() {
?? ??? ?return test;
?? ?}
?? ?public void setTest(boolean test) {
?? ??? ?this.test = test;
?? ?}
?? ?
?? ?@Override
?? ?public int doStartTag() throws JspException {
?? ??? ?//如果為真則計(jì)算主體輸出,否則跳過主體
?? ??? ?return test ? EVAL_BODY_INCLUDE:SKIP_BODY;
?? ?}
}
?
<x:if test="true">男</x:if>
<x:if test="false">女</x:if>
x:out助手類:
?? ?<tag>
?? ??? ?<!-- 標(biāo)簽名 -->
?? ??? ?<name>out</name>
?? ??? ?<!-- 標(biāo)簽工具類 -->
?? ??? ?<tag-class>com.zking.tag.OutTag</tag-class>
?? ??? ?<!-- 標(biāo)簽的內(nèi)容類型:empty表示空標(biāo)簽,jsp表示可以為任何合法的JSP元素 -->
?? ??? ?<body-content>jsp</body-content>
?? ??? ?<!-- 自定義標(biāo)簽的屬性定義,請(qǐng)注意一定要在標(biāo)簽類中提供對(duì)應(yīng)的get/set方法 -->
?? ??? ?<attribute>
?? ??? ??? ?<!-- 自定義標(biāo)簽的屬性名稱 -->
?? ??? ??? ?<name>value</name>
?? ??? ??? ?<!-- true表示必填 -->
?? ??? ??? ?<required>true</required>
?? ??? ??? ?<!-- true支持動(dòng)態(tài)值,可以向值里面填jsp表達(dá)式、EL表達(dá)式,false則不支持 -->
?? ??? ??? ?<rtexprvalue>true</rtexprvalue>
?? ??? ?</attribute>?
?? ?</tag>
?? ?
tld配置
package com.zking.tag;
import java.io.IOException;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.tagext.BodyTagSupport;
public class OutTag extends BodyTagSupport{
?? ?
?? ?private Object value;//內(nèi)容
?? ?
?? ?public Object getValue() {
?? ??? ?return value;
?? ?}
?? ?public void setValue(Object value) {
?? ??? ?this.value = value;
?? ?}
?? ?@Override
?? ?public int doAfterBody() throws JspException {
?? ??? ?//out標(biāo)簽直接輸出value內(nèi)容
?? ??? ?JspWriter out = pageContext.getOut();
?? ??? ?try {
?? ??? ??? ?out.print(value);
?? ??? ?} catch (IOException e) {
?? ??? ??? ?// TODO Auto-generated catch block
?? ??? ??? ?e.printStackTrace();
?? ??? ?}?? ??? ??? ?
?? ??? ?return SKIP_BODY;
?? ?}
?? ??? ?
?? ?@Override
?? ?public int doEndTag() throws JspException {?? ??? ?
?? ??? ?return super.doEndTag();
?? ?}
?? ?/**
?? ? * 默認(rèn)為跳過標(biāo)簽體
?? ? */
?? ?@Override
?? ?public int doStartTag() throws JspException {
?? ??? ?return EVAL_BODY_INCLUDE;
?? ?}
}
總結(jié)
以上是生活随笔為你收集整理的09.JSP自定义标签01的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 牛客网——华为题库(91~100)
- 下一篇: 我奋斗了18年才和你坐在一起喝咖啡与我奋