JSTL(JSP标准标签库) 是一套基于JSP的标准标签库,可以用它来控制JSP页面中的流程、 格式化数字和日期和国际化,另外还有一些实用的EL函数。.
JSTL还提供了SQL和XML标签,来在JSP中执行SQL和解析XML,但在实际使用当中不建议在JSP中使用这些功能,这些功能一般应该在一个真正的Java类和Servlet中来做。
JSTL是Java EE的一部分,并已经包含在了大多数 (但不是所有) servlet容器中。通过 http://java.sun.som/jsp/jstl/*
可以引入JSTL标签. 请不要将JSTL标签和自定义JSP标签(你自己在 .tld
文件中定义的)搞混了. JSTL 和其他第三方标签也不一样,例如 JSF、 Spring MVC、 Struts、 Displaytag、 etcetera、 JSTL.。更别和EL表达式混淆。
JSTL版本
JSTL 有以下几种不同的版本:
-
1.0: 由
jstl.jar
(API接口)和standard.jar
(实现)两个文件组成. 标签引入的URI中不包含/jsp
,例如http://java.sun.com/jstl/core
,原型版本中还带有名称后缀_rt
,例如
http://java.sun.com/jstl/core_rt。
必须运行在 Servlet 2.3 / JSP 1.2上。这个版本已经快要终结,不推荐继续使用了。 -
1.1: 和1.0的文件组成是一样的. 但是标签引入的URL包含了
/jsp
,例如http://java.sun.com/jsp/jstl/core
. 运行在 Servlet 2.4 / JSP 2.0规范上。 -
1.2: 只有
jstl-1.2.jar
(API接口+实现)一个jar文件。引入标签URL和1.1相同。运行在Servlet 2.5 / JSP 2.1规范上,但是也兼容Servlet 2.4 / JSP 2.0 规范。 -
1.2.1: 由
javax.servlet.jsp.jstl-api-1.2.1
(API接口) andjavax.servlet.jsp.jstl-1.2.1.jar
(实现) 两个jar文件组成,引入标签URL和1.1相同。运行在Servlet 3.0 / JSP 2.2 规范上,同时兼容Servlet 2.5 / JSP 2.1 和 Servlet 2.4 / JSP 2.0。 -
Facelets: 它是JSP接班人, 包含部分JSTL 1.2 核心标签和全部的JSTL 1.2 函数。需要JSTL 1.2. For Facelets 1.x the XML namespace URI is
http://java.sun.com/jstl/core
and for Facelets 2.x the XML namespace URI ishttp://java.sun.com/jsp/jstl/core
with (confusingly!) the/jsp
part and from Facelets 2.2 onwards the namespace URI ishttp://xmlns.jcp.org/jsp/jstl/core
.
大多数但不是全部的servlet容器内置了JSTL, 例如Apache Tomcat 就不包含JSTL, 但Oracle的Glassfish就包含了。 你可以通过查看jar文件中的MANIFEST.MF
文件来确定其准确版本。
安装JSTL
非常简单:
-
仅仅当你的servlet容器不包含JSTL的时候(例如Tomcat)才需要安装,直接将jar文件放到
Webapp/WEB-INF/lib
中即可。 -
使用正确的TLD URI定义标签。 例如:
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
如果你使用的是Facelets或者JSPX,应该使用XML命名空间的方式来声明:
<anyxmlelement xmlns:c="http://java.sun.com/jsp/jstl/core">
为了避免冲突,你需要确保在classpath中美有重复的旧的JSTL版本(包括JRE/lib
和 Appserver/lib
)。如果你对服务器拥有管理员级别权限, 那么你应该讲jar文件放到 Appserver/lib
中,而不是Webapp/WEB-INF/lib
下面,因为这样其他部署在webapps中的应用就都能使用它了。
摘选自http://stackoverflow.com/tags/jstl/info
总结:
当碰到类似找不到javax.servlet.jsp.jstl.core.LoopTag类定义的问题时,说明你的运行的tomcat下没有包含jstl api了。根据不同的版本的jstl,应该将对应的文件放到tomcat_home/lib下。要想正常使用jstl,光有api还不行,还得有对应的实现,而有时这两个文件都在一起,比如jstl 1.2。