JSP自定义select标签 字典表数据

开发过程中经常会重复用到select 加载字典表中的数据,比如加载职务、学历等等这些,每次用到都进行单独获取然后在前端进行遍历的话会很麻烦,而且不符合开发原则。因此可以通过自定义标签的方式进行封装。举例 如下:

ynbytag.tld

<?xml version="1.0" encoding="UTF-8" ?>

<taglib 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-jsptaglibrary_2_1.xsd"
        version="2.1">

    <description>YNBY 统一自定义标签</description>
    <display-name>YNBY core</display-name>
    <tlib-version>1.1</tlib-version>
    <short-name>ynby</short-name>

    <tag>
        <name>demo</name>
        <tag-class>com.rdpm.sysm.service.taglib.DemoTag</tag-class>
        <body-content>empty</body-content>
    </tag>
    <tag>
        <!--定义属性的名称。每个标签的是属性名称必须是唯一的。-->
        <name>selectTag</name>
        <tag-class>com.rdpm.sysm.service.taglib.DictSelectTag</tag-class>
        <body-content>empty</body-content>
        <!--系统编码-->
        <attribute>
            <name>systemCode</name>
            <!--指定属性是否是必须的或者可选的,如果设置为false为可选。-->
            <required>true</required>
            <!--声明在运行表达式时,标签属性是否有效。-->
            <rtexprvalue>true</rtexprvalue>
        </attribute>
        <!--select name-->
        <attribute>
            <name>selectName</name>
            <!--指定属性是否是必须的或者可选的,如果设置为false为可选。-->
            <required>true</required>
            <!--声明在运行表达式时,标签属性是否有效。-->
            <rtexprvalue>true</rtexprvalue>
        </attribute>
        <!--value 选中的值-->
        <attribute>
            <name>value</name>
            <required>false</required>
            <rtexprvalue>true</rtexprvalue>
        </attribute>
        <!--默认选中的值-->
        <attribute>
            <name>selectedValue</name>
            <required>false</required>
            <rtexprvalue>true</rtexprvalue>
        </attribute>
        <!--选中任意一项时触发的方法-->
        <attribute>
            <name>onChange</name>
            <required>false</required>
            <rtexprvalue>true</rtexprvalue>
        </attribute>
        <!--选择方式 单选/多选-->
        <attribute>
            <name>multiple</name>
            <required>false</required>
            <rtexprvalue>true</rtexprvalue>
        </attribute>
        <!--select 未选择时显示内容 如:"请选择"或者"所有"-->
        <attribute>
            <name>nullName</name>
            <required>false</required>
            <rtexprvalue>true</rtexprvalue>
        </attribute>
        <!--select 未选择时显示内容的位置 在顶部还是在底部-->
        <attribute>
            <name>nullNamePlace</name>
            <required>false</required>
            <rtexprvalue>true</rtexprvalue>
        </attribute>
        <!--是否有下一级-->
        <attribute>
            <name>hasNext</name>
            <required>false</required>
            <rtexprvalue>true</rtexprvalue>
        </attribute>

        <!--上级ID-->
        <attribute>
            <name>parentId</name>
            <required>false</required>
            <rtexprvalue>true</rtexprvalue>
        </attribute>
        <!--额外的一些显示层的参数-->
        <!--样式类-->
        <attribute>
            <name>cssClass</name>
            <required>false</required>
            <rtexprvalue>true</rtexprvalue>
        </attribute>
        <!--内联样式-->
        <attribute>
            <name>styleClass</name>
            <required>false</required>
            <rtexprvalue>true</rtexprvalue>
        </attribute>
    </tag>
</taglib>

DictSelectTag.java
package com.rdpm.sysm.service.taglib;

import com.rdpm.sysm.dao.BaseParameterMapper;
import com.rdpm.sysm.entity.BaseParameter;
import com.rdpm.sysm.util.SpringContextUtil;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.tagext.TagSupport;
import java.io.IOException;
import java.util.List;

/**
 * Created by XJM on 2016-07-12.
 */
public class DictSelectTag extends TagSupport {

    //额外的一些显示层的参数
    private String cssClass;//样式类
    private String styleClass;//内联样式

    private String systemCode;//参数系统编码
    private String selectName;//select name    private String nullName;//未选择时给的提示信息选项
    private String value;//选中的值
    private String selectedValue;//选中的值
    private String onChange;//改变时调用的方法

    private String multiple;//选择方式 多选/单选

