《Java实战开发》运用反射从bean对象中取出属性 页面显示list优化

最近有一个需求,优化页面list下拉列表显示和数据库的查询,在页面显示的对象list下拉框的值改为根据指定的字段查询,并且封装到一个统一的LabelVO类中。

如何把查询到的对象中需要的属性名和值取出来放到LabelVO中是个问题,然后想到了用反射能不能解决,于是在网上查了一下,发现可以实现。

后端部分:


    public class LabelVo {
        String id;
        String name;
        public String getId() {
            return id;
        }
        public void setId(String id) {
            this.id = id;
        }
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
    }

 

首先,搞定了指定字段查询,dao层我在这用的是通用Mapper,很方便,通过封装好的方法,设置你需要的查询属性,方法代码如下:

    @Override
    public List<T> queryLabelVoOrderByName(T t,String field1,String field2) throws SPSDaoException {
        Example example = new Example(MerchantEntity.class);
        example.orderBy("name").asc();
        example.selectProperties(field1,field2);
        Criteria createCriteria = example.createCriteria();
        createCriteria.andEqualTo(t);
        List<T> list = new ArrayList<T>();
        try{
            list = mapper.selectByExample(example);

            return list;

        }catch(Exception e){
            logger.error("exception",e);
            throw new SPSDaoException(e);
        }

    }

我选择在service层将查询到的指定对象转成LabelVO对象,这里就用到了我们的反射方法。

    public List<LabelVo> queryMerchantLabelVoOrderByMerchantName(T t) throws SPSException {



// excute query and return the result 
        List<T> list = dao.queryLabelVoOrderByName(t,f1,f2);
        if (list != null && list.size() > 0) {
            List<LabelVo> listLabelVo = ReflexObjectUtil.getListLabelVo(list, KEY,VALUE);
            return listLabelVo;
        } else {
            return null;
        }


    }

在这里用了一个反射获取属性的工具类ReflexObjectUtil

 

参考博客:http://www.cnblogs.com/Spirit612/p/6732008.html

代码如下



    public class ReflexObjectUtil {


        /**
         * 
         * 
         * 
         * @param object
         * 
         * 
         * @return Map map 
         * 
         */


        @SuppressWarnings("unchecked")
        public static Map getKeyAndValue(Object obj) {
            Map map = new HashMap();


            Class userCla = (Class) obj.getClass();




            Field[] fs = userCla.getDeclaredFields();


            for (int i = 0; i < fs.length; i++) {
                Field f = fs[i];
                f.setAccessible(true);
                Object val = new Object();


                try {
                    val = f.get(obj);


                    map.put(f.getName(), val);
                } catch (IllegalArgumentException e) {
                    e.printStackTrace();
                } catch (IllegalAccessException e) {
                    e.printStackTrace();
                }




            }


            return map;
        }


        /**
         * 
         * 
         * 
         * @param object
         * 
         * 
         * @param key
         * 
         * 
         * @return Object  
         * 
         */
        public static Object getValueByKey(Object obj, String key) {


            Class userCla = (Class) obj.getClass();




            Field[] fs = userCla.getDeclaredFields();


            for (int i = 0; i < fs.length; i++) {
                Field f = fs[i];
                f.setAccessible(true);
                try {


                    if (f.getName().endsWith(key)) {


                        return f.get(obj);
                    }
                } catch (IllegalArgumentException e) {
                    e.printStackTrace();
                } catch (IllegalAccessException e) {
                    e.printStackTrace();
                }
            }


            return "";
        }


        /**
         * 
         * 
         * 
         * @param object
         * 
         * @return List>  
         * 
         */
        @SuppressWarnings("unchecked")
        public static List getKeysAndValues(List object) {
            List list = new ArrayList();


            for (Object obj : object) {
                Class userCla;


                userCla = (Class) obj.getClass();




                Field[] fs = userCla.getDeclaredFields();
                Map listChild = new HashMap();


                for (int i = 0; i < fs.length; i++) {
                    Field f = fs[i];
                    f.setAccessible(true);
                    Object val = new Object();


                    try {
                        val = f.get(obj);
                        listChild.put(f.getName(), val);
                    } catch (IllegalArgumentException e) {
                        e.printStackTrace();
                    } catch (IllegalAccessException e) {
                        e.printStackTrace();
                    }
                }
                list.add(listChild);
            }


            return list;
        }


        /**
         * 
         * 
         * 
         * @param object
         * 
         * @param key
         * 
         * @return List  
         */
        @SuppressWarnings("unchecked")
        public static List getValuesByKey(List object, String key) {
            List list = new ArrayList();


            for (Object obj : object) {


                Class userCla = (Class) obj.getClass();




                Field[] fs = userCla.getDeclaredFields();


                for (int i = 0; i < fs.length; i++) {
                    Field f = fs[i];
                    f.setAccessible(true);
                    try {


                        if (f.getName().endsWith(key)) {
                            list.add(f.get(obj));
                        }
                    } catch (IllegalArgumentException e) {
                        e.printStackTrace();
                    } catch (IllegalAccessException e) {
                        e.printStackTrace();
                    }
                }
            }


            return list;
        }

        public static List<LabelVo> getListLabelVo(List object, String key1, String key2) {


            List<LabelVo> list = new ArrayList<LabelVo>();


            for (int i = 0; i < object.size(); i++) {
                LabelVo lb = new LabelVo();
                Object obj = object.get(i);
                Map map = ReflexObjectUtil.getKeyAndValue(obj);
                lb.setId(map.get(key1).toString());
                lb.setName(map.get(key2).toString());
                list.add(lb);
            }


            return list;
        }
    }

