JSP 自定义标签实现数据字典的实例

JSP 自定义标签实现数据字典的实例

1.关于JSP标签的好处就不再罗嗦

数据字典就是使用的下拉框,只要定义使用那个字典就会将这个字典可用的内容显示出来

显示字典时只要定义那个字典和属性值就可以显示出字典的显示值

2.首先在web.xml中定义自定义标签加载的引用,两个属性分别是引用的URI和加载路径


<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
  http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
  <jsp-config>
    <taglib>
      <taglib-uri>/tld/web-html</taglib-uri>
      <taglib-location>
        /WEB-INF/tlds/web-html.tld
      </taglib-location>
    </taglib>
  </jsp-config>
</web-app>

3.在web-html.tld中定义自己的标签,数据字典应用的话我们需要一个标签库,三个标签。分别是,select标签,options标签,和现实数据字典的标签,每个标签都对应不同的实现类

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN"
  "http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd">
<taglib>
  <tlib-version>1.0</tlib-version><!-- 标签库版本 -->
  <jsp-version>1.2</jsp-version> <!-- 标签库要求的JSP规范版本 -->
  <short-name>html</short-name>  <!-- JSP页面编写工具可以用来创建助记名的可选名字 -->
  <tag>
    <name>select</name>
    <tag-class>com.SelectTag</tag-class>
    <body-content>JSP</body-content>
    <attribute>
      <name>name</name>
      <rtexprvalue>true</rtexprvalue>
    </attribute>
    <attribute>
      <name>style</name>
      <rtexprvalue>true</rtexprvalue>
    </attribute>
  </tag>
  <tag>
    <name>options</name>
    <tag-class>com.OptionsTag</tag-class>
    <body-content>JSP</body-content>
    <attribute>
      <name>collection</name>
      <rtexprvalue>true</rtexprvalue>
    </attribute>
  </tag>
  <tag>
    <name>selectDisplay</name>
    <tag-class>com.SelectDisplay</tag-class>
    <body-content>JSP</body-content>
    <attribute>
      <name>collection</name>
      <rtexprvalue>true</rtexprvalue>
    </attribute>
    <attribute>
      <name>name</name>
      <rtexprvalue>true</rtexprvalue>
    </attribute>
    <attribute>
      <name>value</name>
      <rtexprvalue>true</rtexprvalue>
    </attribute>
  </tag>
</taglib>

4.实现类

实现类的作用就是在后台拼接所需HTML标签内容,然后由JSP进行输出

实现类最主要的两个方法,一个遇到这个标签开始时输出,一个是结束时输出

如果需要定义属性,可以参考实现类定义属性,并在TLD中定义,在JSP中使用标签时快捷键就可以出来这个属性

首先是select标签的代码:

package com;
import java.io.IOException;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspTagException;
import javax.servlet.jsp.tagext.BodyTagSupport;
/**
 * TagSupport与BodyTagSupport的区别:
 * 主要看标签处理类是否要读取标签体的内容和改变标签体返回的内容,如果不需要就用TagSupport,否则就用BodyTagSupport
 * 用TagSupport实现的标签,都可以用BodyTagSupport来实现,因为BodyTagSupport继承了TagSupport
 */
