JSP 标签库

标签库作用

  • 替代Java代码
  • 替代EL表达式脚本

 

导入标签库

<%@ taglib prefix="c" uri=http://java.sun.com/jsp/jsti/core %>
  • prefix(前缀):区别不同的标签库
  • uri:标签库的路径

 

步骤:

  1. 安装JSTL
  2. taglib指令导入JSP
  3. 使用标签库

 

核心标签库

输出标签

<c:out value="表达式" [escapeXML="true|false"] default=""/>
  • escapeXML:自动转义

 

遍历标签

<c:forEach var="x" begin="1" end="5">

<c:out value="${x}"/>

</c:forEach>
  • items:对象
  • begin:开始
  • end:结束
  • var:变量
  • step:步长,默认1
<c:forTokens var="item" items="<..值...>" delims="<>,(%)>">

<li>${item}</li>

</c:forTokens>
  • delims:定界符集

 

条件标签

<c:if test="${i>3}">

(greater than 3)

</c:if>

类似switch语句 

<c:choose>

<c:when test ="${i<3}" > (less than 3) </c:when>

<c:when test ="${i<5}" > (less than 5) </c:when>

<c:otherwise>(greater than 5)</c:otherwise>

</c:choose>

 

变量操作

<c:set  target="beanName"  property="propertyName"  [scope="varScope"] />

  someValue

</c:set>

<c:remove var="" [scope=""]/>
  • var:指定变量名称。
  • scope:指定变量的作用范围,默认为page。
  • value:待赋给变量的值,可以是一个常量、EL或JSP表达式
  • target:target属性是结果为对象的表达式。如果对象实现了Map接口,c:set标签的property属性被当作键(值已指定),用来新建一个映射条目。如果target属性的结果为JavaBean,那么c:set标签的值就被传递给property属性所指定的目标JavaBean的属性值为null时,其结果相当于调用setAttribute(null)语句,可以是请求、响应或会话等,其结果是从作用域中删除了属性。

 

URL相关标签

<c:import url=http://www.baidu.com var="baidu"/>
  • context:内容
  • scope:作用范围
  • charEncoding:编码
  • url:导入的资源
<c:param name="paraName" value="paramValue"/>

<c:url value="URL" [var="name"] [scopr=""] [context="context"]/>

重定向标签

<c:redirect url="url" [context="context"]>

</c:redirect>

自定义标签

步骤

  1. 创建标签处理类(注意要遵循Javabean的规则)
  2. TLD文件,用于将XML元素映射到标签实现
  3. 使用标签库的JSP文件

注意:

载入标签处理类之后,Tomcat首先用无参数构造函数实例化该类。

因此每个标签处理类必须有一个无参数构造函数,否则实例化时将会失败。

 

实例(计算三角形的面积)

创建标签处理类

  • 继承SimpleTagSupport
  • 实现SimpleTag接口
  • 多个属性创建对应的setXXX方法
  • doTag()方法

注意:

执行标签实际动作的代码定义在doTag方法内。

通常,通过调用JspWriter类的print方法将内容输出到JSP页面。为了获得JspWriter类的一个实例,在doTag方法内部调用getJspContext().getOut()。

doTag方法是在请求时调用的。SimpleTag模型不会重用标签处理类的实例,标签处理类为页面上出现的每个标签创建一个新实例。

 

要想输出标签体的内容,需要在doTag方法内部通过下述方式获取表示标签体的JspFragment实例:

调用getJspBody方法,然后使用其invoke方法,为它传递null作为参数。

getJspBody().invoke(null);

Tomcat像处理其他JSP页面内容一样处理标签体中的JSP内容。如果向invoke方法传递参数为null,那么JSP内容的输出结果会被逐字传递到客户端。因此,doTag方法没有任何访问标签体输出的任何方式中,它所做的仅仅是遍历标签体。

package jsplearn.w10;

import jsplearn.w8.bean.Triangle;

import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.tagext.SimpleTagSupport;
import java.io.IOException;
import java.io.StringWriter;

public class computerTag extends SimpleTagSupport {
    private String sideA;
    private String sideB;
    private String sideC;

    public computerTag() {
    }
    
    public void setSideA(String sideA) {
        this.sideA = sideA;
    }

    public void setSideB(String sideB) {
        this.sideB = sideB;
    }

    public void setSideC(String sideC) {
        this.sideC = sideC;
    }

    public String getSideA() {
        return sideA;
    }

    public String getSideB() {
        return sideB;
    }

    public String getSideC() {
        return sideC;
    }

    @Override
    public void doTag() throws JspException, IOException {
        Triangle triangle = null;
        StringWriter stringWriter = new StringWriter();
        double d1=Double.valueOf(sideA);
        double d2=Double.valueOf(sideB);
        double d3=Double.valueOf(sideC);
        if (d1 >= 0 && d2 >= 0 && d3 >= 0) {
            triangle = new Triangle(d1,d2,d3);
            JspWriter out= getJspContext().getOut();
            if (triangle.isTriangle()) {
                out.println("三角形的面积是:"+triangle.getArea());
            }else{
                out.println("这不是一个三角形");
            }
        }
    }
}

 

TLD文件

  • description:描述
  • tlib-version:标签的版本
  • uri:统一资源定位符
  • tag-class:对应的标签处理类
  • body-content:标签体
  • attribute:属性
  • required:是否可选
  • rtexprvalue:可选元素。rtexprvalue设置为true时,表明属性值是一个<%=expression%>形式的JSP脚本表达式或如${bean.value}的JSP EL。rtexprvalue设置为false时,表明属性值必须是一个固定的字符串。默认值是false。

 

注意:

定义标签处理类后,需要向服务器标识这个类,并将其与特定的XML标记名称相关联。

这个任务是通过一个XML格式的TLD(taglib description)文件来完成的。

该文件包含固定的信息(如XML Schema实例声明)、标签库描述及标签描述等内容。TLD文件需要放在WEB-INF目录或其子目录下。

 

body-content,告诉Tomcat如何处理标签开始和结束之间的内容,可设置值包括:

  • empty:不允许任何内容出现在标签体中。将任何内容(包括空格)放在标签体内会产生页面翻译错误。
  • scriptless:允许标签体中有JSP内容,但是不能包含<%…%>或<%=…%>之类的任何脚本元素。
  • tagdependent:允许标签像其主体一样有任何类型的内容。但是,这些内容根本不会被处理,并会被完全忽略。由标签处理类开发人员来决定访问这些内容,并对其进行处理。

JSP:向后兼容servlet2.4之前定制标签的传统定义方式。不能用于使用SimpleTag接口的标签处理类。

<?xml version="1.0" encoding="ISO-8859-1"?>

<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>1.0</tlib-version>
    <short-name>computer</short-name>
    <uri>http://mycompany.com</uri>

    <!-- Invoke 'Generate' action to add tags or functions -->
    <tag>
        <name>Triangle</name>
        <tag-class>jsplearn.w10.computerTag</tag-class>
        <body-content>empty</body-content>
        <attribute>
            <name>sideA</name>
            <required>true</required>
        </attribute>
        <attribute>
            <name>sideB</name>
            <required>true</required>
        </attribute>
        <attribute>
            <name>sideC</name>
            <required>true</required>
        </attribute>
    </tag>
</taglib>

使用标签库

<%--
  Created by IntelliJ IDEA.
  User: max
  Date: 2018/11/13
  Time: 12:35
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib prefix="computer" uri="/WEB-INF/tags.tld" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<H3>以下是调用Tag文件的效果:</H3>
<computer:Triangle sideA="5" sideB="6" sideC="7"/>
</body>
</html>

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值