`

jsp标签编程『续』---简单开发

阅读更多

   在jsp1.2之前如果想要对标签库进行开发,要么继承TagSupport类,要么继承BodyTagSupport类,而且必须覆写其中的doStartTag(),doAfterBody(),doEndTag()方法,而且还必须清楚这些方法的返回值类型;这样的过程太复杂了,到了JSP2.0后,简化标签的开发,专门增加了一个制作简单的标签库SimpleTagSupport类。直接覆写其中的doTag()方法即可;

SimpleTagSupport类的定义如下:

public class TagSupport extends Object implements SimpleTag

 此类实现了SimpleTag接口,SimpleTag接口如下:

public interface SimpleTag extends JspTag{
   public void doTag() throws JspException,IOException;
   public void setParent(JspTag parent);
   public JspTag getParent();
   public void setJspContext(JspContext pc);
   public void setJspBody(JspFragment jspBody);
}

  SimpleTagSupport类的主要方法:

No 方法 类型 描述
1 public void doTag() throws JspException,IOException 普通 完成具体标签功能的编写
2 public JspContext getJspContext() 普通 取得JSP上下文,主要用于输出
3 protected JspFragment getJspBody() 普通 取得JspFragment对象,主要用于迭代输出

SimpleDateTag:

package com.keith.tag;

import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;

import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.SimpleTagSupport;

public class SimpleDateTag extends SimpleTagSupport {
	//接受格式化数据
	private String format;

	@Override
	public void doTag() throws JspException, IOException {
		//日期格式化
		SimpleDateFormat sdf = new SimpleDateFormat(this.format);
		try {
			//输出格式化后的日期
			super.getJspContext().getOut().write(sdf.format(new Date()));
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	public String getFormat() {
		return format;
	}

	public void setFormat(String format) {
		this.format = format;
	}

}

 simpledatetag.tld:

<?xml version="1.0" encoding="UTF-8"?>
<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">

	<tlib-version>1.0</tlib-version>

	<short-name>simpledatetag</short-name>
	<tag>

 		<name>simpledate</name>

 		<tag-class>com.keith.tag.SimpleDateTag</tag-class>

 		<body-content>empty</body-content>
 		<attribute>

 			<name>format</name>

 			<required>true</required>

 			<rtexprvalue>true</rtexprvalue>
 		</attribute>
	</tag>
</taglib>

 index.jsp:

<%@ taglib prefix="simpledatetag" uri="simpledate"%>

  <body>
  	<simpledatetag:simpledate format="yyyy-MM-dd HH:mm:ss.SSS"/>
  </body>

 测试看下结果!

要是面对迭代问题呢?在以前,是通过TagSupport类实现的迭代操作,则可以通过控制返回值的方式,让程序循环执行doAfterBody()方法,但先在通过SimpleTagSupport类实现的doTag()方法,本身没有返回值,如果想达到循环的效果,就必须通过JspFragment类完成控制。

   在SimpleTagSupport类中存在一个getJspBody()方法,此方法返回的就是一个Fragment对象,利用此对象的invoke()方法即可完成标签体内容的输出;

SimpleIterateTag:

package com.keith.tag;

import java.io.IOException;
import java.util.Iterator;
import java.util.List;

import javax.servlet.jsp.JspException;
import javax.servlet.jsp.PageContext;
import javax.servlet.jsp.tagext.SimpleTagSupport;

public class SimpleIterateTag extends SimpleTagSupport {
	private String id;
	private String name;
	private String scope;

	@Override
	public void doTag() throws JspException, IOException {
		Object value = null;
		// 是否是page范围
		if ("page".equals(this.scope)) {
			value = super.getJspContext().getAttribute(name,
					PageContext.PAGE_SCOPE);
		} else if ("request".equals(this.scope)) {
			// 是否是request范围
			value = super.getJspContext().getAttribute(name,
					PageContext.REQUEST_SCOPE);
		} else if ("session".equals(this.scope)) {
			// 是否是session范围
			value = super.getJspContext().getAttribute(name,
					PageContext.SESSION_SCOPE);
		} else {
			// 是否是application范围
			value = super.getJspContext().getAttribute(name,
					PageContext.APPLICATION_SCOPE);
		}

		// 如果是List接口的实例
		if (value != null && value instanceof List<?>) {
			Iterator<?> iter = ((List<?>) value).iterator();
			while (iter.hasNext()) {
				super.getJspContext().setAttribute(id, iter.next());
				super.getJspBody().invoke(null);
			}
		}
	}

	public String getId() {
		return id;
	}

	public void setId(String id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getScope() {
		return scope;
	}

	public void setScope(String scope) {
		this.scope = scope;
	}

}

 simpleiteratetag.tld:

<?xml version="1.0" encoding="UTF-8"?>
<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">
   
    <tlib-version>1.0</tlib-version>
   
    <short-name>simpleiteratetag</short-name>
    <tag>

         <name>iterate</name>

         <tag-class>com.keith.tag.SimpleIterateTag</tag-class>
        <!--
        标签体内容,
            scriptless:表示标签体内容可以是文本,EL,JSP语法.不能包含JSP的脚本元素;
            empty:没有标签体;
            JSP:标签体可以包含文本,EL,或JSP标签,但是对于简单标签无效;
            tagdependent:表示标签体交由标签本身去解析处理,在标签体中的所有代码都会原封不动的交给标签处理器,而不是将执行结果传递给标签处理器;
        -->
         <body-content>scriptless</body-content>
         <attribute>

             <name>id</name>

             <required>true</required>

             <rtexprvalue>true</rtexprvalue>
         </attribute>

         <attribute>

             <name>name</name>

             <required>true</required>

             <rtexprvalue>true</rtexprvalue>
         </attribute>
        
         <attribute>

             <name>scope</name>

             <required>true</required>

             <rtexprvalue>true</rtexprvalue>
         </attribute>
    </tag>
</taglib>

 web.xml:

  <taglib>
  		<taglib-uri>simpleiterate</taglib-uri>
  		<taglib-location>/WEB-INF/simpleiteratetag.tld</taglib-location>
  </taglib>

 index.jsp:

<%@ taglib prefix="simpleiteratetag" uri="simpleiterate"%>

  <body>
	<%
		List<String> all = new ArrayList<String>();
		all.add("Java");
		all.add("C");
		all.add("Linux");
		request.setAttribute("all",all);
	 %>
	 <simpleiteratetag:iterate name="all" scope="request" id="names">
	 	${names }<br />
	 </simpleiteratetag:iterate>
  </body>

访问页面进行测试!

 DynamicAttributes接口:

每一个标签都可以定义属性,当使用一个标签时,只能编写指定个数及名称属性。在JSP2.0之后专门增加了一个DynamicAttribute接口,此接口的主要功能是用于完成动态属性的设置,即用户在使用一个标签时可以根据自己的需要,任意设置多个属性。

DynamicAttributes接口的定义如下:

public interface DynamicAttribute{
   public void setDynamicAttribute(String uri,String localName,Object value)throws JspException;
}

 在这个接口里,只定义了一个setDynamicAttribute()方法,在此方法中秩序关心localName(表示动态设置的属性名词)和value(动态设置的属性内容)这2个参数!

下面使用动态属性完成一个动态加法操作,用户可以直接在加法的标签中设置任意多个参数,并通过标签将计算的结果输出:

DynamicAddTag:

package com.keith.tag;

import java.io.IOException;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;

import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.DynamicAttributes;
import javax.servlet.jsp.tagext.SimpleTagSupport;

public class DynamicAddTag extends SimpleTagSupport implements DynamicAttributes{
	
	//实现动态属性接口
	private Map<String,Float> num = new HashMap<String,Float>();
	
	@Override
	public void doTag() throws JspException, IOException {
		//定义变量保存相加的结果
		Float sum = 0.0f;
		//迭代输出
		Iterator<Map.Entry<String,Float>> iter = this.num.entrySet().iterator();
		
		while (iter.hasNext()) {
			//取出每一个Map.Entry
			Map.Entry<String, Float> value = iter.next();
			//执行累加操作
			sum += value.getValue();
		}
		//输出计算的结果
		super.getJspContext().getOut().write(sum+"");
	}


	public void setDynamicAttribute(String uri, String localName, Object value)
			throws JspException {
		//取出设置的动态属性内容
		num.put(localName, Float.parseFloat(value.toString()));
	}

}

 dynamicaddtag.tld:

<?xml version="1.0" encoding="UTF-8"?>
<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">
    
	<tlib-version>1.0</tlib-version>
	<short-name>dynamicadd</short-name>
	<tag>
 		<name>add</name>
 		<tag-class>com.keith.tag.DynamicAddTag</tag-class>
 		<body-content>empty</body-content>
 		<!-- 接受动态属性 -->
 		<dynamic-attributes>true</dynamic-attributes>
	</tag>
</taglib>

 web.xml:

    <taglib>
  		<taglib-uri>dynamicaddtest</taglib-uri>
  		<taglib-location>/WEB-INF/dynamicaddtag.tld</taglib-location>
  </taglib>

 index.jsp:

<%@ taglib prefix="dynamicadd" uri="dynamicaddtest"%>

  <body>
	计算结果:<dynamicadd:add num1="11.11" num2="10.12"  num3="12.1"/>
  </body>

 测试结果:计算结果:33.33

分享到:
评论

相关推荐

    jsp高级编程--jsp基础&&jsp高级应用

    第九章 扩展jsp标签 第十章 Enterprise JavaBeans 第十一章 其他高级应用 第十二章 jsp高级应用实例--网上书店 附录A jsp应用实例--网上教育代码 附录B JavaServer Pages白皮书 附录C 常用jsp相关网址

    JSP高级编程--Internet/Intranet开发语言

    本书从最基础的JSP开发开始,循序渐进地介绍了JSP 开发技术,并涵盖了许多高级主题,如需要在企业级Web应用中使用的特性—Enterprise JavaBeans、JDBC 2.0、数据库连接池和自定义标签库。本书既适合初学者阅读,也...

    JSP Web 编程指南

    JSP Web编程指南 JavaServer Pages(JSP)是一种基于Java程序语言创建交互式的、动态Web站点的技术。本书从基础开始,先讲述JSP的概念、如何存储数据和执行简单的计算;接着介绍JSP的新功能——标签库和Java最有用...

    JSP应用开发-自定义标签的使用.pptx

    JSP应用开发-自定义标签的使用.pptx

    JSP开发技术大全 JSP

    mail组件、程序日志组件、JavaScript脚本语言、CSS样式、XML入门技术、在JSP中应用Ajax技术、在JSP中应用DOM解析XML、在JSP中应用JDOM解析XML、在JSP中应用SAX解析XML、EL表达式、JSTL标签库、自定义标签、Hibernate...

    JSP应用开发-EL表达式与JSTL标签.pptx

    JSP应用开发-EL表达式与JSTL标签.pptx

    Servlet与JSP核心编程

    《Servlet与JSP核心编程(第2卷 第2版)》在第l卷的基础上,广泛涉及自定义标签库、过滤器、声明式安全、JSTL和Struts等主题,并沿袭深受读者喜爱的写作风格,通过完整、有效、资料丰富的程序来演绎目前最流行的技术和...

    JSP网络编程学习笔记源代码 part2

    第五篇为“标签语言和表达式语言”,主要讲述JSP的标签技术,JSP提供的标准标签库JSTL的用法及用户如何自定义自己的标签库;第六篇为“Web应用高级专题”,主要讲述Servlet过滤器、JSP异常处理、JSP日志、认证和安全...

    JSP应用开发-使用JSTL标签重构BBS论坛页面.pptx

    JSP应用开发-使用JSTL标签重构BBS论坛页面.pptx

    JSP Web编程指南(pdf版)

    本书从基础开始,先讲述JSP的概念、如何存储数据和执行简单的计算;接着介绍JSP的新功能——标签库和Java最有用的特征——面向对象;然后用大量可运行的实例为读者详细介绍如何进行Web设计和管理数据。通过对本书的...

    JSP深入编程(适合有java语言基础和JSP基础的同志)

    本书从最基础的JSP开发开始,循序渐进地介绍了JSP 开发技术,并涵盖了许多高级主题,如需要在企业级Web应用中使用的特性—Enterprise JavaBeans、JDBC 2.0、数据库连接池和自定义标签库。本书既适合初学者阅读,也...

    jsp 开发技术大全

    mail组件、程序日志组件、JavaScript脚本语言、CSS样式、XML入门技术、在JSP中应用Ajax技术、在JSP中应用DOM解析XML、在JSP中应用JDOM解析XML、在JSP中应用SAX解析XML、EL表达式、JSTL标签库、自定义标签、Hibernate...

    JSP开发技术大全 源码

    mail组件、程序日志组件、JavaScript脚本语言、CSS样式、XML入门技术、在JSP中应用Ajax技术、在JSP中应用DOM解析XML、在JSP中应用JDOM解析XML、在JSP中应用SAX解析XML、EL表达式、JSTL标签库、自定义标签、Hibernate...

    JSP高级编程

    本书从最基础的JSP开发开始,循序渐进地介绍了JSP 开发技术,并涵盖了许多高级主题,如需要在企业级Web应用中使用的特性—Enterprise JavaBeans、JDBC 2.0、数据库连接池和自定义标签库。本书既适合初学者阅读,也...

    JSP编程指南(pdf)

    本书全面系统地介绍了如何运用JSP设计并构架动态web站点和web应用,阐述了JSP标签的语法和生存期以及Servlet的概念;分忻了JSP体系结构以及JSP与J2EE API的关系;更通过大量的案例分析对如何使用JSP、XML和XSLT在WAP...

    JSP深入编程(JSP Deep Development)

    本书从最基础的JSP开发开始,循序渐进地介绍了JSP 开发技术,并涵盖了许多高级主题,如需要在企业级Web应用中使用的特性—Enterprise JavaBeans、JDBC 2.0、数据库连接池和自定义标签库。本书既适合初学者阅读,也...

    Jsp基础与案例开发详解随书源码13-17章

    第9章:JSP开发中的实用技术,通过学习来提高JSP编程的质量与效率。 第10-13章:一些实用工具的用法,通过这些实用工具的学习,有助于读者从事一些管理角色的工作。 第14-17章:留言管理系统、网站相册系统、在线...

    JSP高级编程(最新完整版)

    本书从最基础的JSP开发开始,循序渐进地介绍了JSP 开发技术,并涵盖了许多高级主题,如需要在企业级Web应用中使用的特性—Enterprise JavaBeans、JDBC 2.0、数据库连接池和自定义标签库。本书既适合初学者阅读,也...

    JSP基础与案例开发详解随书源码2-10章

    第9章:JSP开发中的实用技术,通过学习来提高JSP编程的质量与效率。 第10-13章:一些实用工具的用法,通过这些实用工具的学习,有助于读者从事一些管理角色的工作。 第14-17章:留言管理系统、网站相册系统、在线...

    Java Web编程宝典-十年典藏版.pdf.part2(共2个)

    全书分4篇,共24章,其中,第1篇为技能学习篇,主要包括Java Web开发环境、JSP语法、JSP内置对象、Java Bean技术、Servlet技术、EL与JSTL标签库、数据库应用开发、初识Struts2基础、揭密Struts2高级技术、Hib锄劬e...

Global site tag (gtag.js) - Google Analytics