我在这里阅读了有关JSTL标签的信息:
https://stackoverflow.com/tags/jstl/info
有一点我真的不明白......
当你引用这里的一些文件时:
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
或在这里:
<html xmlns:c="http://java.sun.com/jsp/jstl/core">
该文件何时实际读取?这个文件实际上是从网络读取的吗?如果该文件实际上是从网络中读取的,那么如何在没有外部网络访问(没有Internet)的高度安全的环境中进行开发/测试?
这个文件(这些文件)可以一次读取并保存在本地然后在本地引用吗?
如果我尝试打开该网页或执行 wget http://java.sun.com/jsp/jstl/core ,我显然会看到一些人类应该阅读的东西,而不是webapp服务器。
答案 0 :(得分:2)
当servletcontainer启动时,它会扫描整个类路径以查找任何.tld
文件,包括所有已部署JAR文件的/META-INF
文件夹。 JSTL JAR文件包含c.tld
文件,其开头如下:
<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">
<description>JSTL 1.1 core library</description>
<display-name>JSTL core</display-name>
<tlib-version>1.1</tlib-version>
<short-name>c</short-name>
<uri>http://java.sun.com/jsp/jstl/core</uri>
...
请注意<uri>
条目。这在servletcontainer的启动过程中被解析和记住。 .tld
文件为每个标记声明标记处理程序类,它表示执行“幕后”所有工作的具体Java代码。例如,<c:out>
声明如下:
<tag>
<description>
Like <%= ... >, but for expressions.
</description>
<name>out</name>
<tag-class>org.apache.taglibs.standard.tag.rt.core.OutTag</tag-class>
<body-content>JSP</body-content>
...
现在,当一个JSP文件声明一个完全具有此URI的taglib时,将使用相关的.tld
文件来定位标记类并执行它们。
因此,taglib URI只是一个虚拟地址,它只存在于servletcontainer的上下文中而不存在于外部,即使某些taglib碰巧在该URI后面有一个真正的HTTP站点。 URI只是一个唯一的标识符。它不一定需要http://something
。它可以是一切,但网站地址是一个相对健壮的唯一标识符。这几乎可以保证100%没有其他taglib具有相同的URI。顺便提一下,你也会在包名中看到这种独特性。