JSP中的TagLib应用(4)--zt

js

JSP中的TagLib应用(4)

作者:False / aspcn

----------------------------------------------------------------------

下面到了关键部分乐。 对tag进行处理。其实很多情况下我们是使用已经提供的taglib.

别人/公司已经做好了tag和处理部分,打好了包 我们需要做的只是在我们的jsp中去应用.

但是当我们自己做个taglib时, 就需要编写这部分tag handler了.

这里只针对上面文件里提到的insert tag,其他的为了避免重复,就不一一说明了

==================== InsertTag.java==============================
/*

* $Id: InsertTag.java,v 1.13 2000/03/04 02:54:57 brydon Exp $

* Copyright 1999 Sun Microsystems, Inc. All rights reserved.

* Copyright 1999 Sun Microsystems, Inc. Tous droits réservés.

*/

package com.sun.estore.taglib;

import javax.servlet.jsp.JspTagException;

import javax.servlet.jsp.tagext.TagSupport;

import com.sun.estore.util.Debug;

/**

* This class is an easy interface to the JSP template or other

* text that needs to be inserted.

* @author Greg Murray

*/

public class InsertTag extends TagSupport {

private boolean directInclude = false;

private String parameter = null;

private String templateName = null;

private Template template = null;

private TemplateParameter templateParam = null;

/**

* default constructor

*/

public InsertTag() {

super();

}

public void setTemplate(String templateName){

this.templateName = templateName;

}

public void setParameter(String parameter){

this.parameter = parameter;

}

public int doStartTag() {

try{

if (templateName != null){

template = (Template)pageContext.getRequest().getAttribute("template");

}

} catch (NullPointerException e){

Debug.println("Error extracting template from session: " + e);

}

if (parameter != null && template != null) templateParam = (TemplateParameter)template.getParam(parameter);

if (templateParam != null) directInclude = templateParam.isDirect();

return SKIP_BODY;

}

public int doEndTag() throws JspTagException {

try{

pageContext.getOut().flush();

} catch (Exception e){

// do nothing

}

try {

if (directInclude && templateParam != null) {

pageContext.getOut().println(templateParam.getValue());

} else if (templateParam != null) {

if (templateParam.getValue() != null) pageContext.getRequest().getRequestDispatcher(templateParam.getValue()).include(pageContext.getRequest(), pageContext.getResponse());

}

} catch (Throwable ex) {

ex.printStackTrace();

}

return EVAL_PAGE;

}

}
可以看到。InsertTag.java继承了javax.servlet.jsp.tagext.TagSupport类. 因为在TagSupport中定义了一些接口.
  我们在处理自定义的tag时, 对父类的doStartTag() 和doEndTag() 要进行重载,如果在tld文件中定义了tag的属性, 就需要在tag handler里对每个属性定义相应的setxxx/getxxx方法.

在doStartTag()中是从Template类所定义的Hashtable中取得TemplateParameter对象.

在doEndTag()中

pageContext.getRequest().getRequestDispatcher(templateParam.getValue()).include(pageContext.getRequest(), pageContext.getResponse());

这是在页面里包含通过jsp页的上下文返回通过tag的属性值指定的资源对象(RequestDispatcher)所产生的内容..

doStartTag()和doEndTag()返回值是在Tag Interface里定义的静态int

SKIP_BODY隐含0

Skip body evaluation. Valid return value for doStartTag and doAfterBody. 跳过对body的处理。

就是跳过了开始和结束标签之间的代码。

EVAL_BODY_INCLUDE 隐含1

Evaluate body into existing out stream. Valid return value for doStartTag.

This is an illegal return value for doStartTag when the class implements BodyTag,

since BodyTag implies the creation of a new BodyContent.

将body的内容输出到存在的输出流中。包括是jsp代码,也可以被输出

SKIP_PAGE 隐含5

Skip the rest of the page. Valid return value for doEndTag.

忽略剩下的页面。

EVAL_PAGE 隐含6

Continue evaluating the page. Valid return value for doEndTag().

继续执行下面的页

在这个类里还有对其他类的引用,我就不列出来了. 各位可以自己去研究.

自定义标签(Custom tags)实现了 javax.servlet.jsp.tagext.Tag or javax.servlet.jsp.tagext.BodyTag

interface. 应用javax.servlet.jsp.JspWriter 来输出.

TagSupport class 提供了对interface Tag的隐含实现. 序列化编发数据.

public class TagSupport extends java.lang.Object implements Tag, java.io.Serializable

BodyTagSupport class提供了对interface BodyTag的隐含实现.继承TagSupport

public class BodyTagSupport extendsTagSupport implements BodyTag

我们在编写tag handler时需要继承TagSupport类或BodyTagSupport类,然后重载doStartTag()和doEndTag().

还可以再进一步分离.将具体实现放到bean里

这些自定义标签的类所应放的位置应该在WEB-INF/classes或WEB-INF/lib

最后将custom tag libraries 打包成.war文件.关于.war文件,如下图所示给出了资源结构图。

通过部署描述符来控制映射。

部署描述符是个XML文件。详细的请详见有关文档资料。这里只说明

部署TagLib的部分。

JSP custom tag libraries (optional)

Specifies URL for locating Tag Library Descriptor

