源:http://www.fengfly.com/plus/view-169588-1.html
评:
(1)
其实,开发自定义标签并不需要Struts2的支持,一般情况下,只需要继承
javax.servlet.jsp.tagext.BodyTagSupport类,重写doStartTag,doEndTag等方法即可。
在struts2.x中实现自定义标签时,继承的2个类分别是org.apache.struts2.views.jsp.ComponentTagSupport 和
org.apache.struts2.components.Component.
ComponentTagSupport:
实际上是对BodyTagSupport的一次封装,继承ComponentTagSupport类是为了获得JSP页面中用户自定义的标签中设置的属性值,并包装成Component对象。
Component:
继承Component类是为了从Struts2中的ValueStack中获得相对应的值。
继承Component类是为了从Struts2中的ValueStack中获得相对应的值。
(2)分析:
tag类里面,
须声明的属性:
需要定义你JSP页面传来的标签设置的属性。如maxlength,并相应的set get。
须声明的属性:
需要定义你JSP页面传来的标签设置的属性。如maxlength,并相应的set get。
须的两个方法是:
1.
public Component getBean(ValueStack stack, HttpServletRequest req, HttpServletResponse res);
此 方法就是获得一个基本类的对象。在基本类里面需要有传入ValueStack的构造函数,如果基本类逻辑里面需要request或者response,那 么需要有传入ValueStack stack, HttpServletRequest req, HttpServletResponse res的构造函数;
2.
protected void populateParams()此方法是用来将JSP页面传来的属性值赋给基本类。这里是继承来的,所以首先调用super的相应方法。我理解上面第一 个方法返回的对象就是全局的一个Component对象,也就是第二个方法里面使用的对象。
1.
public Component getBean(ValueStack stack, HttpServletRequest req, HttpServletResponse res);
此 方法就是获得一个基本类的对象。在基本类里面需要有传入ValueStack的构造函数,如果基本类逻辑里面需要request或者response,那 么需要有传入ValueStack stack, HttpServletRequest req, HttpServletResponse res的构造函数;
2.
protected void populateParams()此方法是用来将JSP页面传来的属性值赋给基本类。这里是继承来的,所以首先调用super的相应方法。我理解上面第一 个方法返回的对象就是全局的一个Component对象,也就是第二个方法里面使用的对象。
(3)
实现过程分两步:
第一步,生成基本类,且将ValueStack值,还有其它可选值赋给它。
第二步,JSP页面传来的属性值,通过ComponentTagSupport,利用其getter,setter来获取.将JSP页面传来的属性值,赋给基本类实例。
实现过程分两步:
第一步,生成基本类,且将ValueStack值,还有其它可选值赋给它。
第二步,JSP页面传来的属性值,通过ComponentTagSupport,利用其getter,setter来获取.将JSP页面传来的属性值,赋给基本类实例。
实例:
(1)
页面:
<%@ taglib prefix="jason" uri="/WEB-INF/tlds/time.tld" %>
<jason:jtime who="hwj" message="你好"/>
(2)
JtimeTag要定义tld文件中定义的各对应属性.
JtimeTag要定义tld文件中定义的各对应属性.
public class JtimeTag extends ComponentTagSupport {
private String message;
private String who;
private String message;
private String who;
public String getMessage() {
return message;
}
return message;
}
public void setMessage(String message) {
this.message = message;
}
this.message = message;
}
public String getWho() {
return who;
}
return who;
}
public void setWho(String who) {
this.who = who;
}
this.who = who;
}
public Component getBean(ValueStack arg0, HttpServletRequest arg1,
HttpServletResponse arg2) {
return new JtimeComponent(arg0);
}
protected void populateParams() {
super.populateParams();
JtimeComponent jtime = (JtimeComponent) component;
jtime.setWho(who);
jtime.setMessage(message);
}
}
super.populateParams();
JtimeComponent jtime = (JtimeComponent) component;
jtime.setWho(who);
jtime.setMessage(message);
}
}
(3)
JtimeTag要定义tld文件中定义的各对应属性.因为JtimeTag要赋值给它.:)
public class JtimeComponent extends Component {
private String message;
JtimeTag要定义tld文件中定义的各对应属性.因为JtimeTag要赋值给它.:)
public class JtimeComponent extends Component {
private String message;
private String who;
private String a;
private String a;
public String getMessage() {
return message;
}
return message;
}
public void setMessage(String message) {
this.message = message;
}
this.message = message;
}
public String getWho() {
return who;
}
return who;
}
public void setWho(String who) {
this.who = who;
}
this.who = who;
}
public JtimeComponent(ValueStack arg0) {
super(arg0);
}
super(arg0);
}
//将自己需要输出的逻辑通过writer输出字符串就可以了。
public boolean start(Writer writer) {
boolean result = super.start(writer);
try {
a=this.getStack().findString("pageSize");
writer.write(toHTML(who,message));
} catch (IOException ex) {
}
return result;
}
protected String toHTML(String who,String message) {
Date date=new Date();
return who+message+" 当前的时间是:"+date+"页面数:"+a;
}
}
public boolean start(Writer writer) {
boolean result = super.start(writer);
try {
a=this.getStack().findString("pageSize");
writer.write(toHTML(who,message));
} catch (IOException ex) {
}
return result;
}
protected String toHTML(String who,String message) {
Date date=new Date();
return who+message+" 当前的时间是:"+date+"页面数:"+a;
}
}
(4)
<taglib>
<tlib-version>2.2.3</tlib-version>
<jsp-version>1.2</jsp-version>
<short-name>my</short-name>
<uri>/jtime</uri> -无起作用
<display-name>"jason time tab"</display-name>
<tag>
<name>jtime</name>
<tag-class>com.coship.dhm.dm.common.taglib.JtimeTag</tag-class>
<body-content>empty</body-content>
<attribute>
<name>message</name>
<required>false</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
<attribute>
<name>who</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
</tag>
</taglib>
<taglib>
<tlib-version>2.2.3</tlib-version>
<jsp-version>1.2</jsp-version>
<short-name>my</short-name>
<uri>/jtime</uri> -无起作用
<display-name>"jason time tab"</display-name>
<tag>
<name>jtime</name>
<tag-class>com.coship.dhm.dm.common.taglib.JtimeTag</tag-class>
<body-content>empty</body-content>
<attribute>
<name>message</name>
<required>false</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
<attribute>
<name>who</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
</tag>
</taglib>
(5)
执行过程:
1
页面打开时,load入<%@ taglib prefix="jason" uri="/WEB-INF/tlds/time.tld" %>;
当程序读到"<jason"时,会根据上面的标签定义到time.tld-->JtimeTag.java;
2.
JtimeTag继承ComponentTagSupport,会将JSP页面标签属性进行获取,因为此类有定义各属性及其getter,setter -->
执行过程:
1
页面打开时,load入<%@ taglib prefix="jason" uri="/WEB-INF/tlds/time.tld" %>;
当程序读到"<jason"时,会根据上面的标签定义到time.tld-->JtimeTag.java;
2.
JtimeTag继承ComponentTagSupport,会将JSP页面标签属性进行获取,因为此类有定义各属性及其getter,setter -->
生成一个基本类实例,赋值-->将各属性值赋给基本类实例.
3.
基本类实例,执行start()方法-->执行super.start()-->获取action中的属性-->将自定义的信息用writer.write()输出.
3.
基本类实例,执行start()方法-->执行super.start()-->获取action中的属性-->将自定义的信息用writer.write()输出.
相关推荐
总结,Struts2的自定义标签实例涉及到以下几个关键步骤:创建标签实现类、定义标签描述符、在JSP中使用标签以及处理标签逻辑。通过这种方式,我们可以构建强大的视图层组件,使代码更易于理解和维护,同时提升应用的...
自定义标签是Struts2的一个强大特性,允许我们扩展框架的功能,以满足特定项目的需求。在这个例子中,我们将深入理解如何在Struts2中创建一个自定义的`gageTextField`标签。 1. **创建UIBean(UI组件)** UIBean,...
Struts2的主题标签允许开发者自定义视图的外观和风格。例如,使用`<s:head>`标签引入CSS和JavaScript资源,`<s:fielderror>`显示字段验证错误,`<s:messages>`展示全局消息。 四、实例解析 以下是一个简单的用户...
这个实例项目展示了如何在实际应用中结合Struts2、国际化、类型转换以及Struts2自定义标签来实现用户管理功能,包括用户数据的增删改查。 首先,我们来看Struts2的核心概念。Struts2作为MVC框架,它负责处理HTTP...
总结,Struts1.2标签实例对于初学者来说是非常有价值的教育资源,它可以帮助开发者快速掌握Struts框架的使用,提升Web应用开发的效率。通过深入理解和实践,开发者可以利用这些标签构建出高效、可维护的用户界面。
在Struts2中,自定义标签是扩展其功能和实现个性化界面的重要手段。通过自定义标签,开发者可以构建更加符合业务需求的视图层,提高代码的可读性和可维护性。本文将深入探讨如何在Struts2中自定义标签,并利用栈顶...
### JSP自定义标签知识点详解 #### 一、概述 JSP(JavaServer Pages)是一种基于Java技术的服务器端动态网页开发技术。JSP自定义标签则是为了提高JSP页面的可读性和重用性而引入的一个重要特性。通过自定义标签,...
本示例将聚焦于如何在Struts2中实现一个自定义拦截器。 首先,我们需要了解拦截器在Struts2中的作用。拦截器是AOP(面向切面编程)的一个核心概念,它允许开发者在动作执行前后插入额外的逻辑,如日志记录、权限...
这里的`execute()`方法是Struts2默认调用的方法,而`method1()`和`method2()`是自定义的方法,它们通过`<action>`标签在struts.xml配置文件中进行映射。 接下来,配置文件`struts.xml`是Struts2的核心配置,它定义...
Struts2是一个流行的Java web框架,它极大地简化了MVC(模型-视图-控制器)架构的实现。在Struts2中,标签库是其强大功能的...在未来的学习中,深入研究Struts2的主题机制和自定义标签将会带来更大的灵活性和控制力。
自定义标签可以与Spring MVC、Struts2等框架集成,提供更丰富的功能。 通过上述内容,我们了解了Freemarker自定义标签的基本概念、创建与使用方法,以及如何在实际项目中发挥作用。自定义标签极大地增强了...
Struts2默认提供了一些拦截器来帮助处理这个问题,但如题目所述,由于性能考虑,项目组决定不使用Struts2的标签,因此需要自定义拦截器来实现防止重复提交的功能。 自定义拦截器的实现主要分为以下几个步骤: 1. *...
- 通过主题和模板,可以自定义标签的外观,满足不同设计需求。 - 错误和验证可以通过Struts 2的内置机制处理,如使用`<s:fielderror>`标签显示错误信息。 在实际项目中,UI标签的使用极大地降低了页面开发的复杂性...
自定义类型转换器是Struts 2的核心特性之一,允许开发者根据业务需求定制数据转换规则。以下将详细介绍如何创建、注册以及使用自定义类型转换器。 1. **创建自定义类型转换器** - 创建一个类,实现`org.apache....
`s:component` 用于使用自定义标签,它可以与主题和模板配合使用。例如: ```jsp , 'J2EE' , 'Ajax'}" /> ``` 11. **s:date** - 日期标签 `s:date` 用于格式化日期输入,还可以进行日期运算。例如,你可以...
Struts2的标签库可以简化JSP页面的编写,如`s:textfield`用于创建输入字段,`s:submit`创建提交按钮。 6. **拦截器(Interceptors)** 拦截器是Struts2的一个强大特性,它们可以在Action调用前后执行额外的逻辑。...
通过这个"struts2login小实例",开发者可以深入了解Struts2的工作原理,掌握如何构建一个基本的MVC应用,并逐步熟悉Struts2的配置、Action、数据校验、结果转发等核心概念。这不仅对初学者有益,也对有经验的开发者...
Struts2提供了丰富的标签库,如s:form、s:textfield、s:submit等,这些标签极大地简化了视图层的开发,使得JSP页面更加简洁易读。它们与Action类和结果视图紧密结合,实现了数据的双向绑定。 **OGNL** OGNL(Object...
Struts2提供了一些标签库,如s:form、s:textfield等,方便在JSP中操作模型数据。 7. **模型(Model)**:模型通常由JavaBean或其他业务实体类组成,存储和处理业务数据。 在实践过程中,我们需要创建Action类,...
- **Struts标签**:Struts2提供了一套自定义的JSP标签,可以方便地在视图层展示数据和处理表单提交。 2. **用户界面**: - 使用JSP创建登录页面,包含用户名和密码字段,以及提交按钮。可以使用Struts2的标签库,...