寫一個自定義標簽需要3個文件.tag .tld .java文件孫卫琴写的tomcat一书有详细说。至于改struts标签,使只能输入数字,不晓得怎么实现,似乎只能用validation对输入做check.......
解决方案 »
- springmvc 中用redirect跳转如何传递多个参数,用?和&的方式获取不到
- 请问自定义类型转换器除了转换制定类型的date数据还能有什么别的用吗?
- hibernate和数据库断开连接问题
- 如何成为一个java高手?
- java要学习的核心的东西是什么?
- web services服务端是 https的 客户端可以与他建立联系么?
- Apache ActiveMQ 执行多次发送接收消息后内存不足问题!
- xml解析问题
- 感问路在何方??2004专科毕业生的一些想法~!
- 有谁在程序里用过Ant这个工具吗?
- ftp上传下载问题。。。。。。。急!!!!!多谢各位!
- 如何用XSLT生成带CDATA段的xml文档?
存在
public void setValue(String value)
这个方法
但是在什么地方调用的哪位朋友能告诉一下a
呵呵
研究研究标签挺有意思
public int doStartTag()
throws JspException
{
TagUtils.getInstance().write(pageContext, renderInputElement());
return 2;
}这样一个方法
请问一下 这里return 的值都有什么啊?各代表什么意思?
HelloTag_Interface.java文件内容:
import javax.servlet.jsp.tagext.Tag;
import javax.servlet.jsp.PageContext;
import javax.servlet.jsp.JspException;
import java.io.*;
import javax.servlet.jsp.JspTagException;/**
* 以实现Tag接口的方式来开发标签程序
*/
public class HelloTag
implements Tag { private PageContext pageContext;
private Tag parent; public HelloTag(){
super();
} /**
* 设置标签的页面上下文
* @param pageContext
*/
public void setPageContext(PageContext pageContext) {
this.pageContext=pageContext;
} /**
* 设置上一级标签
* @param t
*/
public void setParent(Tag parent) {
this.parent=parent;
} public Tag getParent() {
return this.parent;
} /**
* 开始标签时的操作
* @return
* @throws JspException
*/
public int doStartTag() throws JspException {
return this.SKIP_BODY;//返回SKIP_BODY,表示不计算标签体
} /**
* 结束标签时的操作
* @return
* @throws JspException
*/
public int doEndTag() throws JspException {
try {
pageContext.getOut().write("Hello World!");
}
catch (IOException ex) {
throw new JspTagException("IO Error:"+ex.getMessage());
} return this.EVAL_PAGE;
} /**
* Release 用于释放标签程序占用的资源,比如使用了数据库连接,那么应该关闭这个连接
*/
public void release() {
}
} 2.编写标签库描述.
在WEB-INF\目录下新创建一个mytag.tld文件:
<?xml version="1.0" encoding="GBK"?>
<taglib xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee web-jsptaglibrary_2_0.xsd"
version="2.0">
<description>A tag library exercising SimpleTag handlers.</description>
<tlib-version>1.0</tlib-version> <short-name>my</short-name>
<uri>/mytag</uri>
<description>学习标签</description> <tag>
<description>输出Hello World</description>
<name>hello</name>
<tag-class>HelloTag</tag-class>
<body-content>empty</body-content>
</tag>
</taglib>3.配置自定义标签到工程中.
在web.xml文件里添加:<web-app>
...
<taglib>
<taglib-uri>/mytag</taglib-uri>
<taglib-location>/WEB-INF/mytag.tld</taglib-location>
</taglib>
...
</web-app>4.在JSP文件中使用自定义标签.
编写mytag.jsp文件:<%@ taglib uri="/mytag" prefix="hello" %>
<%@ page contentType="text/html;charset=GBK" language="java" %>
<html>
<head>
<title>first tag</title>
<meta http-equiv="Content-Type" content="text/html;charset=GBK">
</head>
<body>
<p>以下的内容从Taglib中输出显示:</p>
<p><my:hello></p>
</body>
</html>
第一种做法:
我自己写了一个 ExTextTag.java 文件继承了 BaseFieldTag
对应画面的标签 <exhtml:extext>
功能是:这个文本框只能输入数字 99999999
public class ExTextTag extends BaseFieldTag {
public int doStartTag() throws JspException {
、、、、、、、、、、、、、、、、、
}
、、、、、、、、、、、、、、、、、、、
}
如果再写一个 ExTextTag2.java文件也继承BaseFieldTag
对应画面的标签 <exhtml:extext1>
功能是:只能输入2006/06/06 这种日期格式
public class ExTextTag2 extends BaseFieldTag {
public int doStartTag() throws JspException {
、、、、、、、、、、、、、、、、、
}
}
第二种做法:
我只写一个 ExTextTag.java 文件继承了 BaseFieldTag
在这个类中根据标志来实现第一种做法中的两个功能
在画面用的标签形式:<exhtml:extext property="strNumber" sort="1"></exhtml:extext>
<exhtml:extext property="strNumber" sort="2"></exhtml:extext>
sort 是我在这个类中多追加的一个属性 其中1代表只输入数字,2表示日期 结果:
第一种做法:
当画面第一次load的时候好用,但是当刷新或者点提交按钮后就失效了,原因是这两种控制我分别在ExTextTag 和 ExTextTag2 类中拼写了脚本语句输出到画面,但刷新或者提交后这些脚本有语句没有了,这是为什么呢?
第二种做法却完全可以实现。
两种做法的共同点就是我都是在类中拼写脚本语言但是第二种做法就可以在画面保持住所拼写的脚本,第一种却不行,请各位朋友帮忙分析一下为什么第一种做法有问题呢?对标签理解的还是不够啊,郁闷。
1. 类:TagSupport 和 BodyTagSupport(自定义标签库继承的两个类文件,请参考J2EE1.4的CHM文档)。两者的区别主要是标签处理类是否需要与标签体交互,如果你只想用于输出,就继承TagSupport ,如果标签库还能接收pageContent的页面参数,就继承BodyTagSupport。2. 方法与返回值:doStartTag()、doAfterBody()与doEndTag()。doStartTag()是遇到标签开始时会呼叫的方法,其合法的返回值是EVAL_BODY_INCLUDE与SKIP_BODY,前者表示将显示标签间的文字,后者表示不显示标签间的文字;doEndTag()方法是在遇到标签结束时呼叫的方法,其合法的返回值是EVAL_PAGE与SKIP_PAGE,前者表示处理完标签后继续执行以下的JSP网页,后者是表示不处理接下来的JSP网页;doAfterBody(),这个方法是在显示完标签间文字之后呼叫的,其返回值有EVAL_BODY_AGAIN与SKIP_BODY,前者会再显示一次标签间的文字,后者则继续执行标签处理的下一步。 预定的处理顺序是:doStartTag()返回SKIP_BODY,doAfterBodyTag()返回SKIP_BODY,doEndTag()返回EVAL_PAGE。如果继承了TagSupport之后,如果没有改写任何的方法,标签处理的执行顺序是:doStartTag() ->不显示文字 ->doEndTag()->执行接下来的网页;如果您改写了doStartTag(),则必须指定返回值,如果指定了EVAL_BODY_INCLUDE,则执行顺序是:doStartTag()->显示文字->doAfterBodyTag()->doEndTag()->执行下面的网页。 如果楼主是用Struts开发,那Struts里有一些好的方法类更方便标签库的开发,主要是指TagUtils,它有两个很重要的静态方法TagUtils.getInstance().lookup(pageContext, name, property, scope)与TagUtils.getInstance().write(pageContext, outputString)。前一个是用来取得对象的值,如果与标签库交互的是String变量,那么直接用TagUtils.getInstance().lookup(pageContext, name, scope)就可以取出该变量的值(name为变量名),如果与标签库交互的是类的实例,那么直接用TagUtils.getInstance().lookup(pageContext, name, scope)就可以取出该类的一个实例化对象(意思就是将值封装在类中,并类作为一变量传输),如果是类中的某个属性,就用TagUtils.getInstance().lookup(pageContext, name, property, scope),name为类名,property是类的属性,这样就能取出传过来的类的某个属性值。当然,所有取出来的都是Object对象类型,你还得进行相应的类型转换。 如果不用Struts开发或其它框架,你就必要详细了解Java反射技术,才能写出称心如意的标签库。TagUtils也只是将所有的反射封装起来了而已。唉,太长了,到时在自己的博客上写一篇详细的关于标签库的文章吧!
啰嗦了这么多,楼主嫌烦的话,就别分给俺分吧,不过在下有一小小请求,请楼主同时关注俺的一篇贴子呀,谢了!十分感谢!
http://community.csdn.net/Expert/topic/5080/5080673.xml?temp=.7272913
同时感谢关注俺的贴子,哈哈!
http://community.csdn.net/Expert/topic/5080/5080673.xml?temp=.7272913
首先谢谢你了
但是TagUtils.getInstance().write这个方法输出值到画面,有且仅有一次么?EVAL_BODY_INCLUDE 的值是1?
SKIP_BODY 是2?
doStartTag()
这个方法几次被调用?是不是调用这个类它就被调用一次?
在第9楼我提出的问题出现在哪里啊?这点还是没明白哈
谢谢了