<%UserInfouser=newUserInfo();user.setUserName("Xuwei");user.setAge(33);user.setEmail("test@test.test");pageContext.setAttribute("userinfo",user);%>

亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

jsp自定義標簽學習

系統(tǒng) 1577 0

?

?

假設我們有一個UserInfo的javabean,那么在JSP頁面使用此標簽只需調(diào)用此標簽即可

      <!-- 創(chuàng)建需要展現(xiàn)UserInfo的實例(用于測試數(shù)據(jù)) -->
<%
UserInfo user = new UserInfo();
user.setUserName("Xuwei");
user.setAge(33);
user.setEmail("test@test.test");
pageContext.setAttribute("userinfo", user);  
%>
<!-- 給標簽設置user屬性綁定要展現(xiàn)的UserInfo對象  -->
<cc:showUserInfo user="${pageScope.userinfo }" />
    

?

開發(fā)步驟:

簡單標簽的開發(fā)我們只要實現(xiàn)Tag接口即可,為了簡單起見可以直接繼承實現(xiàn)了此接口的TagSupport類

jsp自定義標簽學習

1 創(chuàng)建自定義標簽類

      public class UserInfoTag extends TagSupport {
	private UserInfo user;

    @Override
    public int doStartTag() throws JspException {
        try {
            JspWriter out = this.pageContext.getOut();
            if(user == null) {
                out.println("No UserInfo Found...");
                return SKIP_BODY;
            }
            out.println("<table width='500px' border='1' align='center'>");
            out.println("<tr>");
            out.println("<td width='20%'>Username:</td>");
            out.println("<td>" + user.getUserName() + "</td>");
            out.println("</tr>");
            out.println("<tr>");
            out.println("<td>Age:</td>");
            out.println("<td>" + user.getAge() + "</td>");
            out.println("</tr>");
            out.println("<tr>");
            out.println("<td>Email:</td>");
            out.println("<td>" + user.getEmail() + "</td>");
            out.println("</tr>");
            out.println("</table>");
        } catch(Exception e) {
            throw new JspException(e.getMessage());
        }
        return SKIP_BODY;
    }

    @Override
    public int doEndTag() throws JspException {
        return EVAL_PAGE;
    }

	@Override
    public void release() {
        super.release();
        this.user = null;
    }
   
    //getter and setters
    public UserInfo getUser() {
        return user;
    }
    public void setUser(UserInfo user) {
        this.user = user;
    }
}
    

?

備注:要有對應屬性的get和set方法,而不是定義的類型

?

2 在Web-Inf創(chuàng)建標簽庫描述文件.tld(Tag Library Description)

      <?xml version="1.0" encoding="UTF-8"?>
<taglib version="2.0" xmlns="http://java.sun.com/xml/ns/j2ee"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee web-jsptaglibrary_2_0.xsd">

<!--版本號-->
<tlib-version>1.0</tlib-version>
<jsp-version>2.0</jsp-version>
<short-name>cc</short-name>
<uri>/mytaglib</uri>
	<tag>
		<!--指定標簽名 -->
		<name>showUserInfo</name>
		<!--指定標簽類文件的全路徑 -->
		<tag-class>com.mytags.UserInfoTag</tag-class>
		<!--如果不需要標簽體則設置empty,反之設定jsp -->
		<body-content>empty</body-content>
		<!--設定屬性(如果有的話) -->
		<attribute>
			<!--指定標簽名 -->
		   <name>user</name>
			<!--是否是必須,如果非必須沒設置則為空 -->
			<required>false</required>
			<!--是否可在屬性中使用表達式 -->
			<rtexprvalue>true</rtexprvalue>
		</attribute>
	</tag>
</taglib>
    

?

3 配置web.xml

      <jsp-config>
    <taglib>
        <taglib-uri>/mytaglib</taglib-uri>
        <!—tld文件所在的位置-->
        <taglib-location>/WEB-INF/mytaglib.tld</taglib-location>
    </taglib>
</jsp-config>
    

?備注:web.xml中的 <taglib-uri>標簽可以是任意名稱,但是一般我們將其和tld文件中的uri對應起來 ,因為這個是唯一的標示

?

4 在需要使用此標簽的jsp頁面頭部引入

      <%@ taglib uri="/mytaglib" prefix="cc"%>
    

備注:這里的uri="/mytaglib"指的是tld文件的uri

?

我們創(chuàng)建的UserInfoTag類繼承了TagSupport類,而它又實現(xiàn)了Tag接口,Tag接口的生命周期由其所在的容器控制,如下圖:

jsp自定義標簽學習

?

      setPageContext() 將所在jsp頁面的pageContext注入進來,目的是為了在后面的方法中可以訪問到jsp頁面對象的pageContext屬性
setParent()       設置此標簽的父標簽
setAttribute()   將標簽中的屬性注入到此class的屬性,不需要自己實現(xiàn)但要提供屬性的get與set方法
doStartTag()      在開始標簽屬性設置后調(diào)用,如果返回SKIP_BODY則忽略標簽之中的內(nèi)容,如果返回EVAL_BODY_INCLUDE則將標簽體的內(nèi)容進行輸出
doEndTag()         在結(jié)束標簽之前調(diào)用,返回SKIP_PAGE跳過整個jsp頁面后面的輸出,返回EVAL_PAGE執(zhí)行頁面余下部分
release()          生命周期結(jié)束時調(diào)用 
    