uri

path

/**************自定义TagLib例子: JSP page *******************

………

*******************************************************/

文件位置如下:

这个例子很简单, 只是作为练习使用.你也可以自己进行扩展,多练习几种处理方法.比方说标签带有属性,

标签带有内容, 使用bean处理逻辑等等

关于将这些文件打包成.war文件.这里就不详细说明了.请根据你使用的application server情况自己完成吧. 

时间: 2024-09-17 03:54:07

JSP中的TagLib应用(4)--zt的相关文章

JSP中的TagLib应用(3)--zt

js JSP中的TagLib应用(3) 自定义tag位置 WEB-INF/tlds/xxxx.tld 注意:需要在tld文件里定义: tlibversion--------Tag library的版本 jspversion--------这个Tag library要求的JSP版本. shortname-------缺省的名字.(这个例子里没有定义) uri-------------------这个Tag library的URL info-----------------Tag library的使

JSP中的TagLib应用(2)--zt

js JSP中的TagLib应用(2) 2.开始 现在让我们逐步深入的了解xml在jsp中的应用吧. 首先需要定义tld文件和相应tag处理的java类文件.然后在jsp通过定义的语法使用tag, 让我们来看看下面这个XML文件. ==================taglib.tld=========================== PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.1//EN" "htt

JSP中的TagLib应用(1)--zt

js JSP中的TagLib应用(1) 作者:False / aspcn '################################################# '备注:本文所描述的任何代码未经"大风"验证(没时间) '发于此主要是提供给大家一种参考和思维,如果有任何问题 '请发文于JSP版,或者通过Email联系False(嘿嘿): 'E-Mail: False@263.net '在发表此文的时候发现排版错误,不过你可以下载全文 下载,对不起大家了,也算是对不起Fals

jsp中自定义Taglib详解_JSP编程

一.自定义标签入门之无参数自定义标签 1.开发自定义标签类 当我们在JSP页面使用一个简单的标签时,底层实际上由标签处理类提供支持,从而可以使用简单的标签来封装复杂的功能,从而使团队更好地协作开发(能让美工人员更好地参与JSP页面的开发). 自定义标签类都必须继承一个父类:javax.servlet.jsp.tagext.SimpleTagSupport,或者TagSupport除此之外,JSP自定义标签类还有如下要求. 如果标签类包含属性,每个属性都有对应的getter和setter方法. 重

jsp中如何去除JSTL标签库“include, taglib”等留下的空白行

在做项目的时候,经常会使用到JSTL和EL表达式,有时我们需要看下页面生成的源代码,但是当jsp中充满了jstl的各种标签,页面就会存在很多的空白部分,有时太多了会让浏览器假死掉,这是我们就想要去掉这些空白的部分了.去掉的方法很多,下面一一列举出来. 我的开发及服务器环境:Windows7 + Eclipse2014 + Tomcat7.0 + JDK 1.7.0 经过多番测试,可用的方法有: 1.在每个JSP的头上加上一段代码   <%@ page trimDirectiveWhitespac

JSP中早就有了类似.Net DataSet那样的离线数据访问

js|访问|数据 JSP中早就有了类似.Net DataSet那样的离线数据访问了,抛弃ResultSet,拥抱Result吧! 微软的.NET平台上面的数据访问有一个特点,就是数据查询的结果,可以放在内存中,以XML格式进行描述,不需要一直与数据库保持在线连接,用DataSet + Data Adapter来实现! 而在JDBC中,我们通常使用javax.sql.ResultSet类来存放放回的数据,它的流程和生命周期如下: 使用ResultSet来返回数据库查询结果 Client --> C

JSP中自定义标记符的使用

js 摘要 在JSP中有一种机制,可以让你在JSP页面中插入与HTML类似的标记.本文介绍JSP定制标记的基本概念和构成,以及如何开发和应用JSP定制标记.  关键字JSP,XML,TLD,标记符 什么是标记使用HTML语言我们可以这样去编辑我们的网页:    <HTML> <HEAD> <TITLE>  HELLO  WORLD </TITLE>         </HEAD>         <BODY> HELLO WORLD

JSP中标签库的深入研究

js 标签库Taglib 标签被定义和分布在一个称为标签库的结构中,一个标签库是由元信息和类组成的集合:1.标签处理器:实现定制标签功能的Java类.2.标签附加信息(TEI):向JSP容器提供边辑以确认标签属性和创建变量的类.3.标签库描述器(TLD):描述单个标签和整个标签库属性的XML文档. 标签处理器和标签附加信息需要定位在JSP容器类载入器可以找到的地方.标签库描述器可在URL指定的符意位置.JSP1.1规范要求JSP容器接受一个打包成因定结构的JAR文件的标签库.TLD必须是/MET

关于jsp中使用jstl的问题

今天在jsp中使用jstl标签库的时候,出现了一个很恶心的问题,我记得自己几年前在学校学这门课的时候,没遇到过这种问题的啊,现在突然出现,确实恶心了我一把. 一般稍不小心就会出现下面的错误: the absolute uri:http://java.sun.com/jstl/core cannot be resolved.一个例子如:http://stackoverflow.com/questions/4928271/jstl-1-2-the-absolute-uri-http-java-sun