什么时候实际读取JSTL XML文件?

时间:2012-03-11 03:12:27

标签: java web-applications jstl

我在这里阅读了有关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服务器。

1 个答案:

答案 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 &lt;%= ... &gt;, 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。顺便提一下,你也会在包名中看到这种独特性。