1. 程式人生 > >運用反射從bean物件中取出屬性 頁面顯示list優化

運用反射從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);

});




作此記錄