实现自定义select标签

  我们经常会遇到这种场景:

    假设项目中有一个分类对象,类似数据字典,一个code对应一个name。这个在页面作为一个过滤条件:选择分类。一般做法是在jsp页面直接写select标签,用option在页面

做判断。比如:

这样操作我们需要在后台Controller中查询放置levelClassDtoList对象,页面写这样一个select标签。如果这个标签是在多个页面使用,那么我们每个页面都需要复制一份,每个页面对应的后台Controller中也要查询放置一份levelClassDtoList对象。这样就重复做事情,而且一旦有变动,需要改很多地方,费时,还容易出错。所有我们就想到可不可把这个自定义成一个标签,多处使用?方便我们使用和后期维护。可以的。结合自己的项目,需要以下4个步骤:

  1. 定义java的tag类:LevelCodeTag

    采用继承org.springframework.web.servlet.tags.RequestContextAwareTag

    RequestContextAwareTag类是一个abstract修饰的抽象类,有一个protected级别的抽象方法,子类需要实现这个方法,将自己需要的数据放入pageContext对象中即可。
    public abstract class RequestContextAwareTag extends TagSupport implements TryCatchFinally {
    ...//省略部分代码
    	/**
    	 * Called by doStartTag to perform the actual work.
    	 * @return same as TagSupport.doStartTag
    	 * @throws Exception any exception, any checked one other than
    	 * a JspException gets wrapped in a JspException by doStartTag
    	 * @see javax.servlet.jsp.tagext.TagSupport#doStartTag
    	 */
    	protected abstract int doStartTagInternal() throws Exception;
    ...//省略部分代码
    }
    
    
    
    LevelCodeTag:
    public class LevelCodeTag extends RequestContextAwareTag {
        @Override
        protected int doStartTagInternal() throws Exception {
           //通过注入spring的levelClassService.findAll()方法得到数据库的所有levelCode对象,并放置在pageContext对象中。
            ILevelClassService levelClassService=getBean("levelClassService");
            pageContext.setAttribute("levelCodeList", levelClassService.findAll());
            return 0;
        }
    private WebApplicationContext wac;
    
        /**
         * 从web应用上下文中,根据注册的beanName获取对象
         * @param beanName spring 管理的beanName
         * @param 
         * @return
         */
        @SuppressWarnings("unchecked")
        protected  T getBean(String beanName) {
            if (wac == null) {
                wac = getRequestContext().getWebApplicationContext();
            }
            return (T) wac.getBean(beanName);
        }
    }


  2. 定义tld文件
    这个文件是放置在WEB-INF目录下yq_fn.tld,最简配置如下:
    
    
    
    
    
        1.1
        yq_fn
        http://www.wangan.com/media/tag
        
            listLevelCode
            com.wangan.media.tag.LevelCodeTag
            empty
        
        
    
  3. 定义tag标签文件
    定义了tld文件,我们就可以通过tld文件得到javatag中的levelCodeList对象,定义levelCode.tag文件,这个文件和步骤2中的yq_fn.tld文件在同一目录下。
    <%@tag pageEncoding="utf-8" %>
    <%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
    <%@taglib prefix="yq" uri="http://www.wangan.com/media/tag" %>
    
    <%@attribute name="levelName" required="true" type="java.lang.String"  rtexprvalue="true"%>
    <%@attribute name="levelCode" required="true"   rtexprvalue="true"%>
    <%@attribute name="selectId" required="true" rtexprvalue="true" %>
    
    
    
    


  4. web.xml中配置tld文件
    将步骤2中定义的tld文件交给项目管理
     
            
                http://www.wangan.com/media/tag
                /WEB-INF/tags/yq_fn.tld
            
        

  5. jsp使用自定义标签
    <%@ taglib prefix="yq" tagdir="/WEB-INF/tags" %>

  6. 页面效果
    实现自定义select标签_第1张图片
    总结:几个简单步骤后,我们就实现了一次定义,随意使用的效果。以后每次使用就按照步骤5引用就可以了。这样我们关于levelCode对象的值都没有在页面写死,以后需要修改这个对象数据,我们直接修改库的字典就可。最开始,由于项目时间要求,本人是直接在页面对select标签写死value和name的,后面项目需要扩展,增加分类,此时就需要修改多出页面和数据库,由于后面也有多余的时间,则抽取出来成标签,以后再需要修改,就直接修改数据库字典即可。


你可能感兴趣的:(java-web,Java,基础)