@SuppressWarnings("serial")
public class SelectTag extends BodyTagSupport {
  @Override
  public int doStartTag() throws JspException {
    try {
      StringBuffer results = new StringBuffer("<select");
      if(name != null){
        results.append(" name=\"");
        results.append(name);
        results.append("\"");
      }
      if(style != null){
        results.append(" style=\"");
        results.append(style);
        results.append("\"");
      }
      results.append(">");
      pageContext.getOut().write(results.toString());
    } catch (IOException ex) {
      throw new JspTagException("错误");
    }
    return EVAL_BODY_INCLUDE;
  }
  @Override
  public int doEndTag() throws JspException {
    try {
      StringBuffer results = new StringBuffer("");
      // 因为下拉中包含下拉内容,所以只能在遇到结束标签时才能写select结束
      results.append("</select>");
      pageContext.getOut().write(results.toString());
    } catch (IOException ex) {
      throw new JspTagException("错误");
    }
    return EVAL_PAGE;
  }
  // 样式
  protected String style;
  // 名字
  protected String name;
  public String getStyle() {
    return style;
  }
  public void setStyle(String style) {
    this.style = style;
  }
  public String getName() {
    return name;
  }
  public void setName(String name) {
    this.name = name;
  }
  /**
  doStartTag()方法是遇到标签开始时会呼叫的方法,其合法的返回值是EVAL_BODY_INCLUDE与SKIP_BODY,前者表示将显示标签间的文字,后者表示不显示标签间的文字
  doEndTag()方法是在遇到标签结束时呼叫的方法,其合法的返回值是EVAL_PAGE与SKIP_PAGE,前者表示处理完标签后继续执行以下的JSP网页,后者是表示不处理接下来的JSP网页
  doAfterBody(),这个方法是在显示完标签间文字之后呼叫的,其返回值有EVAL_BODY_AGAIN与SKIP_BODY,前者会再显示一次标签间的文字,后者则继续执行标签处理的下一步
  EVAL_BODY_INCLUDE:把Body读入存在的输出流中,doStartTag()函数可用
  EVAL_PAGE:继续处理页面,doEndTag()函数可用
  SKIP_BODY:忽略对Body的处理,doStartTag()和doAfterBody()函数可用
  SKIP_PAGE:忽略对余下页面的处理,doEndTag()函数可用
  EVAL_BODY_BUFFERED:申请缓冲区,由setBodyContent()函数得到的BodyContent对象来处理tag的body,如果类实现了BodyTag,那么doStartTag()可用,否则非法
  EVAL_BODY_AGAIN:请求继续处理body,返回自doAfterBody(),这个返回值在你制作循环tag的时候是很有用的
  预定的处理顺序是:doStartTag()返回SKIP_BODY,doAfterBodyTag()返回SKIP_BODY,doEndTag()返回EVAL_PAGE
  如果继承了TagSupport之后,如果没有改写任何的方法,标签处理的执行顺序是:doStartTag() ->不显示文字 ->doEndTag()->执行接下来的网页
  如果您改写了doStartTag(),则必须指定返回值,
  如果指定了EVAL_BODY_INCLUDE,则执行顺序是:doStartTag()->显示文字->doAfterBodyTag()->doEndTag()->执行下面的网页
   */
} 

关于返回参数,返回具体数字也可以,不用过于纠结

然后是下拉内容实现类

package com;
import java.io.IOException;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspTagException;
import javax.servlet.jsp.tagext.BodyTagSupport;
@SuppressWarnings("serial")
public class OptionsTag extends BodyTagSupport {
  @Override
  public int doStartTag() throws JspException {
    return EVAL_BODY_INCLUDE;
  }
  @Override
  public int doEndTag() throws JspException {
    try {
      StringBuffer results = new StringBuffer("");
      if ("SEX".equals(collection)) {
        results.append("<option value=\"0\" selected=\"selected\">请选择</option>");
        results.append("<option value=\"1\">男</option>");
        results.append("<option value=\"2\">女</option>");
      }
      pageContext.getOut().write(results.toString());
    } catch (IOException ex) {
      throw new JspTagException("错误");
    }
    return EVAL_PAGE;
  }
  // collection只是传递一个标识,具体下拉值内容是从数据库取还是从请求中得到为不同具体实现
  protected String collection;
  public String getCollection() {
    return collection;
  }
  public void setCollection(String collection) {
    this.collection = collection;
  }
}

具体你的字典数据从数据库中如何存储如何查询,可以自定义实现

显示的标签实现,为了将来可以在页面取到标签内容值,我们定义隐藏域来保存属性值,然后在显示显示内容


package com;
import java.io.IOException;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspTagException;
import javax.servlet.jsp.tagext.BodyTagSupport;
@SuppressWarnings("serial")
public class SelectDisplay extends BodyTagSupport {
  @Override
  public int doStartTag() throws JspException {
    try {
      StringBuffer results = new StringBuffer("");
      pageContext.getOut().write(results.toString());
    } catch (IOException ex) {
      throw new JspTagException("错误");
    }
    return EVAL_BODY_INCLUDE;
  }
  @Override
  public int doEndTag() throws JspException {
    try {
      StringBuffer results = new StringBuffer("");
      if ("SEX".equals(collection)) {
        results.append("<span>");
        results.append("<input type=\"");
        results.append("hidden\" name=\"");
        results.append(getName());
        results.append("\"");
        results.append(" value=\"");
        results.append(getValue());
        results.append("\">");
        if ("1".equals(getValue())) {
          results.append("男");
        } else if ("2".equals(getValue())) {
          results.append("女");
        } else {
          results.append("请选择");
        }
        results.append("</span>");
      }
      pageContext.getOut().write(results.toString());
    } catch (IOException ex) {
      throw new JspTagException("错误");
    }
    return EVAL_PAGE;
  }
  // collection只是传递一个标识,具体下拉值内容是从数据库取还是从请求中得到为不同具体实现
  protected String collection;
  // 传递的值
  protected String value;
  // 该属性的名称
  protected String name;
  public String getCollection() {
    return collection;
  }
  public void setCollection(String collection) {
    this.collection = collection;
  }
  public String getName() {
    return name;
  }
  public void setName(String name) {
    this.name = name;
  }
  public String getValue() {
    return value;
  }
  public void setValue(String value) {
    this.value = value;
  }
}

