欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

jsp 自定义标签之数据字典

程序员文章站 2022-05-08 12:21:41
...
  集成spring实现jsp自定义标签数据字典

数据字典就是使用的html下拉框,实现数据显示的功能,但日常的应用中,很多数据都是动态加载的,不能在页面上直接写死,方便后期的维护和数据更新,同时也可以实现代码的复用。
形如:


解析过程:
1、在JSP中使用标签库标签
<%@ taglib prefix="dataDic" uri="/WEB-INF/dataDic.tld" %>


2、Web容器根据第二个步骤中的prefix,获得第一个步骤中声明的taglib的uri属性值
3、Web容器根据uri属性在web.xml找到对应的元素
4、从元素中获得对应的元素的值
5、Web容器根据元素的值从WEB-INF/目录下找到对应的.tld文件
6、从.tld文件中找到与tagname对应的元素
7、凑元素中获得对应的元素的值
8、Web容器根据元素的值创建相应的tag handle class的实例
9、 Web容器调用这个实例的doStartTag/doEndTag方法完成相应的处理

实现:
了解了自定义标签的解析过程,实现过程正好和解析过程反过来就可以了。
实现标签类:
/**
  * 数据字典的自定义标签
*/
public class DataDictionaryTag extends  TagSupport  {

@Override 重写 doStartTag 和 doEndTag 方法
  public int doStartTag() throws JspException {
// 这里可以添加 customerService 的获取方式
    List<Customer> list=customerService.getDataCustomer(paramVal);
if (list != null&&list.size()>0) {
for (Customer customer : list) {
optionstr.append("<option value='");
optionstr.append(customer.getCustomerID());
optionstr.append("'");
if(!StringUtil.isNullValue(sqlDefSelField)){
   if(sqlDefSelVal.equalsIgnoreCase  (customer.getCustomerID     ())){
optionstr.append(" selected ");
}
}
optionstr.append(">");
optionstr.append(StringUtil.Html(customer.getCustomerName()));
           optionstr.append("</option>");

}
return super.doStartTag();
}

@Override
public int doEndTag() throws JspException {

try {
pageContext.getOut().print(optionstr);
optionstr.delete(0,optionstr.length());
} catch (Exception err) {
}
return super.doEndTag();
}
  在对应的spring 配置文件里面配置相关属性注入:
<bean class="com.hmf.mis.crm.dao.CustomerDaoImpl" id="customerDao">
<property name="sqlMap" ref="sqlClient"></property>
</bean>

<bean class="com.hmf.mis.crm.service.CustomerServiceImpl" id="customerService">
<property name="customerDao" ref="customerDao"></property>
</bean>
配置 dataDic.tld 文件:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE taglib PUBLIC "-//Sun Microsystems,
Inc.//DTD JSP Tag Library 1.1//EN"
"http://java.sun.com/j2ee/dtds/web-jsptaglibrary_1_1.dtd">
<taglib>
<tlibversion>1.2</tlibversion>
<jspversion>1.1</jspversion>
<shortname>dataDic</shortname>
<tag>
<name>options</name> <tagclass>com.hmf.mis.framework.base.Taglib.XDataDictionaryTag</tagclass>
</tag>
</taglib>

页面调用:
Jsp页面先加上标签的引用:
<%@ taglib prefix="dataDic" uri="/WEB-INF/dataDic.tld" %>
对应的调用:      <SELECT>
       <dataDic:options selectedKeyValue=""  optionType="customerList"  count="" >
       </dataDic:options>
     </SELECT>
完成后数据字典就已经开发完成了。

小结:
在框架集成中使用自定义标签并且存在和数据库相互时,如何获取数据库链接对象是个问题,可能的解决方案:
直接使用jdbc方式访问数据库。
这个方式会导系统对数据库的链接管理的紊乱,框架不能管理相关事务。数据库安全问题也得不到保障,每一个标签的调用都会对创建数据库链接,数据库压力比较大,并且不利于应用的移植。显然这样的方式早被废弃。
通过配置文件 直接获取spring 的 ApplicationContext 对象
ApplicationContext ac = new FileSystemXmlApplicationContext("applicationContext.xml");
这样的做法屏蔽了第一种出现的所有问题,但是每次调用方法时都会重新生成一个上下文对象。内存一下就会被消耗殆尽。 并且违背了spring 管理对象的方式。

最简单的方式就是直接获取请求中的对象,从对象中获取上下文信息,从而得到数据库和相关对象的应用。很显然,sun 的程序员也会帮我们处理这个问题的,在
TagSupport 类中,
ApplicationContext ctx = WebApplicationContextUtils.getWebApplicationContext(pageContext.getServletContext());
CustomerService customerService = (CustomerService)ctx.getBean("customerService");
pageContext 方便的提供了这样的入口给我们。
这便是上文customerService 的获取方式
当然 你也可以使用 BodyTagSupport  来实现你的自定义标签。BodyTagSupport 继承了TagSupport , 在spring 3.0 以上的版本中提供了
NamespaceHandler和BeanDefinitionParser 实现自定义标签。