去下了JSP设计(第3版)(O'Reilly)的例子,解压以后里面有两个文件夹,ora和src,
然后把它们放到tomcat里面面的webapp下,在D:\Tomcat 5.0\webapps\ora\WEB-INF\tags\mytags下为什么有.tag文件怎么以前从来没看到过啊?
还有一个问题就是下面这个jsp文件,路径在D:\Tomcat 5.0\webapps\ora\ch7
**************************************************************
Example 7-1. Custom tag library declaration (message.jsp)
<%@ page contentType="text/html" %>
<%@ taglib prefix="ora" uri="orataglib" %>
<html>
<head>
<title>Messages of the Day</title>
</head>
<body bgcolor="white">
<h1>Messages of the Day</h1>
<h2>Deep Thoughts - by Jack Handey</h2>
<i>
<ora:motd category="thoughts" />
</i>
<h2>Quotes From the Famous and the Unknown</h2>
<i>
<ora:motd category="quotes" />
</i>
</body>
</html>而.tld文件却在D:\Tomcat 5.0\webapps\src\tld下。。以前看到的关于tld文件不是都应该放在
WEB-INF下吗?为什么现在可以摆在这里?在D:\Tomcat 5.0\webapps\ora\WEB-INF的路径下的mytags.tld里面根本就找不到上面这个jsp文件里 <%@ taglib prefix="ora" uri="orataglib" %>
对uri="orataglib"的映射面在D:\Tomcat 5.0\webapps\src\tld下的taglib.tld里才找到映射。。这到底是怎么回事呢?大家谁能帮我搞清楚里面的关系?
然后把它们放到tomcat里面面的webapp下,在D:\Tomcat 5.0\webapps\ora\WEB-INF\tags\mytags下为什么有.tag文件怎么以前从来没看到过啊?
还有一个问题就是下面这个jsp文件,路径在D:\Tomcat 5.0\webapps\ora\ch7
**************************************************************
Example 7-1. Custom tag library declaration (message.jsp)
<%@ page contentType="text/html" %>
<%@ taglib prefix="ora" uri="orataglib" %>
<html>
<head>
<title>Messages of the Day</title>
</head>
<body bgcolor="white">
<h1>Messages of the Day</h1>
<h2>Deep Thoughts - by Jack Handey</h2>
<i>
<ora:motd category="thoughts" />
</i>
<h2>Quotes From the Famous and the Unknown</h2>
<i>
<ora:motd category="quotes" />
</i>
</body>
</html>而.tld文件却在D:\Tomcat 5.0\webapps\src\tld下。。以前看到的关于tld文件不是都应该放在
WEB-INF下吗?为什么现在可以摆在这里?在D:\Tomcat 5.0\webapps\ora\WEB-INF的路径下的mytags.tld里面根本就找不到上面这个jsp文件里 <%@ taglib prefix="ora" uri="orataglib" %>
对uri="orataglib"的映射面在D:\Tomcat 5.0\webapps\src\tld下的taglib.tld里才找到映射。。这到底是怎么回事呢?大家谁能帮我搞清楚里面的关系?
ant会将src下的*.tld拷贝到你说的WEB-INF下
是指由在JSP页面中使用的标记所组成的库。
JSP容器推出时带有一个小型的、默认的标记库。
当JSP 标准标记库(Standard Tag Library,JSTL)还未满足到项目需要时,就要自已封装自己的taglib
而自定义标记库是人们为了某种特定的用途或者目的,
将一些标记放到一起而形成的一种库。
在一个团队中协同工作的开发者们可能会为各自的项目创建一些非常特定化的自定义标记库,
同时也会创建一个通用自定义标记库,以供当前使用。
JSP 标记替代了scriptlet,
并缓解了由scriptlet所招致的所有令人头痛的事情。
例如,您可以看到这样的标记:
<ito:sayHello name="david"/>或者这样的标记:
<ito:sayHelloToEveryBody/>
原理
一个tag就是一个普通的java类,
它唯一特别之处是它必须继承TagSupport或者BodyTagSupport类。
这两个类提供了一些方法,负责jsp页面和你编写的类之间的交互,例如输入,输出。
而这两个类是由jsp容器提供的,无须开发人员自己实现。
换句话说,你只需把实现了业务逻辑的类继承
TagSupport或者BodyTagSupport,
再做一些特别的工作,你的类就是一个Tag。
并且它自己负责和jsp页面的交互,不用你多操心。
现在以demo为例子:制作一个say hello的taglib,以实现这样一个功能
<ito:sayHello name="david"/>
显示为hello david!实现行为,编写java类
package demo;import javax.servlet.jsp.tagext.BodyTagSupport;
import javax.servlet.jsp.JspWriter;public class SayHello extends BodyTagSupport
{
private String name ; public String getName()
{
return name;
} public void setName(String name)
{
this.name = name;
} public int doStartTag()
{
try
{
JspWriter out = pageContext.getOut();
out.print("hello "+name +"!");
}
catch (Exception e)
{ }
return SKIP_BODY;
} public int doEndTag(){
return EVAL_PAGE;
}
}说明 Tag Extension API 中提供了两种类型的标记管理器:
Simple Tag Handler 和 Tag Handler that want access to the body content
(简单标记管理器和可以访问其主体内容的标记管理器).
这里仅用到第一类,
即简单标记管理器。
这类标记管理器不能操纵它的主体内容(body content,即在标记之间的内容)。
本例中我们并不需要操纵标记间的内容。这里使用的两个标记管理器都继承自TagSupport类。
TagSupport类实现了Tag 和 IterationTag两个接口。
有必要介绍一下它的几个主要的、由容器管理的方法:doStartTag():
在标记开始处由容器调用,返回值将决定是否对body content计值。返回值为Tag.EVAL_BODY_INCLUDE时计值,为Tag.SKIP_BODY时忽略body content。(所谓对body content计值,就是将body content写入输出流中输出;body content,即标记之间的内容);
doAfterBody():
当doStartTag()方法调用完毕并且返回Tag.EVAL_BODY_INCLUDE时,将对该标记的body content进行计值处理。
计值完以后,将由容器调用该方法。因为只有对body content计值,才可能触发"after body"这一事件;
doEndTag():
当doStartTag()方法调用完毕并且返回Tag.SKIP_BODY时或者doAfterBody()方法调用完毕并且返回IterationTag.SKIP_BODY时调用,一般在该方法中输出结果,即将结果写入JspWriter输出流中输出;该方法可以返回Tag.SKIP_PAGE或者Tag.EVAL_PAGE。前者不再对该标记以后的页面计值,后者继续对该标记以后的页面计值; getParent():
获得最近的、包围了自己的一个标记管理器实例。即自己在该标记管理器实例的body content 中。本例中GoodsDetailTag实例将调用getParent()来获得GoodsHeaderTag的一个实例。 setters方法:
设置Tag属性的方法,当Tag Handler实例化时由容器调用,从而获取JSP页面中的参数。创建TLD sayHello.tld <?xml version="1.0" encoding="ISO-8859-1" ?>
<taglib>
<tlib-version>1.0</tlib-version>
<jsp-version>1.2</jsp-version>
<short-name>ito</short-name>
<uri>ito</uri>
<description>
Itorgan Tag Library Descriptor
</description><tag>
<name>sayHello</name>
<tag-class>demo.SayHello</tag-class>
<body-content>JSP</body-content>
<description>sayHello tag</description> <attribute>
<name>name</name>
<required>true</required>
</attribute>
</tag></taglib>说明:
WEB-INF/xxxx.tld
注意:需要在tld文件里定义:tlibversion Tag library的版本jspversion 这个Tag library要求的JSP版本shortname 缺省的名字。
uri 这个Tag library的URLinfo Tag library的使用信息tag 自定义的tagname 自定义的tag的名字tagclass 处理这个tag的java类的名字.不同的tag可能对应不同的java类来处理。Teiclass bodycontent 标出属性值的类型,如果没有标识,隐含为JSPJSP interpreted by pageEMPTY no body allowedTAGDEPENDENT interpreted by tag需要BodyTag BodyTag can post-process JSPinfo 这个tag的使用信息attribute 属性。 每个tag可以有n个属性
<attribute>里的name:
属性名字。
例如<c:out value=""/>里的value。
名字可任意取,只要类里提供相应的set方法即可。 required:是否必填属性。 rtexprvalue:是否支持运行时表达式取值。
这是tag的强大功能。暂时设为false
web.xml配置加上 <taglib>
<taglib-uri>ito</taglib-uri>
<taglib-location>/WEB-INF/sayHello.tld</taglib-location>
</taglib>页面中调用
<%@page contentType="text/html;charset=GBK"%>
<%@ taglib prefix="ito" uri="ito"%>
<html><body>
<ito:sayHello name="david"/>
</body>
</html>