自定义标签

自定义标签

定义一个类直接或者间接的实现标签接口,例如Tag

public class MyTag implements Tag {
    private PageContext pageContext;
    @Override
    public void setPageContext(PageContext pc) {
        this.pageContext=pc;
    }
    @Override
    public void setParent(Tag t) {
    }
    @Override
    public Tag getParent() {
        return null;
    }
    /*
       <font color=red>abcd</font>
       标签起始   属性   标签体   标签结尾
     */
    @Override
    public int doStartTag() throws JspException {
        //标签头的回调方法
        //获取请求参数中name对应的值,如果没有name则默认 tag
        ServletRequest sr=pageContext.getRequest();
        String name=sr.getParameter("name");
        if(name==null || name.trim().length()<1)
            name="Tag";
        //输出问候信息
        JspWriter out=pageContext.getOut();
        try {
            out.write("<h1>Hello "+name+"!</h1>");
        } catch (IOException e) {
            throw new JspException(e);
        }
        //Tag.EVAL_BODY_INCLUDE  表示处理标签体;
        //Tag.SKIP_BODY  跳过标签体
        return Tag.SKIP_BODY;
    }

    @Override
    public int doEndTag() throws JspException {
        //遇到标签尾的回调方法
        // Tag.EVAL_PAGE 继续处理后续标签
        // Tag.SKIP_PAGE  不处理后续标签
        return Tag.EVAL_PAGE;
    }
    @Override
    public void release() {
        //销毁标签对象时 释放资源
    }
}

在/WEB-INF/下创建一个文件xxx.tld

  • 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 http://java.sun.com/xml/ns/javaee/web-jsptaglibrary_2_1.xsd"
        version="2.1">
    <!--定义标签库的版本号-->
    <tlib-version>5.0</tlib-version>
    <!--标签的短名称,即标签的前缀-->
    <short-name>yan</short-name>
    <!--设置标签库的URI地址-->
    <uri>/WEB-INF/yan.tld</uri>

    <tag>
        <!--标签名称,根据配置调用方法为yan:hello-->
        <name>hello</name>
        <!--标签处理类的全名称-->
        <tag-class>com.yan.tags.MyTag</tag-class>
        <!--允许的标签体内容类型-->
        <body-content>empty</body-content>
        <!--标签属性声明-->
        <attribute>
            <!-- 属性名称 -->
            <name>var</name>
            <required>false</required>
            <rtexprvalue>false</rtexprvalue>
        </attribute>
    </tag>
</taglib>

页面中如何调用

<!-- 第一步引入标签库,prefix标签前缀对应tld文件中的short-name,uri为tld文件中的uri配置-->
<%@ taglib prefix="yan" uri="/WEB-INF/yan.tld" %>

<!--直接按照前缀名+标签名的方式使用标签-->
<yan:hello/>

随着时间的推荐,标签库越来越多,缺少标准,使用比较混乱

解决方案:标准标签库JSTL

JSTL

JSP标准标签库JSTL是一个JSP标签集合,它封装了JSP应用的通用核心功能。

JSTL支持通用的、结构化的任务,比如迭代,条件判断,XML文档操作,国际化标签,SQL标签。 除了这些,它还提供了一个框架来使用集成JSTL的自定义标签。

JSP标准标记库JSTL是 JSP定制标记库集,这些标记库实现大量服务器端 Java 应用程序常用的基本功能

  • 通过为典型表示层任务(如数据格式化和迭代或条件内容)提供标准实现,JSTL 使 JSP 作者可以专注于特定于应用程序的开发需求,而不是为这些通用操作另起炉灶

  • 根据JSTL标签所提供的功能,可以将其分为5个类别:核心标签、格式化标签、SQL标签、XML标签和JSTL函数

JSTL标签库

JSTL 标签种类说 明
核心标签包含JSTL核心操作所需的标签,例如数据输出、循环流程控制以及URL操作等
i18n国际化标签进行数值与日期数据格式化、国际化资源网页设定所需的标签
SQL标签运用SQL与操作资库所需的标签
XML标签剖析XML文件所需的标签
函数标签包含字符串处理与其它特定功能之JSTL标签
标签种类前缀词uri
核心标签chttp://java.sun.com/jsp/jstl/core
i18n国际化标签fmthttp://java.sun.com/jsp/jstl/fmt
SQL标签sqlhttp://java.sun.com/jsp/jstl/sql
XML标签xmlhttp://java.sun.com/jsp/jstl/xml
函数标签fnhttp://java.sun.com/jsp/jstl/functions

依赖配置pom.xml

<!--如果使用tomcat10 -->
<dependency>
    <groupId>org.glassfish.web</groupId>
    <artifactId>jakarta.servlet.jsp.jstl</artifactId>
    <version>2.0.0</version>
</dependency>

<!--如果使用Tomcat9或者更低版本使用-->
 <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>jstl</artifactId>
            <version>1.2</version>
</dependency>