前端部分:

因为前端数据处理json格式的字符串比较简单,所以在controller层对返回的List《labelVo》做一个格式转换

JSONArray mListLabelVo = JSONArray.fromObject(ListLabelVo);
model.addAttribute("mListLabelVo", mListLabelVo);

因为用的地方比较多,为了方便更新维护,所以采用了下拉列表用动态生成的方法,抽取出了一个list.js的文件,在需要使用的地方引用,然后调用相应的方法。

方法是通过添加指定的class标签,然后根据后端的返回值,还有flag标记判定添加内容和添加给谁,js代码如下:


jQuery.setKeyValueLableList = function(list,flag) {
    var optionList="<option value=''>-------please select-------</option>";
    for(var j=0;j<list.length;j++){
        optionList+= "<option value="+list[j].id+">"+list[j].name+"--"+list[j].id+"</option>";
    }
    if(flag==1){
        $(".setMerchantList").append(
            optionList
        )
    }
    if(flag==2){
        $(".setChannelList").append(
            optionList
        )
    }
}
jQuery.setValueKeyLableList = function(list,flag) {
    var optionList="<option value=''>-------please select-------</option>";
    for(var j=0;j<list.length;j++){
        optionList+= "<option value="+list[j].id+">"+list[j].id+"--"+list[j].name+"</option>";
    }
    if(flag==1){
        $(".setMerchantList").append(
            optionList
        )
    }
    if(flag==2){
        $(".setChannelList").append(
            optionList
        )
    }
}
jQuery.setValueLableList = function(list,flag) {
    var optionList="<option value=''>-------please select-------</option>";
    for(var j=0;j<list.length;j++){
        optionList+= "<option value="+list[j].id+">"+list[j].name+"</option>";
    }
    if(flag==1){
        $(".setMerchantList").append(
            optionList
        )
    }
    if(flag==2){
        $(".setChannelList").append(
            optionList
        )
    }
}
jQuery.setKeyLableList = function(list,flag) {
    var optionList="<option value=''>-------please select-------</option>";
    for(var j=0;j<list.length;j++){
        optionList+= "<option value="+list[j].id+">"+list[j].id+"</option>";
    }
    if(flag==1){
        $(".setMerchantList").append(
            optionList
        )
    }
    if(flag==2){
        $(".setChannelList").append(
            optionList
        )
    }
}
jQuery.getValueByKey = function(list,key) {
    for(var j=0;j<list.length;j++){
        var label = list[j].id;
        var name = list[j].name;
        if(key==label){
            return name;
        }
    }

}

 

jsp页面调用:

引用js文件

<script src="${contextPath}/labellist.js"></script>

在《select》标签添加相应的class标签,

页面加载之前调用后台传来参数

动态添加相应js显示:

example:

$(function() {

var list = ${ListLabelVo};
$.setKeyValueLableList(list, 1);

});

 

 

 

作此记录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值