关于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> |
|