使用到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
### HTML:自定义标签属性详解 #### 一、引言 HTML 作为 Web 开发的基础语言之一,提供了丰富的标签及属性来构建网页内容。在实际应用中,有时我们需要为 HTML 元素添加额外的信息或功能,这就需要用到自定义属性...
以上就是关于“JSP自定义标签动态属性支持”的详细介绍。通过学习和实践这一技术,开发者可以更好地利用JSP自定义标签的灵活性,提高Web应用的开发效率和质量。同时,了解源码和工具的运用也是提升编程技能的关键,...
我们通过`<%@ taglib %>`指令导入了包含`helloTagHaveProp`标签的标签库,并通过`<myTag:helloTagHaveProp>`标签调用了该自定义标签,同时设置了`fontSize`和`fontColor`属性。 #### 四、总结 通过上述步骤,我们...
在实际开发中,有时我们需要根据项目需求实现特定的功能,比如动态生成SQL或者进行复杂的业务逻辑处理,这时MyBatis的自定义标签功能就显得尤为重要。 自定义标签是MyBatis框架的一大特色,它允许我们扩展XML映射...
它提供了丰富的功能,使得开发者能够快速构建高效、稳定的应用程序。在ThinkPHP中,自定义标签(Tag Lib)是一种强大的特性,...在实际开发过程中,可以根据项目的具体需求,灵活运用自定义标签来解决各种复杂问题。
SolidWorks自定义属性之属性标签编制程序 SolidWorks中的自定义属性是通过属性标签编制程序来实现的,该程序可以创建零件、装配体、工程图和焊件的自定义属性界面。在本文中,我们将详细介绍属性标签编制程序的...
3. **在JSP页面中使用自定义标签**:在JSP页面中,可以通过`<jsp:attribute>`或`<c:set>`标签设置动态属性,然后使用自定义标签。动态属性以`name="..." value="..."`的形式传递。 例如,一个简单的动态属性自定义...
1. 创建标签库描述文件(TLD,Tag Library Descriptor):这是定义自定义标签的关键文件,用于描述标签的属性、命名空间等信息。例如,`struts-tags.tld`。 2. 编写标签处理类(Tag Class):这个类负责处理标签的...
以下是关于JSP自定义标签及其属性的相关知识点: 1. 自定义标签的必要性:在JSP中,原生的标签(如, , , <jsp:forward> 等)对于许多常见的任务来说已经足够,但在需要高度可定制化的场景下,自定义标签提供了一种...
创建自定义标签需要编写处理类,继承自`javax.servlet.jsp.tagext.TagSupport`或`javax.servlet.jsp.tagext.SimpleTagSupport`,然后在TLD文件中定义标签属性、行为等信息。 三、自结束标签(不带标签体,TagSupport...
1. **定义标签库描述符文件 (TLD, Tag Library Descriptor)**:TLD是XML格式的文件,用于声明自定义标签及其属性。例如,你可以创建一个名为`mytags.tld`的文件,并在其中定义一个名为`myTag`的标签。在TLD中,你...
在使用JSP自定义标签时,开发者可能会遇到一些报错问题,这通常涉及到项目结构、类路径设置或自定义标签的编译与打包方式。在本文中,我们将深入探讨这些问题,以及如何解决“JspException”这个特定异常。 首先,...
"jsp 2.0自定义标签.doc"文件很可能包含了一个关于如何创建和使用自定义标签的详细教程。它可能涵盖了从创建TLD文件,编写标签处理类,到在JSP页面上实际使用自定义标签的全过程。同时,这个文档可能会提供一些实际...
- `mytags.tld`文件,定义了自定义标签及其属性。 - 示例XML配置文件,展示了如何在实际场景中使用自定义标签。 通过研究这个例子,我们可以学习到如何将业务逻辑抽象出来,封装成自定义标签,使Spring配置更加简洁...
本资料包“JSP标签、自定义标签,含有属性”专注于讲解JSP中的两种主要标签类型:标准动作标签(JSP Standard Tags, JSTL)和自定义标签。 1. **JSP标准动作标签**: JSTL是一组符合JSR-52标准的标签库,包括核心...
在 Struts 中,自定义标签是提供一种灵活的方式,使得视图层(通常为 JSP 页面)能够更好地与业务逻辑交互,从而提高代码的可读性和可维护性。本文将深入探讨如何在 Struts 中实现自定义标签。 一、自定义标签概述 ...
5. **属性和表达式语言(Expression Language, EL)**:自定义标签可以接收属性参数,这些参数可以是静态值,也可以是EL表达式,EL提供了一种简洁的方式来访问JavaBean或其他数据源。 6. **国际化(i18n)与资源包...
1. **定义TLD文件**:在开始开发自定义标签之前,你需要创建一个TLD文件,定义标签的名称、属性、标签处理类等。例如: ```xml <name>myTag <tag-class>com.example.MyTagHandler</tag-class> <body-content>...
2. 属性处理:自定义标签可以接受属性,这些属性在TLD文件中定义,并在处理类中通过`pageContext.getAttribute()`获取。 3. 标签体处理:如果自定义标签需要访问标签体的内容,可以实现`javax.servlet.jsp.tagext....