JSP自定义标签

xiaoxiao2021-02-27  178

JSP自定义标签

简介

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

实现过程

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

<%@ taglib uri=”/WEB-INF/mytag.tld” prefix=”tag”%><%@ taglib uri=”http://testTag/myTag” prefix=”tag”%>

通过.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> 这里省略类的实现。

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

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”, 分页对象); 传入值
转载请注明原文地址: https://www.6miu.com/read-16459.html

最新回复(0)