源: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()输出.
相关推荐
tag struts2 自定义标签 实例 tag struts2的自定义标签实例
通过struts2 自定义标签实例,可以用这个对项目中的实现自定义标签。从而减少代码。
这是本人自己写的,里面包括传参与不传参的标签,很方便,步骤很详细。所有就上传上来了。
下面是我用Struts2做的一个分页显示实例,基本的思路是:把数据库表中的每一行数据封装成一个对象,用一个返回类型为List的方法返回这些对象,接着在Struts2的action里面定义一个List属性,用这个List来接收从数据库...
Struts 2 标签库(文档手册) Tags-API-CLSW-JSP <%@ taglib prefix="s" uri="/struts-tags" %> 就能使用struts2.0的标签库 下面就介绍每个标签的具体应用实例说明:按字母排列 A: 1. 2. <s:a href=""></s:a>-...
本文实例讲述了struts2的select标签用法。分享给大家供大家参考。具体如下: 项目中遇到个小问题,总结下。 关于struts2 select标签的使用。 struts2 中从别的表中遍历数据 填充进入下拉菜单 用标签显示. struts2的...
十二、总结 本教程对struts2的基本知识进行了一些说明,关于struts2的更多详细内容应参看struts2的官方文档及提供的app实例。 下面对struts2的基本执行流程作一简要说明,此流程说明可以结合官方提供的struts2结构图...
下面是我用Struts2做的一个分页显示实例,基本的思路是:把数据库表中的每一行数据封装成一个对象,用一个返回类型为List的方法返回这些对象,接着在Struts2的action里面定义一个List属性,用这个List来接收从数据库...
该属性指定Struts 2应用加载用户自定义的属性文件,该自定义属性文件指定的属性不会覆盖struts.properties文件中指定的属性.如果需要加载多个自定义属性文件,多个自定义属性文件的文件名以英文逗号(,)隔开. struts....
• 采用hibernate3+struts2+spring2+freemarker主流技术架构 • 懂html就能建站,提供最便利、合理的使用方式 • 强大、灵活的标签,用户自定义显示内容和显示方式 • 在设计上自身预先做了搜索引擎优化,增强对...
这是一个自定义分页的源代码, 这个分页标签只负责分页不操作数据库, 你只用给他一个集合,并为这个分页的分页类的实例起个名,但要用到C标签或Struts1标签中的迭代功能。
component标签:生成一个自定义的组件。 div标签:AJAX标签,生成一个div片段。 fielderror标签:输出异常提示信息。 tabbedPanel:AJAX标签,生成HTML中的Tab页。 tree标签:生成一个树形结构。 treenode标签:...
第8-11章是Struts比较高级的内容,包括Struts自定义标签、Struts校验机制、Struts国际化方法和Struts的Tickes组件;第12章是一个完整实例,结合Eclipse、Ant等内容,搭建了一个真实的开发环境和实际的应用。 本书在...
7.6.2 文本新闻列表分页控制自定义标签类textnewspagetag 502 7.6.3 图片新闻列表自定义标签类picnewstag 505 7.6.4 幻灯片新闻列表自定义标签类slidenewstag 507 7.6.5 struts2与ajax完全结合实现点击数加一 510...
自定义标签内容样式或使用系统提供的内容样式都非常方便。 ·尽量减少对第三方类库的依赖,减小发布包体积。 ·使用fckeditor代替原有编辑器。 ·文章内容不入库,减少数据库体积,程序运行效率更高。
书中介绍了如何利用Struts 2 来解决Web 应用开发中的常见问题,同时还深入浅出地探讨了许多能帮助程序员编写Struts 2 应用程序的技巧,如管理页面导航活动、输入验证、国际化和本地化、对Ajax 的支持,等等。...
java学习实例。 基于MVN结构项目结构。 涉及工厂模式,代理模式。 JSP自定义标签。 struts拦截器。 struts与spring的整合。