JSP标准标签库(JSTL)个人使用指南
前排提示,本篇仅涉及 JSTL 的配置和简要介绍 JSTL 的 Core 和 Functions 标签库中几个常用的标签。更加详细的内容,博主会贴相应超链接。
注意:本教程使用的 JSTL 1.2,如果你使用的是 JSTL 1.1 或之前的版本,需要导入 jstl.jar 和 standard.jar 两个包。可点击 http://archive.apache.org/dist/jakarta/taglibs/standard/binaries/ 链接下载 JSTL 1.1 及之前的版本。
JSTL 规范由 Sun 公司制定,由 Apache 的 Jakarta 小组负责实现。JSTL 由 5 个不同功能的标签库组成,包括 Core、I18N、XML、SQL 以及 Functions;
配置 JSTL
注意:JSTL 现在已经是 Java EE5 的一个组成部分,如果采用支持 Java EE5 或以上版本的集成开发环境开发 Web 应用程序,就不需要再配置 JSTL 了。
Update:2021/12/05
Maven Web 项目下JSTL 使用分为如下步骤:
POM.xml 下导入坐标
<dependency>
<groupId>jstl</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<dependency>
<groupId>taglibs</groupId>
<artifactId>standard</artifactId>
<version>1.1.2</version>
</dependency>
在JSP页面上引入JSTL标签库
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
使用标签
JSTL的下载
使用 JSTL 需要引入 JSTL 的 JAR 包和标签库描述符文件(扩展名为 .tld),标签库描述符文件内包含标签库中所有标签的定义、标签名、功能类及各种属性。
- JATL JAR 包官方下载网址:https://tomcat.apache.org/taglibs/standard/
下载完毕以后可以根据使用的软件进行配置。
Eclipse 平台
如果你再用的是 Eclipse 平台,则需要配置 JSTL。配置 JSTL 的步骤如下:
1)复制 JSTL 的标准实现
在 Tomcat 的 \webapps\examples\WEB-INF\lib 目录下找到 taglibs-standard-impl-1.2.5.jar 和 taglibs-standard-spec-1.2.5.ja r文件,然后复制到 Web 工程的 WEB-INF\lib 目录下。
2)使用 taglib 标记定义前缀与 uri 引用
如果使用 Core 标签库,首先需要在 JSP 页面中使用 taglib 标记定义前缀与 uri 引用,代码如下:
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
如果使用 Functions 标签库,首先需要在 JSP 页面中使用 taglib 标记定义前缀与 uri 引用,代码如下:
<%@taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions"%>
IDEA 平台
1)复制 JSTL 的标准实现
在 Tomcat 的 \webapps\examples\WEB-INF\lib 目录下找到 taglibs-standard-impl-1.2.5.jar 和 taglibs-standard-spec-1.2.5.ja r文件,然后复制到 Web 工程的 WEB-INF\lib 目录下。
2) 拷贝 tlb 文件
把压缩包解压后得将 tld 下的需要引入的 tld 文件复制到 WEB-INF 目录下。
接下来我们在 web.xml 文件中添加以下配置:可以根据需求增删
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4"
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
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
<jsp-config>
<taglib>
<taglib-uri>http://java.sun.com/jsp/jstl/fmt</taglib-uri>
<taglib-location>/WEB-INF/fmt.tld</taglib-location>
</taglib>
<taglib>
<taglib-uri>http://java.sun.com/jsp/jstl/fmt-rt</taglib-uri>
<taglib-location>/WEB-INF/fmt-rt.tld</taglib-location>
</taglib>
<taglib>
<taglib-uri>http://java.sun.com/jsp/jstl/core</taglib-uri>
<taglib-location>/WEB-INF/c.tld</taglib-location>
</taglib>
<taglib>
<taglib-uri>http://java.sun.com/jsp/jstl/core-rt</taglib-uri>
<taglib-location>/WEB-INF/c-rt.tld</taglib-location>
</taglib>
<taglib>
<taglib-uri>http://java.sun.com/jsp/jstl/sql</taglib-uri>
<taglib-location>/WEB-INF/sql.tld</taglib-location>
</taglib>
<taglib>
<taglib-uri>http://java.sun.com/jsp/jstl/sql-rt</taglib-uri>
<taglib-location>/WEB-INF/sql-rt.tld</taglib-location>
</taglib>
<taglib>
<taglib-uri>http://java.sun.com/jsp/jstl/x</taglib-uri>
<taglib-location>/WEB-INF/x.tld</taglib-location>
</taglib>
<taglib>
<taglib-uri>http://java.sun.com/jsp/jstl/x-rt</taglib-uri>
<taglib-location>/WEB-INF/x-rt.tld</taglib-location>
</taglib>
</jsp-config>
</web-app>
使用任何库,你必须在每个 JSP 文件中的头部包含<taglib> 标签。
核心标签
JSTL 核心(core)标签是最常用的 JSTL 标签,导入核心标签库的语法如下:
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
| 标签 | 说明 |
|---|---|
| <c:out> | 将表达式的结果输出到页面中,类似于 <%= ...%> |
| <c:set> | 在指定范围内设置变量或属性值 |
| <c:if> | 类似于 Java if 语句,用于条件判断 |
| <c:choose> | 类似于 Java switch 关键字,为 <c:when>和<c:otherwise> 的父标签 |
| <c:when> | <c:choose> 的子标签,用来判断条件是否成立 |
| <c:otherwise> | <c:choose> 的子标签,当所有的 <c:when> 标签判断为 false 时被执行 |
| <c:forEach> | 类似于 Java for,用于迭代集合中的信息 |
| <c:forTokens> | 类似于 Java split,用于分隔字符串 |
| <c:remove> | 用于删除数据 |
| <c:catch> | 用于捕获异常 |
| <c:import> | 用来导入静态或动态文件 |
| <c:param> | 用来传入参数 |
| <c:redirect> | 用于将当前页面重定向至另一个 URL |
| <c:url> | 用于将 URL 格式化为一个字符串 |
格式化标签
JSTL 格式化(fmt)标签可以通过很简单的方式转换数字、日期,导入格式化标签库的语法如下。
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>
| 标签 | 说明 |
|---|---|
| <fmt:requestEncoding> | 设置请求数据的字符编码 |
| <fmt:setLocale> | 用于设置用户本地化环境 |
| <fmt:bundle> | 绑定资源 |
| <fmt:message> | 用来从指定的资源文件中调用信息 |
| <fmt:setBundle> | 绑定资源 |
| <fmt:formatNumber> | 用于格式化数字、百分比和货币 |
| <fmt:parseNumber> | 用于解析数字、货币和百分比 |
| <fmt:formatDate> | 用于使用不同的方式格式化日期 |
| <fmt:parseDate> | 用于把字符串类型的日期转换成日期数据类型 |
| <fmt:timeZone> | 用于指定时区 |
| <fmt:setTimeZone> | 用于设定默认时区 |
SQL标签
JSTL SQL 标签提供了许多操作数据库(MySQL、Oracle、SQL Server 等)的标签。虽然在大型的网站中不建议使用这种标签库,但在小型网站中经常会用到。导入 SQL 标签库的语法如下。
<%@ taglib uri="http://java.sun.com/jsp/jstl/sql" prefix="sql" %>
| 标签 | 说明 |
|---|---|
| <sql:setDataSource> | 用来在 JSP 页面中配置数据源 |
| <sql:query> | 查询数据库中的数据 |
| <sql:update> | 更新数据库中的数据 |
| <sql:dateParam> | 提供日期和时间的动态值 |
| <sql:transaction> | 事务管理 |
| <sql:param> | 设置 SQL 语句中的动态值 |
函数标签
JSTL 函数(fn)标签大部分是通用的字符串处理函数,导入函数标签库的语法如下:
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
| 标签 | 说明 |
|---|---|
| fn:contains() | 用于判断一个字符串是否包含指定的字符串,区分大小写 |
| fn:containsIgnoreCase() | 用于判断一个字符串是否包含指定的字符串,不区分大小写 |
| fn:endsWith() | 用于判断一个字符串是否以指定的后缀结尾 |
| fn:escapeXml() | 用于转义 HTML/XML 中的字符 |
| fn:indexOf() | 用于返回字符串在指定字符串中的开始位置 |
| fn:join() | 用来将数组中的所有元素利用指定的分隔符来连接成一个字符串 |
| fn:length() | 用于返回指定字符串的长度 |
| fn:split() | 用于将字符串用指定的分隔符分隔为一个子串数组 |
| fn:startsWith() | 用于判断一个字符串是否以指定的前缀开头 |
| fn:substring() | 用来返回指定字符串的子字符串 |
| fn:substringAfter() | 用来返回字符串中指定子字符串后面的部分 |
| fn:substringBefore() | 用来返回字符串中指定子字符串前面的部分 |
| fn:toLowerCase() | 用来将指定字符串中的所有字符转为小写 |
| fn:toUpperCase() | 将指定字符串中的所有字符转为大写 |
| fn:trim() | 用来删除指定字符串两端的空格 |
自定义标签
自定义标签就是用户(开发者)自己定义的标签。自定义标签可以让 JSP 页面中不含有 Java 代码,只含有 HTML 代码和部分标签,就能实现业务逻辑的调用。
自定义标签的优点如下:
- 减少 JSP 页面对脚本的需求和依赖性
- 将 JSP 页面和业务逻辑分开,增加了程序的可维护性
- 可重复调用相同的业务逻辑,增加了程序的可重用性
使用自定义标签步骤如下:
- 自定义标签实现类
- 编写 tld 标签库描述文件
- 在 JSP 页面中使用自定义标签
自定义标签的语法
使用 taglib 指令指定 tld 文件的路径。
<%@ taglib prefix="ex" uri="WEB-INF/custom.tld"%>
其中:prefix 指定自定义标签的前缀,uri 指定 tld 文件的路径。
使用自定义标签有以下 2 种格式:
<prefix:tagname attr1=value1....attrn=valuen />
或
<prefix:tagname attr1=value1....attrn=valuen >
标签体
</prefix:tagname>
其中:prefix 表示自定义标签的前缀,tagname 表示自定义标签的名称,attr 表示自定义标签的属性,value 表示自定义标签的属性值。
简单示例
下面创建一个简单的自定义标签 <ex:Hello>。
1. 创建处理标签的Java类
创建处理标签的 HelloTag 类,代码如下:
public class HelloTag extends SimpleTagSupport {
public void doTag() throws JspException, IOException {
JspWriter out = getJspContext().getOut();
out.println("Hello Tag!!!");
}
}
以上代码重写了doTag() 方法,getJspContext() 方法用来获取 JspContext 对象,并将 out.println 中的内容传递给 JspWriter 对象。
注意:SimpleTagSupport 实现了 SimpleTag 接口,该接口是 JSP 2.X 标签库新增的自定义标签接口类。该接口极其简单,提供了 doTag() 方法去处理自定义标签中的逻辑以及标签体。相对来说,JSP 1.X 比较复杂,处理标签的 Java 类需要继承 TagSupport 类,重写 doStartTag()、doAfterBody()、doEndTag() 等方法。
2. 创建tld标签库描述文件
tld 文件采用 XML 文件格式进行描述,后缀名为 .tld,用来将写好的类映射成 JSP 标签。tld 文件保存在 WEB-INF 目录下,为了管理方便,可以在目录下创建 tlds 文件夹。
custom.tld 代码如下:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE taglib
PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN"
"http://java.sun.com/j2ee/dtd/web-jsptaglibrary_1_2.dtd">
<taglib>
<!-- 标签库版本号 -->
<tlib-version>1.0</tlib-version>
<!-- JSP版本号 -->
<jsp-version>2.0</jsp-version>
<!-- 当前标签库的前缀 -->
<short-name>Example TLD</short-name>
<tag>
<!-- 自定义标签的名称,在页面中通过它来使用标签 -->
<name>Hello</name>
<!-- 自定义标签的实现类路径 -->
<tag-class>com.riotian.tag.HelloTag</tag-class>
<!-- 正文内容正文内容,没有则用 empty 表示 -->
<body-content>empty</body-content>
<!-- 自定义标签的功能描述 -->
<description>输出内容</description>
</tag>
</taglib>
tld 文件中只能有一对 taglib 标签,taglib 标签下可以有多个 tag 标签,每个 tag 标签代表一个自定义标签。
文章后面会对 tld 文件中的各个标签进行说明。
3. 使用自定义标签
使用自定义标签和使用 JSTL 标签是一样的, JSP 文件中使用 Hello 标签代码如下。
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" %>
<%@ taglib prefix="ex" uri="../WEB-INF/custom.tld" %>
<!DOCTYPE html>
<html>
<head>
<title>Tag.jsp</title>
</head>
<body>
<ex:Hello/>
</body>
</html>
</html>
运行结果如下:

