javascript
09.JSP自定义标签01
為什么要自定義開發標簽?
相信很多人很好奇為啥有現成的標簽庫,還要去自定義開發標簽,舉個例子:我們在jsp使用修改時,傳值給界面單選按鈕是否選中,是這樣的:
????????<c:if test="${ name=='男' }">
????????<input type="radio" checked="checked" value="男">
????????</c:if>
那如果是愛好類型的復選框呢?愛好有幾百種,打個比方,那頁面上就全是標簽代碼了,所以,了解掌握自定義標簽開發出適合自己項目的標簽,可以減少多余的代碼,頁面更加直觀簡潔
標簽的語言特點
我們比較常用的標簽就是jstl標準標簽庫---->c標簽,我們自定義jsp標簽是在此基礎上,開發出符合自己的標簽使用,它有哪些語言特點,下面帶大家看看:
????????<開始標簽 屬性="屬性值">標簽體</結束標簽>
????????空標簽 : <br/><hr/> <開始標簽></結束標簽> <開始標簽/>
標簽的類型大概有三種:
1.ui標簽,例如:<c:out value=""></c:out>
2.控制標簽,例如:<c:if test="">標簽體</c:if>
3.數據標簽,例如自定義的數據顯示標簽:<x:select/>,c標簽的<c:set var="" value=""></c:set>
開發和使用步驟
2. 自定義標簽的開發及使用步驟
? 2.1 創建一個標簽助手類(繼承BodyTagSupport)
? ? ? 標簽屬性必須與助手類的屬性對應、且要提供對應get/set方法
? ? ? rtexprvalue
1.例如自定義一個<x:if test=" ">標簽體</c:if>標簽:
?
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 {
?? ??? ?//如果為真則計算主體輸出,否則跳過主體
?? ??? ?return test ? EVAL_BODY_INCLUDE:SKIP_BODY;
?? ?}
}
2.
? 2.2 創建標簽庫描述文件(tld),添加自定義標簽的配置
? ? ? 注:tld文件必須保存到WEB-INF目錄或其子目錄
? ? ? jstl標簽庫
?<tag>
?? ??? ?<!-- 標簽名 -->
?? ??? ?<name>if</name>
?? ??? ?<!-- 標簽工具類 -->
?? ??? ?<tag-class>com.zking.tag.IfTag</tag-class>
?? ??? ?<!-- 標簽的內容類型:empty表示空標簽,jsp表示可以為任何合法的JSP元素 -->
?? ??? ?<body-content>jsp</body-content>
?? ??? ?<!-- 自定義標簽的屬性定義,請注意一定要在標簽類中提供對應的get/set方法 -->
?? ??? ?<attribute>
?? ??? ??? ?<!-- 自定義標簽的屬性名稱 -->
?? ??? ??? ?<name>test</name>
?? ??? ??? ?<!-- true表示必填 -->
?? ??? ??? ?<required>true</required>
?? ??? ??? ?<!-- true支持動態值,可以向值里面填jsp表達式、EL表達式,false則不支持 -->
?? ??? ??? ?<rtexprvalue>true</rtexprvalue>
?? ??? ?</attribute>?
?? ?</tag>
類放導包:
?
?
?2.3 在JSP通過taglib指令導入標簽庫,并通過指定后綴訪問自定義標簽
從我們常用的·jstl核心標簽庫開始入手:
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
如上,我們在使用c標簽庫時,不僅要導入jar包,還要在頁面引入一行代碼。接下來點擊uri地址,我們可以看到:
<taglib xmlns="http://java.sun.com/JSP/TagLibraryDescriptor">
?? ?<!-- 代表標簽庫的版本號 -->
?? ?<tlib-version>1.0</tlib-version>
?? ?<!-- 代表jsp的版本 -->
?? ?<jsp-version>1.2</jsp-version>
?? ?<!-- 你的標簽庫的簡稱 -->
?? ?<short-name>z</short-name>
?? ?<!-- 你標簽庫的引用uri -->
?? ?<uri>/zking</uri>
在頁面引入:
<%@ taglib uri="/zking" prefix="z" %>
3. 標簽生命周期
??
? 流程A:
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? SKIP_BODY
? 3.1 ?實例化標簽助手類->doStartTag()------------->doEndTag()
? ? ? ?//主要用開發簡單標簽
? 流程B:
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? EVAL_BODY_INCLUDE ? ? ? ? SKIP_BODY
? 3.2 ?實例化標簽助手類->doStartTag()------------->doAfterBody---------------->doEndTag()...
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? EVAL_BODY_AGAIN
? 3.3??
? jrebal 熱加載
? SKIP_BODY:跳過主體
? EVAL_BODY_INCLUDE:計算標簽主體內容并[輸出]
? EVAL_PAGE:計算頁面的后續部分
? SKIP_PAGE:跳過頁面的后續部分
? EVAL_BODY_AGAIN:再計算主體一次
?<%
?? ??? ?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;
?? ?}
?? ?/**
?? ? * 在結束 標簽時執行的動作
?? ? * 返回值有兩種結果
?? ? * 1.計算頁面的后續部分(默認): EVAL_PAGE
?? ? * 2.SKIP_PAGE:跳過頁面的后續部分
?? ? */
?? ?@Override
?? ?public int doEndTag() throws JspException {
?? ??? ?System.out.println(" doEndTag().......");
?? ??? ?return EVAL_PAGE;
?? ?}
?? ?/**
?? ? * 在開始 標簽時執行的動作
?? ? * 返回值有兩種
?? ? * 1.跳過標簽體內容 SKIP_BODY
?? ? * 2.計算標簽體 并輸出內容
?? ? */
?? ?@Override
?? ?public int doStartTag() throws JspException {
?? ??? ?System.out.println("doStartTag");
?? ??? ?System.out.println("我的名字叫"+this.name);
?? ??? ?return EVAL_BODY_INCLUDE;
?? ?}
}
?
如圖:
?首先看x:if:
在開發時,首先仿照c:if分析:
x:If助手類:
<tag>
?? ??? ?<!-- 標簽名 -->
?? ??? ?<name>if</name>
?? ??? ?<!-- 標簽工具類 -->
?? ??? ?<tag-class>com.zking.tag.IfTag</tag-class>
?? ??? ?<!-- 標簽的內容類型:empty表示空標簽,jsp表示可以為任何合法的JSP元素 -->
?? ??? ?<body-content>jsp</body-content>
?? ??? ?<!-- 自定義標簽的屬性定義,請注意一定要在標簽類中提供對應的get/set方法 -->
?? ??? ?<attribute>
?? ??? ??? ?<!-- 自定義標簽的屬性名稱 -->
?? ??? ??? ?<name>test</name>
?? ??? ??? ?<!-- true表示必填 -->
?? ??? ??? ?<required>true</required>
?? ??? ??? ?<!-- true支持動態值,可以向值里面填jsp表達式、EL表達式,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 {
?? ??? ?//如果為真則計算主體輸出,否則跳過主體
?? ??? ?return test ? EVAL_BODY_INCLUDE:SKIP_BODY;
?? ?}
}
?
<x:if test="true">男</x:if>
<x:if test="false">女</x:if>
x:out助手類:
?? ?<tag>
?? ??? ?<!-- 標簽名 -->
?? ??? ?<name>out</name>
?? ??? ?<!-- 標簽工具類 -->
?? ??? ?<tag-class>com.zking.tag.OutTag</tag-class>
?? ??? ?<!-- 標簽的內容類型:empty表示空標簽,jsp表示可以為任何合法的JSP元素 -->
?? ??? ?<body-content>jsp</body-content>
?? ??? ?<!-- 自定義標簽的屬性定義,請注意一定要在標簽類中提供對應的get/set方法 -->
?? ??? ?<attribute>
?? ??? ??? ?<!-- 自定義標簽的屬性名稱 -->
?? ??? ??? ?<name>value</name>
?? ??? ??? ?<!-- true表示必填 -->
?? ??? ??? ?<required>true</required>
?? ??? ??? ?<!-- true支持動態值,可以向值里面填jsp表達式、EL表達式,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;//內容
?? ?
?? ?public Object getValue() {
?? ??? ?return value;
?? ?}
?? ?public void setValue(Object value) {
?? ??? ?this.value = value;
?? ?}
?? ?@Override
?? ?public int doAfterBody() throws JspException {
?? ??? ?//out標簽直接輸出value內容
?? ??? ?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();
?? ?}
?? ?/**
?? ? * 默認為跳過標簽體
?? ? */
?? ?@Override
?? ?public int doStartTag() throws JspException {
?? ??? ?return EVAL_BODY_INCLUDE;
?? ?}
}
總結
以上是生活随笔為你收集整理的09.JSP自定义标签01的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 牛客网——华为题库(91~100)
- 下一篇: Spring Security + OA