`

利用Jmesa处理List<Map>方法

阅读更多
<本篇文章是与从同事的博客上拿来学习,代码做一点我的.呵....>

Jmesa中处理Map的List对象
目前需求, 客户上传excel文件, 有列名, 列名不固定, 想预览数据, 使用Jmesa做table, 有两种实现方法. 第一种使用动态类, 封装map对象. 第二种是一种巧妙的方法. 下面先介绍第一种方法:
使用动态类:
package com.founder.cst.action;

import Java.util.ArrayList;
import Java.util.List;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.beanutils.BasicDynaBean;
import org.apache.commons.beanutils.BasicDynaClass;
import org.apache.commons.beanutils.DynaBean;
import org.apache.commons.beanutils.DynaClass;
import org.apache.commons.beanutils.DynaProperty;
import org.jmesa.core.filter.MatcherKey;
import org.jmesa.facade.TableFacade;
import org.jmesa.facade.TableFacadeFactory;
import org.jmesa.view.html.component.HtmlTable;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.RequestMapping;

import com.founder.cst.common.StringFilterMatcher;

@Controller
@RequestMapping
public class DynaController {

 @RequestMapping
 public String books(final HttpServletRequest request, HttpServletResponse response, ModelMap model){

  DynaClass  bookClass = createBasicDynaClass();
  try {
 //get parsed result
  List<Map<String,String>> sdfList = (List<Map<String, String>>)sdfMap.get("result");
  String[] keys = (String[]) sdfMap.get("fields");
  
  //set fields to dynamic class
   DynaClass  structureClass = createBasicDynaClass(keys);
		
  //set property to dynamic object.
   List<DynaBean> results = new ArrayList<DynaBean>();
   for (Map<String, String> structure : sdfList) {
       DynaBean stru = structureClass.newInstance();
       for (String key : keys) {
	stru.set(key, structure.get(key));
	}
	results.add(stru);
    }
   
   TableFacade tableFacade = TableFacadeFactory.createTableFacade("booksTable", request);
   
   tableFacade.setColumnProperties("id", "name", "price");
   tableFacade.setMaxRows(10);
   tableFacade.setMaxRowsIncrements(10, 20, 30);
   tableFacade.setItems(results);
   HtmlTable table = (HtmlTable) tableFacade.getTable();
   table.getTableRenderer().setWidth("558px");
   table.getRow().setUniqueProperty("id");
   String html = tableFacade.render();
   model.addAttribute("html", html);
  } catch (IllegalAccessException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  } catch (InstantiationException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
  return "books";
 }
 
 private DynaClass createBasicDynaClass(String[] keys) {
		DynaClass dynaClass = null;
        //create basic field for dynaClass
		int columnSize = keys.length;
        DynaProperty[] dynaProps = new DynaProperty[columnSize];
        for (int i = 0; i < columnSize; i++) {
        	dynaProps[i] = new DynaProperty(keys[i], String.class); 
        }
       
        //create map filed for dynaClass
        dynaClass = new BasicDynaClass("Structures",    BasicDynaBean.class, dynaProps);
        return dynaClass;
    }


}

下面第二种:
@RequestMapping
 public String bookslist(final HttpServletRequest request, HttpServletResponse response, ModelMap model){
  List<Map<String, String>> books = new ArrayList<Map<String, String>>();
  Map<String, String> book1 = new HashMap<String, String>();
  book1.put("id", "1");
  book1.put("name", "Spring");
  book1.put("price", "18.29");
  books.add(book1);
  
  Map<String, String> book2 = new HashMap<String, String>();
  book2.put("id", "2");
  book2.put("name", "Hibernate");
  book2.put("price", "28.98");
  books.add(book2);
  
  Map<String, String> book3 = new HashMap<String, String>();
  book3.put("id", "3");
  book3.put("name", "Python");
  book3.put("price", "38.22");
  books.add(book3);
  
  model.addAttribute("books", books);
  return "booklist";
 }

页面为:
<jmesa:tableFacade 
     id="booksTable" 
     items="${books}"
     maxRows="10" 
     maxRowsIncrements="10,20,30" 
     var="book">
     <jmesa:htmlTable width="630px">
      <jmesa:htmlRow>
       <c:forEach items="${book}" var="b">
       <jmesa:htmlColumn property="${b.key}" title="${b.key}" filterable="false"/>
       </c:forEach>
      </jmesa:htmlRow>
     </jmesa:htmlTable>
    </jmesa:tableFacade>



这里注意property中的值.

今天查看源码, 和昨天想象一样,  jmesa在渲染单元格的时候, 分两种, 一种就是map类型, 使用get(key)来取值, 另一种就是普通的javabean对象, 使用getPropertyName()取值渲染.
/*
 * Copyright 2004 original author or authors.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *    http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.jmesa.util;

import Java.util.Collection;
import Java.util.Map;

import org.apache.commons.beanutils.PropertyUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * General utilities to process the Collecton of Beans or the Collection of
 * Maps. Most methods wrap or add value to the commons Beanutils.
 * 
 * @since 2.1
 * @author Jeff Johnston
 */
public class ItemUtils {

    private static final Logger logger = LoggerFactory.getLogger(ItemUtils.class);
    public static final String JMESA_ITEM = "jmesa-item";

    private ItemUtils() {
        // hide constructor
    }

    /**
     * Get the value from the Bean or Map by property.
     * 
     * @param item The Bean or Map.
     * @param property The Bean attribute or Map key.
     * @return The value from the Bean or Map.
     */
    public static Object getItemValue(Object item, String property) {
        Object itemValue = null;

        try {
            if (item instanceof Map) {
                itemValue = ((Map<?, ?>) item).get(property);
                if (itemValue != null) {
                    return itemValue;
                }

                // ports such as the tags will store the original bean
                Object bean = ((Map<?, ?>) item).get(JMESA_ITEM);                if (bean == null) {
                    logger.debug("the map does not have property " + property);
                    return null;
                }

                itemValue = getItemValue(bean, property);
            } else {
                itemValue = PropertyUtils.getProperty(item, property);
            }
        } catch (Exception e) {
            logger.debug("item class " + item.getClass().getName() + " does not have property " + property);
        }

        return itemValue;
    }

    /**
     * Get the Class for the property.
     * 
     * @param items The Collection of Beans or Maps.
     * @param property The Bean attribute or Map key.
     * @return The Class for the property.
     */
    public static Class<?> getPropertyClassType(Collection<?> items, String property)
        throws Exception {

        Object item = items.iterator().next();

        if (item instanceof Map) {
            for (Object object : items) {
                Map map = (Map) object;
                Object val = map.get(property);

                if (val == null) {
                    continue;
                }

                return val.getClass();
            }
        }

        return PropertyUtils.getPropertyType(item, property);
    }
}


分享到:
评论

相关推荐

    List转换为List

    本知识点重点讲解将List&lt;Bean&gt;转换为List&lt;Map&gt;的过程,这在进行Web开发、数据处理以及与前端交互等场景中非常常见。同时,也会涉及List&lt;Object&gt;转换为List&lt;Object&gt;及list转换为JsonArray的内容。 ### List&lt;Bean&gt;...

    将list转换成JavaBean

    将list&lt;Map&gt;转换成JavaBean的工具类

    List<Map<String, List>> data保存到SharedPreference和读取

    在上述代码中,`saveListMapsToSharedPreferences`方法将`List&lt;Map&lt;String, List&lt;String&gt;&gt;&gt;`转换为JSON字符串并保存到SharedPreference,`readListMapsFromSharedPreferences`则读取JSON字符串并反序列化回原数据...

    List<Long>转一维数组 Long[](csdn)————程序.pdf

    List&lt;Long&gt; ids = invoiceApiOrders.stream().map(InvoiceApiOrder::getId).collect(Collectors.toList()); /*创建数组*/ Long[] orderIds = new Long[ids.size()]; /*数组赋值*/ orderIds = ids.toArray(orderIds);...

    ResultSet 转为listmap

    ResultSet 转为 List&lt;Map&gt; 是一种常见的数据处理操作。在 Java 中,使用 JDBC 连接数据库时,通常会返回一个 ResultSet 对象,该对象包含了查询结果集的所有记录。为了方便数据处理和使用,我们需要将 ResultSet ...

    List转Json

    在Java编程中,将`List&lt;Object&gt;`转换...综上所述,将`List&lt;Object&gt;`转换为Json主要是通过引入如Jackson这样的JSON处理库,利用其提供的API进行序列化操作。理解和掌握这些知识点对于进行Java与JSON数据的交互至关重要。

    c# List类排序方法

    ### c# List&lt;T&gt;类排序方法 #### 一、初始工作与预备知识 在C#中,`List&lt;T&gt;`是一个非常常用的泛型集合类,它提供了动态数组的功能,可以存储任意数量的相同类型元素。当涉及到对List中的数据进行排序时,我们可以...

    List<Map>中英文排序

    支持一个List&lt;Map&gt;按照MAP中的一个或者多个Key的value值的中英文来排序,自动识别字符和数字(包括[a-zA-z]?[0-9]*)排序

    FreeMarker 遍历list

    在FreeMarker中,遍历`List&lt;Map&lt;String&gt;&gt;`是常见的操作,尤其在处理从后端传来的复杂数据结构时。这篇博客链接虽然无法直接访问,但从标题来看,我们可以推测其内容可能涉及如何在FreeMarker模板中遍历一个包含Map...

    Java 新版POI 读取excel文件信息返回List<List<String>>对象,包含文件内公式处理

    基于新版本的POI编写的读取Excel文件数据的工具类,可根据绝对路径、File对象、InputSteam对象读取解析Excel文件内容,并返回List&lt;List&lt;String&gt;&gt;格式结果,其中包含对单元格公式的处理。

    list转化成JSON字符串

    可将list&lt;T&gt;转化成JSON字符串 使用方法 例: List&lt;自定义类&gt; l; ListChangeToJson.ListChangeToJson classJson = new ListChangeToJson.ListChangeToJson(); classJson.ArrayToJsonAll(l, "数组名字");

    js模拟list和map

    javascript 模拟 java中的 List,Map&lt;br&gt;js文件为 js/utils.js&lt;br&gt;IE6.0 测试通过&lt;br&gt;&lt;br&gt;List:&lt;br&gt;add(var obj) //添加一个元素&lt;br&gt;remove(var index) //删除一个元素&lt;br&gt;get(var index) //获取一个元素&lt;br&gt;remove...

    C# XmlToList xml转换成对象,Xml转对象

    本文将深入探讨如何使用C#将XML文件内容转换为List&lt;T&gt;对象,以及涉及的两种实现方法。我们将主要关注以下知识点: 1. **XML解析基础**:C#中的System.Xml命名空间提供了一系列类来解析和操作XML文档,如XmlDocument...

    List&lt;map&gt;多字段组合排序

    List&lt;map&gt;,List&lt;Map&lt;String, Object&gt;&gt;,多字段组合排序。提供一个简易的思路,如果需要进行参考。

    C#+List+GridControl实现主从表嵌套

    本篇将深入探讨如何利用`C#`中的`List&lt;T&gt;`集合类以及DevExpress的`GridControl`控件实现主从表的嵌套显示,这在数据库操作和数据可视化中非常常见。 `List&lt;T&gt;`是.NET Framework中`System.Collections.Generic`命名...

    Java8 将List<Integer> 转换成以逗号分割的String字符串

    对于将`List&lt;Integer&gt;`转换为`String`,我们可以利用流的`reduce`方法或者`collect`配合`Collectors.joining`来实现。 1. 使用`reduce`方法: ```java List&lt;Integer&gt; numbers = Arrays.asList(1, 2, 3, 4, 5); ...

    spring,cxf,restful发布webservice传递List,Map,List&lt;Map&gt;

    2. **创建服务接口**:定义一个服务接口,声明接受List&lt;Map&lt;String, String&gt;&gt;参数的方法。 3. **实现服务逻辑**:实现接口,处理接收到的数据并返回响应。 4. **配置CXF**:在Spring配置文件中,配置CXF端点,指定...

    浅谈C#中ListT对象的深度拷贝问题

    一、List&lt;T&gt;对象中的T是值类型的情况(int 类型等) 对于值类型的List直接用以下方法就可以复制: List&lt;T&gt; oldList = new List&lt;T&gt;(); oldList.Add(..); List&lt;T&gt; newList = new List&lt;T&gt;(oldList); 二、List&lt;T&gt;对象...

    c#list添加数据

    标题“c#list&lt;&gt;添加数据”指的是如何向已经实例化的`List&lt;T&gt;`对象中添加数据。描述中提到“list&lt;&gt;.count==0”的情况,即列表为空时,需要向列表中添加数据。下面我们将详细讲解如何操作。 首先,我们来看代码中的`...

Global site tag (gtag.js) - Google Analytics