核心标签库

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
核心标签库
<c:if test="${not empty requestScope.bookList}">
     <c:forEach items="${bookList}" var="book">
           <TR bgColor=#ffffff>
                   <TD class=txt align=middle width="8%">${book.id}</TD>
                    <TD class=txt align=middle width="20%">${book.title}</TD>
                    <TD class=txt align=middle width="20%">${book.catalog.title}</TD>
                    <TD class=txt align=middle width="14%">${book.unit}</TD>
                    <TD class=txt align=middle>${book.price}</TD>
                    <TD οnmοuseοver="this.style.cursor='hand';this.style.backgroundColor='#eeeeee';"
                            οnclick=""
                            οnmοuseοut="this.style.backgroundColor='#ffffff';"
                            noWrap align=middle><image src="images/cart.gif" style="border:0px"></TD>
                </TR>
      </c:forEach>
           <tr><td colspan=3 align=center>1&nbsp;&nbsp;2&nbsp;&nbsp;3&nbsp;&nbsp;4&nbsp;&nbsp;5&nbsp;&nbsp;6&nbsp;&nbsp;7&nbsp;&nbsp;8</td>
               <td colspan=3 align=center>每页:15个 页码:1/8页 共有:87个</td></tr>
</c:if>
c:if用于条件判断

无本体内容

<c:if test="条件表达式" var="存储变量名" [scope="存储范围{page |request |session |application }"]/>

包含本体内容

<c:if test="条件表达式" [var="存储变量名"] [scope="存储范围{page |request |session |application}"]> 标签体</c:if>

如果条件成立则执行标签体,否则不执行标签体
属性动态类型说明
testboolean条件表达式
varString输出判断结果的范围变量名称
scopeStringvar的范围
  • test 是最重要的属性,为标签的条件判断式
  • var用来储存判断式的输出結果
<c:if test="${not empty requestScope.bookList}">
...
</c:if>

等价于
Object obj=request.getAttribute("bookList");
if(obj!=null && ((List)obj).size()>0){
  ......
}
c:forEach循环标签

迭代对象集合内容

<c:forEach [var="循环控制变量名"] items="需要循环迭代的集合" [varStatus="循环状态变量"] [begin="起始值"] [end="终止值"] [step="循环步长值"]>
    标签体
</c:forEach>
  • var用来指定网页当中所要迭代的对象
  • items则是每一次迭代所取得的对象内容
  • varStatus为目前对象的相关内容信息
  • begin、end以及step则是相关的属性,分别代表迭代的开始、结束以及区间,这三个值相互影响,设定不正确可能导致程序流程的运行错误

迭代特定次数

<c:forEach [var="varName"] [varStatus="varStatusName"] begin="begin" end="end" [step="step"]>
    body content
</c:forEach>

九九乘法口诀表

<table width="80%">
    <c:forEach var="k" begin="1" end="9">
        <tr>
        <c:forEach var="i" begin="1" end="${k}">
            <td>${i}*${k}=${k*i}</td>
        </c:forEach>
        </tr>
    </c:forEach>
</table>
属性动态类型说明
varString储存指定的迭代成员
items集合对象迭代的集合对象
varStatusString储存指定迭代成员的状态内容
beginint迭代的开始值
endint迭代的结束值
stepint每次迭代的间隔值
<%
String atts[] = new String [5]; atts[0]="hello";    atts[1]="this";    atts[2]="is";    atts[3]="a";     atts[4]="pen";    request.setAttribute("atts", atts);
%>

<c:forEach items="${atts}" var="item" begin="1" end="4" step="2" > 
    ${item}</br>
</c:forEach>

结果是只显示atts[1]和atts[3]的内容

<%  
Map map=new HashMap();
map.put("111","aaa");
map.put("222","bbb");
map.put("333","ccc");
pageContext.setAttribute("map",map);
%>

<c:forEach items="${map}" var="ff">
    <c:out value="${ff.key}"/>:<c:out value="${ff.value}" /><br>
</c:forEach>

用c:forEach 中varStatus的属性可以获得迭代的自身状态

<c:forEach var="" items="" varStatus="status">
    <c:out value=“${status.index}”/> 此次迭代的索引
    <c:out value=“${status.count}”/> 已经迭代的数量
    <c:out value=“${status.first}”/> 是否是第一个迭代对象
    <c:out value=“${status.last}”/>  是否是最后一个迭代对象
</c:forEach>
<c:forEach var="item" items="${contents}" varStatus="status">
    <tr 
        <c:if test="${status.count%2==0}"> bgcolor="#CCCCFE" </c:if> 
    align="left">
        ${item.username}
    </tr>   
</c:forEach>
建立URL

<c:url>标签在JSP网页动态指定一个网址字符串

<c:url value="value" [context="context"] [var="varName"] [scope="{ page | request | session | application }"]>
    <c:param> subtags <c:param>
</c:url>
  • value代表所要设定的网页资源位置
  • context用来指定一个外部资源
  • var代表一个变量,如果有指定,URL资源的内容将被输出至指定的变量
  • scope则是变量的范围,var变量只在这个范围里面有效
c:param
cparam标签

将属性值指定给value属性

<c:param name="name" value="value"/>

应用场景

<a href="<c:url value='/login.jsp' />">现在就登录</a>

<c:param>标签放在<c:url>本体內容当中,可用来设定连接所要传递的参数內容

<c:param>所指定的参数值firstPara,与URL字符串一同被送出:urlstring? FirstPara=123456

<c:url value="/login.jsp" var="loginURL" >   login.jsp?username=yanjun&password=123456
    <c:param name="username" value=“yanjun"/>
    <c:param name="password" value=“123456"/>
</c:url>

<a href="<c:out value='${loginURL}'/>">现在就登录</a>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值