JSP自定义标签

JSP自定义标签

简介

自定义标签是用户定义的JSP语言元素。当JSP页面包含一个自定义标签时将被转化为servlet,标签转化为对被 称为tag handler的对象的操作,即当servlet执行时Web container调用那些操作。
JSP标签扩展可以让你创建新的标签并且可以直接插入到一个JSP页面。 JSP 2.0规范中引入Simple Tag Handlers来编写这些自定义标记。
你可以继承SimpleTagSupport类并重写的doTag()方法来开发一个最简单的自定义标签。
更多信息

实现过程

  1. 通过JSP页面的<%@taglib%> 指令 找到服务器对应的 .tld 文件

    • <%@ taglib uri=”/WEB-INF/mytag.tld” prefix=”tag”%>
    • <%@ taglib uri=”http://testTag/myTag” prefix=”tag”%>
  2. 通过.tld文件找到对应的实现类

    • 该类如果是单标签(如:<br>)继承SimpleTagSupport,
    • 有内容有属性的标签(如:<span style='color:red'>span标签</span>)继承BodyTagSupport
    • 单标签带属性的实现 TagSupport

    • .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" 
    version="2.1">
    <description>myFirstTag</description>
    <display-name>testTag</display-name>
    <tlib-version>1.0</tlib-version>
    <short-name>Tag</short-name>
    <uri>http://testTag/myTag</uri>//这行表示在JSP可以通过 <%@ taglib uri="http://testTag/myTag" prefix="tag"%> 导入标签库 ,没有这行 可通过<%@ taglib uri="/WEB-INF/mytag.tld" prefix="tag"%>导入
    <tag>
    //单标签 tag.helloTag 类继承SimpleTagSuppo
        <name>hello</name>
        <tag-class>tag.HelloTag</tag-class>
        <body-content>empty</body-content>
    </tag>
    //单标签且带属性  tag.AddTag 类继承TagSupport
    <tag>
        <name>add</name>
        <tag-class>tag.AddTag</tag-class>
        <body-content>empty</body-content>
        <attribute>
            <name>num1</name>
            <required>true</required>
            <rtexprvalue>true</rtexprvalue>
        </attribute>
        <attribute>
            <name>num2</name>
            <required>true</required>
            <rtexprvalue>true</rtexprvalue>
        </attribute>
    </tag>
    //闭合标签且带属性  tag.ColorTag类 实现BodyTagSupport
    <tag>
        <name>color</name>
        <tag-class>tag.ColorTag</tag-class>
        <body-content>jsp</body-content>
        <attribute>
            <name>size</name>
            <required>true</required>
            <rtexprvalue>true</rtexprvalue>
        </attribute>
        <attribute>
            <name>color</name>
            <required>true</required>
            <rtexprvalue>true</rtexprvalue>
        </attribute>
    </tag>
    </taglib>

代码解释
<body-content>empty</body-content> empty 代表是单标签
<body-content>jsp</body-content> 闭合标签
<rtexprvalue>true</rtexprvalue> 支持EL表达式

使用 <tag:hello />
<tag:add num2="${n }" num1="47" />
<tag:color color="blue" size="28" >大家好~~~</tag:color>

这里省略类的实现。

例子:自定义标签实现分页

  1. JSP 代码
...
<%@ taglib uri="http://testTag/page" prefix="p"%> //必须要用taglib标签导入
这里省略n行代码
    <body>
        当前页${pi.pagenum }
        <table border="1" width="700">
            <tr>
                <td>编号</td>
                <td>学号</td>
                <td>科目号</td>
                <td>成绩</td>
                <td>考试时间</td>
            </tr>
            <c:forEach var="r" items="${results }">
            <tr>
                <td>${r.id }</td>
                <td>${r.studentno }</td>
                <td>${r.subjectid }</td>
                <td>${r.score }</td>
                <td>${r.examdate }</td>
            </tr>
            </c:forEach>
        </table>
        //重点在这
        //要实现分页必须有两个参数, 一个是要请求的 Servlet ,一个是page对象
        <p:page servletName="PageResultServlet" pageInfo="${page }"/>
    </body>
</html>
  • 设置 .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" version="2.1">
    <description>myPageTag</description>
    <display-name>pageTag</display-name>
    <tlib-version>1.0</tlib-version>
    <short-name>page</short-name>
    <uri>http://testTag/page</uri>
    <tag>
        <name>page</name>
        <tag-class>com.test.tag.PageTag</tag-class>
        <body-content>empty</body-content>
        <attribute>
            <name>pageInfo</name>
            <required>true</required>
            <rtexprvalue>true</rtexprvalue>
        </attribute>
        <attribute>
            <name>servletName</name>
            <required>true</required>
            <rtexprvalue>true</rtexprvalue>
        </attribute>
    </tag>
</taglib>
  • 自定义page对象实现

import java.io.IOException;

import javax.servlet.jsp.JspContext;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.tagext.TagSupport;

import com.test.entity.PageInfo;

public class PageTag extends TagSupport {

    private String servletName;
    private PageInfo pageInfo;

    public String getServletName() {
        return servletName;
    }

    public void setServletName(String servletName) {
        this.servletName = servletName;
    }

    public PageInfo getPageInfo() {
        return pageInfo;
    }

    public void setPageInfo(PageInfo pageInfo) {
        this.pageInfo = pageInfo;
    }

    @Override
    public int doStartTag() throws JspException {
        // 获得页面上下文
        JspContext jc = this.pageContext;
        // 获得输出流
        JspWriter out = jc.getOut();

        try {
            out.print("<form action='" + servletName + "' method='post'>");
            out.print("<a href='" + servletName + "?page=1'>首页</a> ");
            out.print("<a href='" + servletName + "?page="
                    + (pageInfo.getPagenum() - 1) + "'>上一页</a> ");

            for (int i = 1; i <= pageInfo.getTotalpage(); i++) {

                if (Math.abs(i - pageInfo.getPagenum()) > 3
                        && Math.abs(i - pageInfo.getPagenum()) <= 6) {
                    out.print(".");
                } else if (Math.abs(i - pageInfo.getPagenum()) <= 3) {
                    out.print("<a href='" + servletName + "?page=" + i + "'>"
                            + i + "</a> ");

                }

            }

            out.print("<a href='" + servletName + "?page="
                    + (pageInfo.getPagenum() + 1) + "'>下一页</a> ");
            out.print("<a href='" + servletName + "?page="
                    + pageInfo.getTotalpage() + "'>末页</a> ");

            out.print("前进至第<input name='page' size='2' />页 ");
            out.print("<input type='submit' value='GO' /> ");

            out.print("总共" + pageInfo.getTotalcount() + "条、每页"
                    + pageInfo.getPerpage() + "条,总共" + pageInfo.getTotalpage()
                    + "页,当前第" + pageInfo.getPagenum() + "页");

            out.print("</form>");
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        return this.EVAL_PAGE;
    }
}
  • PageResultServlet 类 ,实现和数据库交互, 取出每页的内容,通过request.setAttribute(“results”, 结果集合);
    request.setAttribute(“page”, 分页对象); 传入值
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值