tld标签库描述文件
tld 文件中常用的标签有 taglib、tag、attribute 和 variable。下面以 custom.tld 文件为例介绍其含义。
1. <taglib>标签
<taglib> 标签用来设置整个标签库信息,其说明如下表所示。
| 属 性 | 说 明 |
|---|---|
| tlib-version | 标签库版本号 |
| jsp-version | JSP版本号 |
| short-name | 当前标签库的前缀 |
| uri | 页面引用的自定义标签的 uri 地址 |
| name | 自定义标签名称 |
| tag-class | 自定义标签实现类路径 |
| description | 自定义标签的功能描述 |
| attribute | 自定义标签的指定属性,可以有多个 |
2. <tag>标签
<tag> 标签用来定义标签具体的内容,其说明如下表所示。
| 属 性 | 说 明 |
|---|---|
| name | 自定义标签名称 |
| tag-class | 自定义标签实现类 |
| body-content | 有 3 个值:empty(表示没有标签体)、JSP(表示标签体可以加入 JSP 程序代码)、tagdependent(表示标签体中的内容由标签自己处理) |
| description | 自定义标签的功能描述 |
| attribute | 自定义标签功能的指定属性,可以有多个 |
| variable | 自定义标签的变量属性 |
3. <attribute>标签
<attribute> 标签用来定义 <tag> 标签中的属性,其说明如下表所示。
| 属 性 | 说 明 |
|---|---|
| name | 属性名称 |
| description | 属性描述 |
| required | 指定属性是否是必须的,默认值:false |
| rtexprvalue | 属性值是否支持 JSP 表达式 |
| type | 定义该属性的 Java 类型,默认值:String |
| fragment | 如果声明了该属性,属性值将被视为一个 JspFragment |
使用 <attribute> 的属性时要注意元素顺序。
4. <variable> 标签
<variable> 标签用来定义 <tag> 标签中的变量属性,其说明如下表所示。
| 属 性 | 说 明 |
|---|---|
| declare | 变量声明 |
| description | 变量描述 |
| name-from-attribute | 指定的属性名称,其值为变量,在调用 JSP 页面时可以使用的名字 |
| name-given | 变量名(标签使用时的变量名) |
| scope | 变量的作用范围,有 3 个值:NESTED 开始和结束标签之间、AT_BEGIN 从开始标签到页面结束、AT_END 从结束标签之后到页面结束 |
| variable-class | 变量的 Java 类型,默认值:String |
自定义标签属性
在自定义标签中设置属性,自定义标签类中必须有相应的 setter 方法。为 bc:Hello 标签添加 message 属性,HelloTag 类代码如下:
public class HelloTag extends SimpleTagSupport {
private String message;
public void setMessage(String message) {
this.message = message;
}
StringWriter sw = new StringWriter();
public void doTag() throws JspException, IOException {
if (message != null) {
// 从属性中使用 message
JspWriter out = getJspContext().getOut();
out.println(message);
} else{
// 从内容中使用 message
getJspBody().invoke(sw);
getJspContext().getOut().println(sw.toString());
}
}
}
下面使用 <attribute> 标签为 <ex:Hello> 标签添加 message 属性:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE taglib
PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN"
"http://java.sun.com/j2ee/dtd/web-jsptaglibrary_1_2.dtd">
<taglib>
<!-- 标签库版本号 -->
<tlib-version>1.0</tlib-version>
<!-- JSP版本号 -->
<jsp-version>2.0</jsp-version>
<!-- 当前标签库的前缀 -->
<short-name>Example TLD</short-name>
<tag>
<!-- 自定义标签的名称,在页面中通过它来使用标签 -->
<name>Hello</name>
<!-- 自定义标签的实现类路径 -->
<tag-class>com.riotian.tag.HelloTag</tag-class>
<!-- 正文内容正文内容,没有则用 empty 表示 -->
<body-content>tagdependent</body-content>
<!-- 自定义标签的功能描述 -->
<attribute>
<name>message</name>
</attribute>
</tag>
</taglib>
这时就可以在 JSP 页面中使用 message 属性了,如下:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" %>
<%@ taglib prefix="ex" uri="../WEB-INF/custom.tld" %>
<!DOCTYPE html>
<html>
<head>
<title>Tag.jsp</title>
</head>
<body>
<ex:Hello message="Welcome to RioTian'blog..."/>
</body>
</html>
</html>

