分享

jsp自定义标签 之 继承TagSupport类实现

 Go_Ahead 2012-11-30
        关于jsp的自定义标签使用,这里将只是作为一个应用实例参考,学会自定义标签是怎么写的。至于,我们什么时候才需要去自定义标签,还需继续积累经验,进行总结。我所知道的的两种方式如下:
        1、继承TagSupport,写一个tld文件
        2、直接写一个tag文件,在jsp中引用(现在经常用到的)
 
第一种:
       a、创建一class   DictTag,继承TagSupport,并重写doStartTag与doEndTag方法
             public class DictTag extends TagSupport {
                        StringBuffer optionStr = new StringBuffer();
                        //该属性是用户在页面使用该自定义标签时,属性所对应的值(可以根据情况在此定义,并提供get/set)
                        private String category;
                        private String display_name;
                        public String getCategory() {
                                   return category;
                        }
                       public void setCategory(String category) {
                                  this  .category = category;
                       }
                       public String getDisplay_name() {
                                  return display_name;
                       }
                       public void setDisplay_name(String display_name) {
                                  this.display_name = display_name;
                       }
 
                        //本例中是拼出来的死数据(实际运用中这些数据是要从数据库动态取出来的)
                       @Override
                        public int doStartTag() throws JspException {
                                   // 假设的一个Dict集合
                                   // List<Dict> dictList = new ArrayList<Dict>();
                                  //下面的步骤就是开始拼出自定义标签了
                                  //注意:这里的select标签的属性 name 和 id 都是动态得到的(根据用户在页面中应用到此标签时,给它设置的属性)
                                   optionStr.append("<SELECT NAME=" + getCategory() + "ID="
                                      + getCategory() + ">");
                                   // 具体的options项,将通过数据表取出来,然后循环放入option
                                   if (null != getCategory() && !"".equals(getCategory())) {
                                               if (("GENDER").equals(getCategory())) {
                                                             optionStr.append("<OPTION VALUE=");
                                                             optionStr.append("1");// 这里到时候换成从SEA_DICT对象中取出来的dict_value
                                                             optionStr.append(">");
                                                             optionStr.append("male");// 这里对应SEA_DICT表中display_name
                                                             optionStr.append("</OPTION>");
                                                             optionStr.append("<OPTION VALUE=");
                                                             optionStr.append("2");// 这里到时候换成从SEA_DICT对象中取出来的dict_value
                                                             optionStr.append(">");
                                                             optionStr.append("famale");// 这里对应SEA_DICT表中display_name
                                                             optionStr.append("</OPTION>");
                                                             optionStr.append("<OPTION VALUE=");
                                                             optionStr.append("3");// 这里到时候换成从SEA_DICT对象中取出来的dict_value
                                                             optionStr.append(">");
                                                             optionStr.append("unknown");// 这里对应SEA_DICT表中display_name
                                                             optionStr.append("</OPTION>");
 
                                             /*这里的是假设以后从数据库中拿数据,就只用写一遍了
                                              * for (Dict dict : dictList) {
                                              * optionStr.append("<OPTION VALUE=");
                                              * optionStr.append(dict.getDictValue());//
                                              * 这里到时候换成从SEA_DICT对象中取出来的dict_value optionStr.append(">");
                                              * optionStr.append(dict.getDisplayName());//
                                              * 这里对应SEA_DICT表中display_name optionStr.append("</OPTION>"); }
                                             */
                                                 } else if (("STATUS").equals(getCategory())) {
                                                              optionStr.append("<OPTION VALUE=");
                                                              optionStr.append("1");// 这里到时候换成从SEA_DICT对象中取出来的dict_value
                                                              optionStr.append(">");
                                                              optionStr.append("valid");// 这里对应SEA_DICT表中display_name
                                                              optionStr.append("</OPTION>");
                                                              optionStr.append("<OPTION VALUE=");
                                                              optionStr.append("2");// 这里到时候换成从SEA_DICT对象中取出来的dict_value
                                                              optionStr.append(">");
                                                              optionStr.append("invalid");// 这里对应SEA_DICT表中display_name
                                                              optionStr.append("</OPTION>");
                                               }
                             }
                                   return super.doStartTag();
            }
                         @Override
                         public int doEndTag() throws JspException {
                                   // 结束的时候把最后的尾标签加上
                                  optionStr.append("</SELECT>");
                                  try {
                                        pageContext.getOut().println(optionStr.toString());
                                 } catch (IOException e) {
                                            // TODO Auto-generated catch block
                                            e.printStackTrace();
                                 }        
                               return super.doEndTag();
                     }
}
 
          b、在WEB-INF目录下建一个tld文件来定义tag,如下:
                <?xml version="1.0" encoding="UTF-8" ?>
                <!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN"
                                                                 "    http://java./dtd/web-jsptaglibrary_1_2.dtd">
               <taglib>
                           <tlib-version>1.0</tlib-version>
                           <jsp-version>1.2</jsp-version>
                           <short-name>html</short-name>
                           //需要多少个tag就在此定义多少个
                           <tag>
                                    <name>dict</name>
                                    <tag-class>com.tags.DictTag</tag-class>
                                    <body-content>JSP</body-content>
                                    //下面的attribute表示,定义的标签有三个属性
                                    <attribute>
                                                   <name>category</name>
                                                   <rtexprvalue>true</rtexprvalue>
                                   </attribute>
                                   <attribute>
                                                  <name>dict_value</name>
                                                  <rtexprvalue>true</rtexprvalue>
                                   </attribute>
                                   <attribute>
                                                  <name>display_seq</name>
                                                  <rtexprvalue>true</rtexprvalue>
                                    </attribute>
                            </tag>
                 </taglib>
          
       c、自定义标签都写好了以后需要在web.xml中声明,非常简单,只需配置一下
             <jsp-config>
                     <taglib>
                                <taglib-uri>/WEB-INF/custom_defined</taglib-uri>
                                <taglib-location>/WEB-INF/custom_defined.tld</taglib-location>
                    </taglib>
             </jsp-config>

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多