?

?

目標2:自定義一個類似于Asp.Net中的Reapter控件的標簽

<!-- 創(chuàng)建需要展現(xiàn)javabean(UserInfo)集合的實例(用于測試數(shù)據(jù)) -->

      <%
    List<UserInfo> users = new ArrayList<UserInfo>();   
    users.add(new UserInfo("Zhangsan", 12, "Zhangsan@163.com"));
    users.add(new UserInfo("Lisi", 22, "Lisi@sina.com"));
    users.add(new UserInfo("Wangwu", 33, "Wangwu@qq.com"));
    pageContext.setAttribute("users", users);
%>

<!-- 給標簽綁定數(shù)據(jù)源  -->
<table width='500px' border='1' align='center'>
    <tr>
        <td width='20%'>UserName</td>
        <td width='20%'>Age</td>
        <td>Email</td>
    </tr>
    <cc:repeater var="item" items="${pageScope.users }">
        <tr>
            <td>${item.userName }</td>
            <td>${item.age }</td>
            <td>${item.email }</td>
        </tr>
    </cc:repeater>
</table>
    

?

開發(fā)步驟:

要完成此控件我們需要實現(xiàn)一個迭代接口,即IterationTag,由于TagSupport同樣實現(xiàn)了此接口,所以我們繼承此類

?

1 創(chuàng)建自定義標簽類

      public class Repeater extends TagSupport {
    private Collection items;
    private Iterator it;
    private String var;

    @Override
    public int doStartTag() throws JspException {
        if(items == null || items.size() == 0) return SKIP_BODY;
        it = items.iterator();  
        if(it.hasNext()) {
            pageContext.setAttribute(var, it.next());
        }
        return EVAL_BODY_INCLUDE;
    }

    @Override
    public int doAfterBody() throws JspException {
        if(it.hasNext()) {
            pageContext.setAttribute(var, it.next());
            return EVAL_BODY_AGAIN;
        }
        return SKIP_BODY;
    }

    @Override
    public int doEndTag() throws JspException {
        return EVAL_PAGE;
    }

    public void setItems(Collection items) {
        this.items = items;
    }

    public void setVar(String var) {
        this.var = var;
    }
}
    

?

2在Web-Inf創(chuàng)建標簽庫描述文件.tld(Tag Library Description)

由于目標1種已經(jīng)創(chuàng)建了此文件,我們只需增加此標簽的配置即可

      <tag>
    <name>repeater</name>
    <tag-class>com.mytags.Repeater</tag-class>
    <body-content>jsp</body-content>
    <attribute>
        <name>items</name>
        <required>false</required>
        <rtexprvalue>true</rtexprvalue>
    </attribute>
    <attribute>
        <name>var</name>
        <required>true</required>
        <rtexprvalue>true</rtexprvalue>
    </attribute>
 </tag>
    

?

3 配置web.xml (目標1中已完成,無需修改)

?

4 在需要使用此標簽的jsp頁面頭部引入

<%@ taglib uri="/mytaglib" prefix="cc"%>

?

目標4:自定義的函數(shù)庫

1 創(chuàng)建函數(shù)庫類

      public class MyFunctions {
    public static String formatMyName(String name) {
       return "your name is " + name;
    }
    public static int add(int a, int b) {
       return a+b;
    }
}

    

?

2 在TLD文件中配置 (引用于目標1中的tld文件)

      <function>
    <name>formatMyName</name>
    <function-class>com.taglib.MyFunctions</function-class>
    <function-signature>java.lang.String formatMyName(java.lang.String)</function-signature>
</function>
<function>
    <name>add</name>
    <function-class>com.taglib.MyFunctions</function-class>
    <function-signature>java.lang.String add(int, int)</function-signature>
</function>
    

?

3 JSP中調(diào)用

      ${cc:formatMyName("wangfei") }
${cc:add(12, 34) }

    

?

jsp自定義標簽學習


更多文章、技術交流、商務合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯(lián)系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦?。?!

發(fā)表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 夜夜爽日日澡人人添 | 一区二区三区在线免费看 | 亚洲尹人香蕉网在线视颅 | 视频一区二区三区在线观看 | 国产网址在线观看 | 国产小呦 | 国内精品久久久久影院亚洲 | 久久99精品久久久久久青青日本 | 亚洲欧美日韩精品高清 | 亚洲成人综合在线 | 欧美精品国产综合久久 | 欧美天天干 | 日韩视频一区二区 | 日日夜夜人人 | 黄色毛片一级 | 国产精品九九久久一区hh | 香蕉视频毛片 | 国产欧美一区二区三区免费看 | 日韩久久中文字幕 | 亚洲美女精品视频 | 国产福利一区二区三区在线视频 | 久久精品综合视频 | 精品视频午夜一区二区 | 美女一级a毛片免费观看 | 国产一区视频在线免费观看 | 久久精品久久久久 | 免费福利在线播放 | 国产a做爰全过程片 | 婷婷中文在线 | 中文在线1区二区六区 | 成人欧美一区二区三区视频xxx | 欧美午夜性春 | 国内外成人免费视频 | 日本黄 色 成 年 人免费观看 | 五月激激 | 久久人人网| 香蕉观看在线视频成人 | 日韩精品福利视频一区二区三区 | 99热久这里都是精品小草 | 欧美一区二区三区在线观看 | 婷婷在线视频 |