寫一個自定義標簽需要3個文件.tag .tld .java文件孫卫琴写的tomcat一书有详细说。至于改struts标签,使只能输入数字,不晓得怎么实现,似乎只能用validation对输入做check.......

解决方案 »

  1.   

    在  BaseInputTag  这个类中
    存在 
    public void setValue(String value)
    这个方法
    但是在什么地方调用的哪位朋友能告诉一下a
      

  2.   

    setValue 知道怎么回事了
    呵呵
    研究研究标签挺有意思
      

  3.   

    BaseFieldTag 类中有:
        public int doStartTag()
            throws JspException
        { 
            TagUtils.getInstance().write(pageContext, renderInputElement());
            return 2;
        }这样一个方法
    请问一下 这里return  的值都有什么啊?各代表什么意思?
      

  4.   

    开发和使用JSP自定义标签过程:1.开发标签实现类.
      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>
      

  5.   

    struts是就是将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 类中拼写了脚本语句输出到画面,但刷新或者提交后这些脚本有语句没有了,这是为什么呢?
    第二种做法却完全可以实现。
    两种做法的共同点就是我都是在类中拼写脚本语言但是第二种做法就可以在画面保持住所拼写的脚本,第一种却不行,请各位朋友帮忙分析一下为什么第一种做法有问题呢?对标签理解的还是不够啊,郁闷。
      

  6.   

    目前的大多数it从业人员很少关心自己的健康、配偶、运动等方面的东西,只顾自己的学习、工作、和心爱的电脑,所以专门为it人员提供一个从工作、学习、生活、运动、健康等方面的心灵交流场所,目的是希望大家能够意识到除了工作外,还有其它比工作更重要的东西需要自己去关心!最后欢迎大家前来:http://www.ugole.com看看、谢谢大家不仿也给身边的朋友介绍介绍!“在互联网这个大迷宫里,您游够了吗?在游够了社区歇歇脚吧!”
      

  7.   

    看在楼主是同类五角,还有贴子200分的份上,嘿嘿!别见笑,俺是来解决问题的。标签库其实并不难,你只要明白其原理,网上搜一下一大把的资料。在这里我作简要说明。
    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
      

  8.   

    忘记说了,TagUtils.getInstance().write(pageContext, outputString)是用来向页面输出值的,其中outputString是待输出的字符串。输出时,有的字符串可能牵涉到过滤的问题,特别是HTML代码,如果你要以原型输出(也就是直接显示成页面格式,而不是输出代码),你就必须设置fitler=false,这样,它就不会将"<"解释成"&glt;"。我这里有很多自定义标签库的实例,如果楼主有兴趣的话,可以Email给你。
    同时感谢关注俺的贴子,哈哈!
    http://community.csdn.net/Expert/topic/5080/5080673.xml?temp=.7272913
      

  9.   

    yeno(人在广州) 
    首先谢谢你了
    但是TagUtils.getInstance().write这个方法输出值到画面,有且仅有一次么?EVAL_BODY_INCLUDE 的值是1?
    SKIP_BODY 是2?
    doStartTag()
    这个方法几次被调用?是不是调用这个类它就被调用一次?
    在第9楼我提出的问题出现在哪里啊?这点还是没明白哈
    谢谢了