自定义标签的标签体
可以像 JSTL 标签库一样在标签中包含消息内容,如在 Hello 标签中包含内容,JSP 使用格式如下:
<ex:Hello>
Demo Demo Hello JSP Tap....
</ex:Hello>
修改 HelloTag 类,如下:
public class HelloTag extends SimpleTagSupport {
StringWriter sw = new StringWriter();
@Override
public void doTag() throws JspException, IOException {
getJspBody().invoke(sw);
getJspContext().getOut().println(sw.toString());
//super.doTag();
}
}
修改 custom.tld 文件,如下:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE taglib
PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN"
"http://java.sun.com/j2ee/dtd/web-jsptaglibrary_1_2.dtd">
<taglib>
<!-- 标签库版本号 -->
<tlib-version>1.0</tlib-version>
<!-- JSP版本号 -->
<jsp-version>2.0</jsp-version>
<!-- 当前标签库的前缀 -->
<short-name>Example TLD</short-name>
<tag>
<!-- 自定义标签的名称,在页面中通过它来使用标签 -->
<name>Hello</name>
<!-- 自定义标签的实现类路径 -->
<tag-class>com.riotian.tag.HelloTag</tag-class>
<!-- 正文内容正文内容,没有则用 empty 表示 -->
<body-content>tagdependent</body-content>
</tag>
</taglib>
运行结果如图所示。

