天天看點

JSP自定義标簽快速入門

最近講課講到JSP自定義标簽,發現書本上的例子很複雜,不适合初級入門的同學學習,于是自己重新整理了一下,簡要内容放上來,希望能對同樣需求的朋友有用。

做Web開發的人都知道HTML标簽,在JSP開發中常用的就是<%腳本%>來處理邏輯,而這種HTML中簽入Java程式的方式構成了JSP最初的樣子。

後來,為了進一步簡化程式設計,或者說使JSP源代碼看上去更清晰一些,标簽技術營運而生。最有代表性的當時是JSTL,還有Struts标簽等。為了更好的了解這些标簽的工作原理,自定義标簽課程必不可少。

下面就先通過親手做一個标簽來體會一下。

在JSP2中,可以通過兩種方式來建立自己的标簽庫。一種是标記檔案的方式,一種是标簽處理程式的方式。其實它們本質上是一樣的。

先說标記檔案方式,這種方式做起來相對簡單。先來做一個簡單的顯示紅色字型“你好”的标簽。首先建立一個hello.tag檔案

<%@tag description="列印Hello" pageEncoding="UTF-8"%>

<%-- 這是屬性: --%>

<%@attribute name="message"%>

<%-- 這是标簽内容 --%>

<h2 style="color:red">${message}</h2>

放到WEB-INF/tags/下。

然後開始調用這個标簽。建立一個usetagfile.jsp

<%@page contentType="text/html" pageEncoding="UTF-8"%>

<%@ taglib tagdir="/WEB-INF/tags" prefix="jerry" %>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"

     "http://www.w3.org/TR/html4/loose.dtd">

<html>

        <head>

                <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

                <title>使用标記檔案</title>

        </head>

        <body>

                <jerry:hello message="你好"></jerry:hello >

        </body>

</html>

OK,運作測試一下吧。效果很簡單。

第二中方式是标簽處理程式的方式。我們可以通過實作SimpleTagSupport類來做一個簡單标簽,通過傳入一條select語句,實作一個表格顯示。我們首先建立一個标簽庫描述符,這其實就相當于标簽庫的系統資料庫。

<?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>

    <short-name>jerry</short-name>

    <uri>/WEB-INF/tlds/jerry</uri>

    <tag>

        <name>table</name>

        <tag-class>taghandler.TableTagHandler</tag-class>

        <body-content>scriptless</body-content>

        <attribute>

            <name>selectSQL</name>

            <rtexprvalue>true</rtexprvalue>

            <type>java.lang.String</type>

        </attribute>

    </tag>

</taglib>

然後我們來實作标簽處理類TableTagHandler

package taghandler;

import java.io.IOException;

import java.util.logging.Level;

import java.util.logging.Logger;

import javax.servlet.jsp.tagext.*;

import javax.servlet.jsp.JspWriter;

import javax.servlet.jsp.JspException;

/**

*

* @author Administrator

*/

public class TableTagHandler extends SimpleTagSupport {

        private String selectSQL;

        public void doTag() throws JspException {

                try {

                        JspWriter out = getJspContext().getOut();

                        out.println("<link rel=\"stylesheet\" href=\"css/tablestyle.css\" type=\"text/css\" />");

                        out.println("<table>");

                        out.println("<thead>");

                        out.println("<tr>");

                        out.println("<th>學号</th>");

                        out.println("<th>姓名</th>");

                        out.println("<th>性别</th>");

                        out.println("</tr>");

                        out.println("</thead>");

                        out.println("<tbody>");

//從資料庫中取資料,形成ArrayList

                        database.SQLServer db = new database.SQLServer();

                        java.util.ArrayList<String[]> students = db.selectToArrayList(this.selectSQL);

                        for (String[] stu : students) {

                                out.println("<tr>");

                                out.println("<td>" + stu[0] + "</td>");

                                out.println("<td>" + stu[1] + "</td>");

                                out.println("<td>" + stu[2] + "</td>");

                                out.println("</tr>");

                        }

                        out.println("</tbody>");

                        out.println("</table>");

                } catch (IOException ex) {

                        Logger.getLogger(TableTagHandler.class.getName()).log(Level.SEVERE, null, ex);

                }

        }

        public void setSelectSQL(String selectSQL) {

                this.selectSQL = selectSQL;

}

最好,我們需要一個測試頁面來看看運作效果。

<%@page contentType="text/html" pageEncoding="UTF-8"%>

<%@ taglib uri="/WEB-INF/tlds/jerry" prefix="jerry" %>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"

     "http://www.w3.org/TR/html4/loose.dtd">

                <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

                <title>JSP Page</title>

                <jerry:table selectSQL="select xuehao,xingming,xingbie from student"></jerry:table>

注意,這裡的taglib指令中使用uri來指定标簽位置。和标記檔案使用時不同。

本文轉自 王傑瑞 51CTO部落格,原文連結:http://blog.51cto.com/wangjierui/108791,如需轉載請自行聯系原作者