    @Override
    public int doEndTag() throws JspException {
        //SpringContextUtil 在最下面
        BaseParameterMapper baseParameterMapper= (BaseParameterMapper) SpringContextUtil.getBean("baseParameterMapper");
        List<BaseParameter> list= baseParameterMapper.selectParamByParamTypeCode(systemCode);
        StringBuffer sb = new StringBuffer();
        JspWriter out = pageContext.getOut();

        sb.append("<select name=\""+this.getSelectName()+"\"");
        if (!StringUtils.isEmpty(this.getCssClass())){
            sb.append("class=\"" + this.getCssClass() + "\"");
        }
        if(!StringUtils.isEmpty(this.getStyleClass())){
            sb.append("style=\"" + this.getStyleClass() + "\"");
        }
        if(!StringUtils.isEmpty(this.getMultiple())){
            sb.append("multiple=\"" + this.getMultiple() + "\"");
        }
        if(!StringUtils.isEmpty(this.getOnChange())){
            sb.append("οnchange=\"" + this.getOnChange() + "\"");
        }
        sb.append(">");

        if(!StringUtils.isEmpty(this.getNullName())){
            sb.append("<option value=\"\">--"+this.getNullName()+"--</option>");
        }

        for(BaseParameter dc:list){
            if (dc.getDictValue().equals(this.getSelectedValue())){
                sb.append("<option value=\""+dc.getDictValue()+"\" selected>");
            }else {
                sb.append("<option value=\""+dc.getDictValue()+"\">");
            }
            sb.append(dc.getDictName()+"</option>");
        }
        sb.append("</select>");
        try {
            out.write(sb.toString());
        } catch (IOException e) {
            // TODO Auto-generated catch block
            throw new JspException(e);
        }

        return TagSupport.EVAL_PAGE;
    }


    public String getCssClass() {
        return cssClass;
    }

    public void setCssClass(String cssClass) {
        this.cssClass = cssClass;
    }

    public String getStyleClass() {
        return styleClass;
    }

    public void setStyleClass(String styleClass) {
        this.styleClass = styleClass;
    }

    public String getSystemCode() {
        return systemCode;
    }

    public void setSystemCode(String systemCode) {
        this.systemCode = systemCode;
    }

    public String getSelectName() {
        return selectName;
    }

    public void setSelectName(String selectName) {
        this.selectName = selectName;
    }

    public String getNullName() {
        return nullName;
    }

    public void setNullName(String nullName) {
        this.nullName = nullName;
    }

    public String getValue() {
        return value;
    }

    public void setValue(String value) {
        this.value = value;
    }

    public String getOnChange() {
        return onChange;
    }

    public void setOnChange(String onChange) {
        this.onChange = onChange;
    }

    public String getSelectedValue() {
        return selectedValue;
    }

    public void setSelectedValue(String selectedValue) {
        this.selectedValue = selectedValue;
    }

    public String getMultiple() {
        return multiple;
    }

    public void setMultiple(String multiple) {
        this.multiple = multiple;
    }
}

JSP
<%--
  Created by IntelliJ IDEA.
  User: XJM
  Date: 2016-07-12
  Time: 15:44
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib  uri="/WEB-INF/tld/ynbytag.tld" prefix="ynby"%>
<html>
<head>
    <title>JSP自定义标签——Select 字典表数据</title>
</head>
<body>
<ynby:selectTag systemCode="88" selectName="dictName" nullName="赶紧选择啊,亲" styleClass="color:red;width:200px" onChange="selectFunction()"></ynby:selectTag>
<span id="nextSelect"></span>
<script src="http://libs.baidu.com/jquery/1.10.2/jquery.min.js"></script>
<script>
    function selectFunction() {
        var tmp='<ynby:selectTag systemCode="66" selectName="dictName" nullName="麻溜的"></ynby:selectTag>';
        $("#nextSelect").html($(tmp));
    }
</script>
</body>
</html>

PS:该demo是在Spring MVC+Mybatis框架下写的,当需要使用DAO层时通过注入的方式是不可以,原因是能够注入的前提的是注入和被注入的类的对象都是Spring创建的,但自定义标签关联的类不是通过spring生成的对象。那么我想用怎么办呢?如下:

package com.rdpm.sysm.util;

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.BeanInitializationException;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;

/**
 * Created by XJM on 2016-07-12.
 */
@Component
public class SpringContextUtil implements ApplicationContextAware{

    private static ApplicationContext applicationContext;

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        SpringContextUtil.applicationContext=applicationContext;
    }
    public static ApplicationContext getApplicationContext(){
        return applicationContext;
    }

    public static Object getBean(String beanName) throws BeansException{
        return applicationContext.getBean(beanName);
    }
}

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值