JSP标准标签库(JSTL)个人使用指南的更多相关文章
- JSP 标准标签库(JSTL)
JSP 标准标签库(JSTL) JSP标准标签库(JSTL)是一个JSP标签集合,它封装了JSP应用的通用核心功能. JSTL支持通用的.结构化的任务,比如迭代,条件判断,XML文档操作,国际化标签, ...
- JSP标准标签库(JSTL)--JSTL简介与安装
对于MVC设计模式来讲,我们一直强调,在一个JSP钟scriptlet代码越少越好,但是只靠以前的概念很难实现,因为标签的开发特别麻烦,所以为了简化标签,也为了让标签更具备一些通用性,所以一般在开发中 ...
- JSP 标准标签库JSTL
JSP标准标签库(JSTL)是一个JSP标签集合,它封装了JSP应用的通用核心功能. JSTL支持通用的.结构化的任务,比如迭代,条件判断,XML文档操作,国际化标签,SQL标签. 除了这些,它还提供 ...
- JSP标准标签库JSTL
1.什么是JSTL? JSP标准标签库(JSP Standard Tag Library) 2.JSTL标准标签库中的常用标签 JSTL是JSP页面的标签库,实质上是一段Java代码.我们常用的是它的 ...
- jsp标准标签库——jstl
JSP标准标签库(JSTL)是一个JSP标签集合,它封装了JSP应用的通用核心功能. JSTL支持通用的.结构化的任务,比如迭代,条件判断,XML文档操作,国际化标签,SQL标签. 除了这些,它还提供 ...
- JSP标准标签库(JSTL)--XML标签库 x
³在开发中XML解析的操作是非常烦琐的,幸运的是在JSTL中专门提供了用于XML解析的操作,这样用户就可以不用费力的去研究SAX或DOM等操作的使用,就可以轻松的进行XML文件的解析处理. XML标 ...
- JSP标准标签库(JSTL)--SQL标签库 sql
了解即可.SQL标签库 No. 功能分类 标签名称 描述 1 数据源标签 <sql:setDataSource> 设置要使用的数据源名称 2 数据库操作标签 <sql:query&g ...
- JSP标准标签库(JSTL)--核心标签库 c
核心标签库是JSTL中最重要的部分,可以完成输出,判断,迭代等操作 功能分类: 1. 基本标签: <c:out>:输出属性内容 <c:set>:设置属性内容 <c:rem ...
- JSP标准标签库(JSTL)--国际化标签库 fmt
JSTL中使用fmt.tld作为格式化标签库的定义文件 No. 功能分类 标签名称 描述 1 国际化标签 <fmt:setLocale> 设置一个全局的地区代码 2 <fmt:req ...
- JSP标准标签库(JSTL)--函数标签库 fn
和String的方法类似,就是对String的一种封装. No. 函数标签名称 描述 1 ${fn:contains()} 查询某字符串是否存在,区分大小写 2 ${fn:containsIgnore ...
随机推荐
- .net core下优秀的日志框架使用解析,附源代码
在 .NET Core 中,日志是一个非常重要的组件,它可以帮助我们记录应用程序的运行情况,以便在出现问题时进行排查.在本文中,我们将介绍五个优秀的 .NET Core 日志框架,它们分别是 Seri ...
- java-图片添加水印
前言: 需求:需要在图片中添加水印,防止盗用 优缺点: 优点:保护版权,防止盗用 缺点 可能会影响图片的视觉效果:如果水印过大或过醒目,可能会影响图片的视觉效果. 可能会增加 ...
- Aignize第一期完善产品逻辑+类图说明书
Aiganize产品说明+拟类图(第一期) ·附图: 此应用由: 前端:微信小程序前端+vue3后台管理系统后端:Springboot+Mysql 服务器:后端服务器+AI交互服务器 整个应用流程大致 ...
- 快速认识,前端必学编程语言:JavaScript
JavaScript是构建Web应用必学的一门编程语言,也是最受开发者欢迎的热门语言之一.所以,如果您还不知道JavaScript的用处.特点的话,赶紧补充一下这块基础知识. JavaScript 是 ...
- 生物电势测量ECG
参考来源:ADI官网技术文章.知乎(hxl695822705.KingPo-张超.津发科技.木森.深圳加1健康科技) ECG的产生 ECG(Electrocardiogram)心电测量,是指人体内窦房 ...
- [ABC299F] Square Subsequence
Problem Statement You are given a string $S$ consisting of lowercase English letters. Print the numb ...
- [ABC261G] Replace
Problem Statement You are given two strings \(S\) and \(T\) consisting of lowercase English letters. ...
- 2023第八届上海市大学生网络安全大赛-磐石行动(misc+crypto) WP
Crypto bird 题目 docx文档出现: 我的解答: 使用在线工具即可:https://www.dcode.fr/birds-on-a-wire-cipher flag{birdislovel ...
- idea用不了 idea.bat文件闪退
由于idea的智能,在破解之后会留下一些问题,根据网上搜出来的解决办法. 1.C:\Users\dell\AppData\Roaming\JetBrains\IntelliJIdea2022.2 在这 ...
- Alpha-Beta剪枝的原理的深入理解(无图预警)
转载请注明 原文链接 :https://www.cnblogs.com/Multya/p/17929261.html 考虑一个树: 一棵树上只有叶子节点有值,有确定的根节点的位置 根据层数来划分叶子节 ...