运用反射从bean对象中取出属性 页面显示list优化
来源:互联网 发布:淘宝店铺活动如何取消 编辑:程序博客网 时间:2024/06/05 14:31
最近有一个需求,优化页面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,很方便,通过封装好的方法,设置你需要的查询属性,方法代码如下:
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
代码如下
/**
*
*
*
* @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);
});
作此记录
- 运用反射从bean对象中取出属性 页面显示list优化
- 通过java的反射从list中取出对象从而取出属性值
- 从list中取出对象并获得其属性值
- 一个对象实例化后从spring容器取出放在bean对象中,写出获取它的属性的set方法
- java 利用反射 从数据库取出数据对象list 类似hibernate
- jsp页面显示List中对象的属性三种方法
- 从bean中获取对象的属性值
- 将List中一列的值取出来 求和后 放到页面显示 用BigDicamal
- 数据库存储BloB格式图片,并从数据库中取出显示到页面中
- ClassReflection(Copy bean and list) 运用反射来实现bean或list的弱引用
- 从session中取出持久化对象
- 页面传值(运用对象属性)
- Java从List中直接读取未知对象属性数据
- VB中运用反射原理优化程序代码
- java8之list集合中取出某一属性的方法
- 关于json格式存储数据库成bean对象list,取出来再次转换成json格式
- Struts2 用s:property标签从Action中获取Bean对象某一个属性的值
- Spring入门学习——从对象属性中声明Bean
- HDU 1505(动态规划-最大子矩阵)
- 神经网络机器翻译模型介绍-GNMT
- 双向级联中的一对多导航
- HashMap类源码解析
- tomcat启动成功并能运行项目,但无法显示那只小猫
- 运用反射从bean对象中取出属性 页面显示list优化
- json对象操作
- 【工作笔记】使用mescroll.js实现上拉加载更多
- 从底层驱动 到上层APP的流程(1)
- Oracle之获取真正的执行计划
- mtd-utils工具的编译和使用
- FE
- STM32之红外接收
- AOP的底层实现概念