5.JSP中引用,直接在index.jsp中引用

需要引入相应的标签内容,引入的方式在JSP头部引用

标签的属性可以设置也可以不设置,标签的使用和HTML标签的使用是一样的,定义属性即可

<%@ page language="java" pageEncoding="UTF-8"%>
<%@ taglib uri="/tld/web-html" prefix="html"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>JSP 自定义标签的实现</title>
  </head>
  <body>
    请选择:
    <html:select name="sex" style="width:100px">
      <html:options collection="SEX"></html:options>
    </html:select>
    显示性别:
    <html:selectDisplay collection="SEX" value="1" name="sex"></html:selectDisplay>
  </body>
</html>

6.后话

访问项目就可以看到效果,附件是这个项目的源代码,导入到MyEclipse中可以查看

如果想要自己设计一个大的标签库,可以设计一个父类,包含一些主要的属性,例如name,id,style等属性。然后在子类中定义自己的特有属性

这个实现只是学习一下JSP自定义标签使用的HelloWorld程序,然后包含了字典应用的实际例子,程序简单,仅供参考

如有疑问请留言或者到本站社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

(0)

相关推荐

  • JSP自定义标签Taglib实现过程重点总结

    Taglib指令介绍 Taglib指令,其实就是定义一个标签库以及自定义标签的前缀. 比如struts中支持的标签库,html标签库.bean标签库.logic标签库. 其中的具体的实现方式,我们不过多介绍,我们给大家从宏观的角度以及解决其中的疑难点,后面会大家介绍相应的学习资料. 除了struts的标签库,我们常见还有jstl标签库. 这样在界面jsp中引入其中的标签库或者标签库文件,然后才可以正常使用其中定义的标签. 复制代码 代码如下: <%@ taglib prefix ="bea

  • Jsp生成页面验证码的方法[附代码]

    image.jsp------------------------------生成随机验证码图片的Jsp页面 代码如下:  复制代码 代码如下: <%@ page contentType="image/jpeg" import="java.awt.*, java.awt.image.*,java.util.*,javax.imageio.*" %> <%! Color getRandColor(int fc,int bc) { Random ran

  • 在jsp页面如何获得url参数

    当一个url过来时,如:http://localhost:8080/pro/demo/hello.jsp?name=john,在hello.jsp页面,我们可以这样得到name的值: 复制代码 代码如下: <% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getSer

  • jsp web.xml文件的作用及基本配置

    一个web中完全可以没有web.xml文件,也就是说,web.xml文件并不是web工程必须的. 那什么时候需要,什么时候可以不需要呢? 要想回答上面的问题,得先了解web.xml文件使用来干什么的.web.xml文件是用来配置:欢迎页.servlet.filter等的.当你的web工程没用到这些时,你可以不用web.xml文件来配置你的web工程. 那么web.xml能做的所有事情都有那些? 其实,web.xml的模式(Schema)文件中定义了多少种标签元素,web.xml中就可以出现它的模

  • jsp下页面跳转的几种方法小结

    1. RequestDispatcher.forward() 在服务器端起作用,当使用forward()时,Servlet engine传递HTTP请求从当前的Servlet或者是JSP到另外的一个Servlet.JSP 或普通HTML文件,也即你的form提交至a.jsp,在a.jsp用到了forward()重定向至b.jsp,此时form提交的所有信息在 b.jsp都可以获得,参数自动传递. 但forward()无法重定向至有frame的jsp文件,可以重定向至有frame的html文件,同

  • JSP 自定义标签实现数据字典的实例

    JSP 自定义标签实现数据字典的实例 1.关于JSP标签的好处就不再罗嗦 数据字典就是使用的下拉框,只要定义使用那个字典就会将这个字典可用的内容显示出来 显示字典时只要定义那个字典和属性值就可以显示出字典的显示值 2.首先在web.xml中定义自定义标签加载的引用,两个属性分别是引用的URI和加载路径 <?xml version="1.0" encoding="UTF-8"?> <web-app version="2.5" xm

  • JSP自定义标签rtexprvalue属性用法实例分析

    本文实例讲述了JSP自定义标签rtexprvalue属性.分享给大家供大家参考.具体如下: 其实以前也有写过自定义标签, 但是没有注意到过<rtexprvalue>的用法, 最近这几天又用上自定义标签了, 突然发现<rtexprvalue>的用法是有讲究的. rtexprvalue的全称是 Run-time Expression Value, 它用于表示是否可以使用JSP表达式. 当在<attribute>标签里指定<rtexprvalue>true<

  • jsp自定义标签用法实例详解

    本文实例讲述了jsp自定义标签用法.分享给大家供大家参考.具体如下: 在JSP中有一种机制,可以让你在JSP页面中插入与HTML类似的标记.本文介绍JSP定制标记的基本概念和构成,以及如何开发和应用JSP定制标记. 什么是标记 使用HTML语言我们可以这样去编辑我们的网页: <HTML> <HEAD> <TITLE> HELLO WORLD </TITLE> </HEAD> <BODY> HELLO WORLD </BODY&g

  • 基于JSP 自定义标签使用实例介绍

    添加JSP自定义标签: 先添加一个tld文件到WEB-INF文件夹中<?xml version="1.0" encoding="UTF-8" ?><taglib xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://

  • jsp自定义标签之ifelse与遍历自定义标签示例

    第一个示例: 简单的jsp自定标签获取内容: 首先创建一个jsp实例类然后继承SimpleTagSupport类 然后实现父类的doTag()方法 在这个方法里获取标签体里的内容this.getJspBody(); 返回的是JspFragment 类,根据这个类对象调用invoke(this.getJspContext().getOut()); 这个方法里面也可以写空,所表达的意思也是输出到浏览器: 复制代码 代码如下: public class SimpleDmeo1 extends Simp

  • Thymeleaf 3.0 自定义标签方言属性的实例讲解

    此篇文章内容仅限于 描述 thy3.0 自定义标签的说明,所以你在看之前,请先会使用它. 直奔主题,以下代码是如何引用 第三方标签的.说明: shrioDialect 是Shiro 官方为thy开发的自定义标签工具.和jsp的一样 RiskDialect 是我写的自定义标签 <bean id="templateEngine" class="org.thymeleaf.spring3.SpringTemplateEngine"> <property

  • JSP自定义标签案例分析

    本文为大家介绍了JSP自定义标签的案例,供大家参考,具体内容如下 案例一:实现一个基本防盗链标签 1. 标签处理类 public class MyReferer extends BodyTagSupport { private String site; private String back; public String getSite() { return site; } public void setSite(String site) { this.site = site; } public

  • Jsp自定义标签和方法详解

    Jsp自定义标签和方法详解 首先是要有一个标签处理类,标签处理类可以直接实现Tag接口,也可以继承Java中已经实现了的TagSupport这个类,TagSupport也是继承自Tag接口的,它内部已经对Tag接口进行了实现,一般是继承TagSupport类,之后是重写父类的doStartTag和doEndTag方法, 对于开始标签来说返回值主要有EVAL_BODY_INCLUDE和SKIP_BODY,前者表示执行标签体,后者表示略过标签体: 对于结束标签的返回值主要有两种EVAL_PAGE和S

  • JSP自定义标签入门学习

    本文为大家分享了JSP自定义标签入门学习教程,希望大家喜欢. 1.JSP自定义标签: 自定义标签是用户定义的JSP语言元素.当JSP页面包含一个自定义标签时将被转化为servlet,标签转化为对被 称为tag handler的对象的操作,即当servlet执行时Web container调用那些操作.JSP标签扩展可以让你创建新的标签并且可以直接插入到一个JSP页面. JSP 2.0规范中引入Simple Tag Handlers来编写这些自定义标记.你可以继承SimpleTagSupport类

  • JSP 自定义标签之一 简单实例

    在JSP中使用自定义标签可以达到这样的目的,事实上,我们所熟知的各类框架基本上都是通过自定义标签的形式来实现的. 通过使用自定义标签,我们可以将实现复杂的逻辑在页面用简单的标签来加以展示.下面我们来实现一个非常简单的自定义标签,期望通过这个简单的实例引领各位进入自定义标签的领域.我们准备定义的这个自定义标签所实现的功能是在JSP页面中显示出版权信息,并且在以后的博文中,我们还会对它进行升级改造. 首先,打开编辑器,创建以下Java代码: 复制代码 代码如下: package com.yanzhi

随机推荐