`
zuiyanwangyue
  • 浏览: 167208 次
  • 性别: Icon_minigender_1
  • 来自: 河北
社区版块
存档分类
最新评论

关于自定义标签的属性设置问题

阅读更多

使用到JSP中的自定义标签技术时,关于自定义标签对应的处理器类的属性设置:如果属性类型是基本类型,JSP容器可以自动完成类型转换,并调用符合Bean标准的setter方法。

例如:我们定义一个简单的标签处理器类FirstPersonTag,它负责向JSP页面输出一段信息,包括他自己的名字、年龄、性别。

package com.neuqsoft.demo.tag;

import java.io.IOException;

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

public class FirstPersonTag extends SimpleTagSupport{
	private String name;
	private int age;
	private boolean male;
	public void setAge(int age) {
		this.age = age;
	}
	public void setMale(boolean male) {
		this.male = male;
	}
	public void setName(String name) {
		this.name = name;
	}
	public void doTag() throws JspException, IOException {
		super.doTag();
		JspWriter out=getJspContext().getOut();
		out.println("Name:"+name);
		out.println("Age:"+age);
		out.println("Sex:"+(male?"Male":"Female"));
	}
} 

下面是它所在的标签库描述文件demo1.tld的定义:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN"
  "http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd">
<taglib>
  <tlib-version>1.1</tlib-version>
  <jsp-version>1.2</jsp-version>
  <short-name>Demo</short-name>
  <uri>http://demo1.neuqsoft.com</uri>
  <display-name>Neuqsoft CustomTag Demo</display-name>
  <description>Demo</description>
  <tag>
    <name>firstPerson</name>
    <tag-class>com.neuqsoft.demo.tag.FirstPersonTag</tag-class>
    <body-content>NONE</body-content>
    <display-name>table</display-name>
    <description>The First PersonTag</description>
    <attribute>
      <name>name</name>
      <required>false</required>
      <rtexprvalue>true</rtexprvalue>
      <description>The name of this Person</description>
    </attribute>
    <attribute>
      <name>age</name>
      <required>false</required>
      <rtexprvalue>true</rtexprvalue>
      <description>The age of this Person</description>
    </attribute>
    <attribute>
      <name>male</name>
      <required>false</required>
      <rtexprvalue>true</rtexprvalue>
      <description>The sex of this Person</description>
    </attribute>
  </tag>
</taglib>

firstPerson标签在JSP页面中的使用方法:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<%@ page language="java" pageEncoding="gb2312"%>
<%@ taglib uri="http://demo1.neuqsoft.com" prefix="demo"%>
<html>
  <head>
    <title>自定义标签演示</title>
  </head>
  <body>
  	<demo:firstPerson name="Flixy" age="26" male="false"></demo:firstPerson>
  </body>
</html> 

上面代码的输出结果为 :Name:Flixy Age:26 Sex:Female

如果注意demo1.tld的内容的话,可以看到每一个属性定义(<attribute>元素)中都有<rtexprvalue>true</rtexprvalue>被指定,rtexprvalue实际上是Runtime Expression Value的所写,如果它的值为true,说明此属性值可以接受一个EL表达式。因此对于firstPerson这个标签我们还可以这样使用。

firstPerson标签在JSP页面中的使用方法2:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<%@ page language="java" pageEncoding="gb2312"%>
<%@ taglib uri="http://demo1.neuqsoft.com" prefix="demo"%>
<html>
  <head>
    <title>自定义标签演示</title>
  </head>
  <body>
  	<%
  		request.setAttribute("age",new Integer(25));
  		request.setAttribute("male",Boolean.valueOf(true));
  	%>
  	<demo:firstPerson name="Flixy" age="${age}" male="${male}"></demo:firstPerson>
  </body>
</html> 

上面代码的输出结果为 :Name:Flixy Age:25 Sex:Male

注意:实际应用中request的属性对应该是在Action中设置的,JSP页面作为视图层只负责展现数据。

但是你可能认为上面两个例子演示的使用EL表达式与否并无本质的差异,相反使用EL表达式倒显得笨拙一些,但是考虑如下的情形,假如标签处理器类中的属性不是基本类型呢?这个时候JSP容器是无法完成转换的,因为属性的类型很可能是你自己定义的。不妨看下面的例子,在这个例子中Person的性别我们不是用一个boolean值表示,而是用一个自定义的对象Sex,Sex的源码如下:

package com.neuqsoft.demo.tag;

public class Sex{
	private boolean isMale;
	
	public Sex(boolean isMale) {
		super();
		this.isMale = isMale;
	}

	public boolean isMale() {
		return isMale;
	}

	public void setMale(boolean isMale) {
		this.isMale = isMale;
	}
} 

下面是Person标签处理器类的第二个版本:

package com.neuqsoft.demo.tag;

import java.io.IOException;

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

public class SecondPersonTag extends SimpleTagSupport {
	private String name;
	private int age;
	private Sex sex=new Sex(false);
	public void setAge(int age) {
		this.age = age;
	}
	public void setName(String name) {
		this.name = name;
	}
	public void setSex(Sex sex) {
		this.sex = sex;
	}
	public void doTag() throws JspException, IOException {
		super.doTag();
		JspWriter out=getJspContext().getOut();
		if(sex==null)sex=new Sex(true);
		out.println("Name:"+name);
		out.println("Age:"+age);
		out.println("Sex:"+(sex.isMale()?"Male":"Female"));
	}
} 

其对应的标签定义片段:

<tag>
    <name>secondPerson</name>
    <tag-class>com.neuqsoft.demo.tag.SecondPersonTag</tag-class>
    <body-content>NONE</body-content>
    <display-name>table</display-name>
    <description>The First PersonTag</description>
    <attribute>
      <name>name</name>
      <required>false</required>
      <rtexprvalue>true</rtexprvalue>
      <description>The name of this Person</description>
    </attribute>
    <attribute>
      <name>age</name>
      <required>false</required>
      <rtexprvalue>true</rtexprvalue>
      <description>The age of this Person</description>
    </attribute>
    <attribute>
      <name>sex</name>
      <required>false</required>
      <rtexprvalue>true</rtexprvalue>
      <description>The sex of this Person</description>
    </attribute>
</tag> 

由于SecondPersonTag的setSex方法的参数不是基本类型而是Sex,所以JSP容器不能自动完成类型转换,在这种情况下只能使用EL 表达式了,如下:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<%@ page language="java" import="com.neuqsoft.demo.tag.Sex" pageEncoding="gb2312"%>
<%@ taglib uri="http://demo1.neuqsoft.com" prefix="demo"%>
<html>
  <head>
    <title>自定义标签演示</title>
  </head>
  <body>
  	<%request.setAttribute("sex",new Sex(true)); %>
  	<demo:secondPerson name="Flixy" age="75" sex="${sex}"></demo:secondPerson>
  </body>
</html> 

显示结果:Name:Flixy Age:75 Sex:Male

使用内省,如果标签处理器类中没有符合Javabean规范的setter方法,可以使用内省告诉JSP容器怎么处理标签的属性赋值,这需要额外提供一个BeanInfo类,此类和标签处理器类在同一个包中,命名规则是标签处理器类类名+BeanInfo,例如假如标签处理器的完整类名为com.neuqsoft.demo.PersonTag,则BeanInfo类的完整类名应该是com.neuqsoft.demo.PersonTagBeanInfo,下面是一个例子,例子中是PersonTag的第三个版本ThirdPersonTag:

package com.neuqsoft.demo.tag;

import java.io.IOException;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.tagext.SimpleTagSupport;

public class ThirdPersonTag extends SimpleTagSupport{
	private String name;
	private int age;
	private Sex sex;
	
	public void sex(Sex _sex){
		this.sex=_sex;
	}
	
	public void setName(String name){
		this.name=name;
	}
	
	public void putAge(int age){
		this.age=age;
	}
	
	public void doTag() throws JspException, IOException {
		super.doTag();
		JspWriter out=getJspContext().getOut();
		if(sex==null)sex=new Sex(true);
		out.println("Name:"+name);
		out.println("Age:"+age);
		out.println("Sex:"+(sex.isMale()?"Male":"Female"));
	}
} 

其对应的标签定义片段:

<tag>
    <name>thirdPerson</name>
    <tag-class>com.neuqsoft.demo.tag.ThirdPersonTag</tag-class>
    <body-content>NONE</body-content>
    <display-name>table</display-name>
    <description>The First PersonTag</description>
    <attribute>
      <name>_name</name>
      <required>false</required>
      <rtexprvalue>true</rtexprvalue>
      <description>The name of this Person</description>
    </attribute>
    <attribute>
      <name>_age</name>
      <required>false</required>
      <rtexprvalue>true</rtexprvalue>
      <description>The age of this Person</description>
    </attribute>
    <attribute>
      <name>_sex</name>
      <required>false</required>
      <rtexprvalue>true</rtexprvalue>
      <description>The sex of this Person</description>
    </attribute>
</tag> 

注意:我故意在每一个属性name值前面加上了下划线,例如_name、_age、_sex,显然ThirdPersonTag这个标签处理器类中没用对应的setter方法,那么我是如何告诉JSP容器找到合适的方法设置属性值的呢?答案是BeanInfo类,下面是ThirdPersonTagBeanInfo类的源码:

package com.neuqsoft.demo.tag;

import java.beans.IntrospectionException;
import java.beans.PropertyDescriptor;
import java.beans.SimpleBeanInfo;
import java.util.ArrayList;
import java.util.List;

public class ThirdPersonTagBeanInfo extends SimpleBeanInfo {
	public PropertyDescriptor[] getPropertyDescriptors() {
		List proplist = new ArrayList();
		try {
			proplist.add(new PropertyDescriptor("_sex",ThirdPersonTag.class,null,"sex"));
			proplist.add(new PropertyDescriptor("_age",ThirdPersonTag.class,null,"putAge"));
			proplist.add(new PropertyDescriptor("_name",ThirdPersonTag.class,null,"setName"));
		} catch (IntrospectionException e) {
			e.printStackTrace();
		}
		return (PropertyDescriptor[]) proplist.toArray(new PropertyDescriptor[0]);
	}
} 

它的getPropertyDescriptors返回一组属性描述符,描述了每一个属性应该被怎样设置到标签处理器类中,例如_age属性对应着putAge方法,尽管这个方法不符合Javabean的setter方法规范。

ThirdPersonTag应用示例

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<%@ page language="java" import="com.neuqsoft.demo.tag.Sex" pageEncoding="gb2312"%>
<%@ taglib uri="http://demo1.neuqsoft.com" prefix="demo"%>
<html>
  <head>
    <title>自定义标签演示</title>
  </head>
  <body>
  	<%request.setAttribute("sex",new Sex(true)); %>
  	<demo:thirdPerson _name="FlixyDemo3" _age="75" _sex="${sex}"></demo:thirdPerson>
  </body>
</html> 

显示结果:Name:FlixyDemo3 Age:75 Sex:Male

分享到:
评论

相关推荐

    HTML5如何添加自定义标签属性(data-自定义属性).zip

    HTML5如何添加自定义标签属性(data-自定义属性).zip

    HTML:自定义标签属性

    ### HTML:自定义标签属性详解 #### 一、引言 HTML 作为 Web 开发的基础语言之一,提供了丰富的标签及属性来构建网页内容。在实际应用中,有时我们需要为 HTML 元素添加额外的信息或功能,这就需要用到自定义属性...

    JSP自定义标签动态属性支持

    以上就是关于“JSP自定义标签动态属性支持”的详细介绍。通过学习和实践这一技术,开发者可以更好地利用JSP自定义标签的灵活性,提高Web应用的开发效率和质量。同时,了解源码和工具的运用也是提升编程技能的关键,...

    jsp自定义带属性的标签

    我们通过`&lt;%@ taglib %&gt;`指令导入了包含`helloTagHaveProp`标签的标签库,并通过`&lt;myTag:helloTagHaveProp&gt;`标签调用了该自定义标签,同时设置了`fontSize`和`fontColor`属性。 #### 四、总结 通过上述步骤,我们...

    mybatis自定义标签.zip

    在实际开发中,有时我们需要根据项目需求实现特定的功能,比如动态生成SQL或者进行复杂的业务逻辑处理,这时MyBatis的自定义标签功能就显得尤为重要。 自定义标签是MyBatis框架的一大特色,它允许我们扩展XML映射...

    tp自定义标签

    它提供了丰富的功能,使得开发者能够快速构建高效、稳定的应用程序。在ThinkPHP中,自定义标签(Tag Lib)是一种强大的特性,...在实际开发过程中,可以根据项目的具体需求,灵活运用自定义标签来解决各种复杂问题。

    SolidWorks自定义属性之属性标签编制程序[整理].pdf

    SolidWorks自定义属性之属性标签编制程序 SolidWorks中的自定义属性是通过属性标签编制程序来实现的,该程序可以创建零件、装配体、工程图和焊件的自定义属性界面。在本文中,我们将详细介绍属性标签编制程序的...

    动态属性自定义标签

    3. **在JSP页面中使用自定义标签**:在JSP页面中,可以通过`&lt;jsp:attribute&gt;`或`&lt;c:set&gt;`标签设置动态属性,然后使用自定义标签。动态属性以`name="..." value="..."`的形式传递。 例如,一个简单的动态属性自定义...

    struts2 自定义标签

    1. 创建标签库描述文件(TLD,Tag Library Descriptor):这是定义自定义标签的关键文件,用于描述标签的属性、命名空间等信息。例如,`struts-tags.tld`。 2. 编写标签处理类(Tag Class):这个类负责处理标签的...

    JSP自定义标签-标签属性_动力节点Java学院整理

    以下是关于JSP自定义标签及其属性的相关知识点: 1. 自定义标签的必要性:在JSP中,原生的标签(如, , , &lt;jsp:forward&gt; 等)对于许多常见的任务来说已经足够,但在需要高度可定制化的场景下,自定义标签提供了一种...

    JSP自定义标签学习笔记

    创建自定义标签需要编写处理类,继承自`javax.servlet.jsp.tagext.TagSupport`或`javax.servlet.jsp.tagext.SimpleTagSupport`,然后在TLD文件中定义标签属性、行为等信息。 三、自结束标签(不带标签体,TagSupport...

    jsp 自定义标签实例

    1. **定义标签库描述符文件 (TLD, Tag Library Descriptor)**:TLD是XML格式的文件,用于声明自定义标签及其属性。例如,你可以创建一个名为`mytags.tld`的文件,并在其中定义一个名为`myTag`的标签。在TLD中,你...

    jsp自定义标签报错的问题

    在使用JSP自定义标签时,开发者可能会遇到一些报错问题,这通常涉及到项目结构、类路径设置或自定义标签的编译与打包方式。在本文中,我们将深入探讨这些问题,以及如何解决“JspException”这个特定异常。 首先,...

    jsp2.0 自定义标签和自定标签函数

    "jsp 2.0自定义标签.doc"文件很可能包含了一个关于如何创建和使用自定义标签的详细教程。它可能涵盖了从创建TLD文件,编写标签处理类,到在JSP页面上实际使用自定义标签的全过程。同时,这个文档可能会提供一些实际...

    spring自定义标签例子

    - `mytags.tld`文件,定义了自定义标签及其属性。 - 示例XML配置文件,展示了如何在实际场景中使用自定义标签。 通过研究这个例子,我们可以学习到如何将业务逻辑抽象出来,封装成自定义标签,使Spring配置更加简洁...

    JSP标签、自定义标签,含有属性

    本资料包“JSP标签、自定义标签,含有属性”专注于讲解JSP中的两种主要标签类型:标准动作标签(JSP Standard Tags, JSTL)和自定义标签。 1. **JSP标准动作标签**: JSTL是一组符合JSR-52标准的标签库,包括核心...

    struts实现自定义标签

    在 Struts 中,自定义标签是提供一种灵活的方式,使得视图层(通常为 JSP 页面)能够更好地与业务逻辑交互,从而提高代码的可读性和可维护性。本文将深入探讨如何在 Struts 中实现自定义标签。 一、自定义标签概述 ...

    java自定义标签.......java自定义标签

    5. **属性和表达式语言(Expression Language, EL)**:自定义标签可以接收属性参数,这些参数可以是静态值,也可以是EL表达式,EL提供了一种简洁的方式来访问JavaBean或其他数据源。 6. **国际化(i18n)与资源包...

    关于自定义标签的开发说明

    1. **定义TLD文件**:在开始开发自定义标签之前,你需要创建一个TLD文件,定义标签的名称、属性、标签处理类等。例如: ```xml &lt;name&gt;myTag &lt;tag-class&gt;com.example.MyTagHandler&lt;/tag-class&gt; &lt;body-content&gt;...

    JSP自定义标签实例与详细讲解

    2. 属性处理:自定义标签可以接受属性,这些属性在TLD文件中定义,并在处理类中通过`pageContext.getAttribute()`获取。 3. 标签体处理:如果自定义标签需要访问标签体的内容,可以实现`javax.servlet.jsp.tagext....

Global site tag (gtag.js) - Google Analytics