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 实现自定义标签。
数据字典就是使用的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 实现自定义标签。