文档章节

提高生产力:SpringMVC中,使用扩展数据类型TypedMap接收Web请求参数

jtn
 jtn
发布于 2015/04/13 15:07
字数 1254
阅读 7
收藏 0
在Web项目中,如果前端MVC框架使用的是SpringMVC,可以使用Map接收前端请求参数,比bean要方便很多。

尤其是SpringMVC和Mybatis一起用的时候,用Map大大减少了需要的bean/vo/po之类的东东。

用Map也会遇到一个问题,就是类型转换的代码特别的多。
   

/**
     * 得到当前页面的页数
     */
    private int getCurrentPage(Map<String, Object> params){
        return Integer.parseInt(params.get(PageUtils.CURRENT_PAGE).toString());
    }



    从Map中获得一个Object类型的值,然后toString,再次转换为目标Integer等类型。
不够简洁,即使提取了工具方法,代码也还是有点繁琐。
   
    因此,我对Map进行了一次封装。(有人其实已经这么做了,我也是受到别人的启发,才决定进行封装的。 只不过,我需要简洁的符合自己偏好的而已。)
   
   
使用方式
   

@RequestMapping(value = "/list")
    @ResponseBody
    public PageVO list(@RequestParam TypedMap<String, Object> params) {
      Integer age = params.getInt("age");
      String name = params.getString("name");
    }



   
TypedMap代码实现

package cn.fansunion.common.collection; 

import java.util.Date;
import java.util.HashMap; 

import org.apache.commons.lang3.StringUtils; 

import cn.fansunion.common.converter.Integers;
import cn.fansunion.common.converter.Longs;
import cn.fansunion.common.util.TimeUtil; 

/**
* 带类型的Map,在Map的基础上,增加了getInt,getLong等工具方法。
*
* @author leiwen
*
*/
public class TypedMap<K, V> extends HashMap<K, V> {

    private static final long serialVersionUID = 1L; 

    /**
     * 从集合中获得一个Integer类型的值。
     *
     * @param key
     *            键
     * @param defaultValue
     *            默认值,如果根据key没有找到对应的值,使用该默认值
     * @return 该key对应的值或者为defaultValue
     */
   public Integer getInt(String key, Integer defaultValue) {
        Object v = get(key);
        Integer result = Integers.valueOf(v, defaultValue);
        return result;
    } 

    /**
     * 根据key获得Integer类型的值。
     *
     * @param key
     *            键
     * @return 该key对应的值,如果没有找到,则返回null
     */
    public Integer getInt(String key) {
        return getInt(key, null);
    } 

    /**
     * 从集合中获得一个String类型的值。
     *
     * @param key
     *            键
     * @param defaultValue
     *            默认值,如果根据key没有找到对应的值,使用该默认值
     * @return 该key对应的值或者为defaultValue
     */
    public String getString(String key, String defaultValue) { 

        Object value = get(key);
        if (value == null) {
            return defaultValue;
        } 

        String result = defaultValue;
        if (value instanceof String) {
            result = (String) value;
        } else {
            result = String.valueOf(value);
        }
        return result;
    } 

    /**
     * 根据key获得String类型的值。
     *
     * @param key
     *            键
     * @return 该key对应的值,如果没有找到,则返回null
     */
    public String getString(String key) {
        return getString(key, null);
    } 

    /**
     * 根据key获得Long类型的值。
     *
     * @param key
     *            键
     * @return 该key对应的值,如果没有找到,则返回null
     */
    public Long getLong(String key) {
        return getLong(key, null);
    } 

    /**
     * 从集合中获得一个Long类型的值。
     *
     * @param key
     *            键
     * @param defaultValue
     *            默认值,如果根据key没有找到对应的值,使用该默认值
     * @return 该key对应的值或者为defaultValue
     */
    public Long getLong(String key, Long defaultValue) {
        return Longs.valueOf(get(key), defaultValue);
    } 

    public Boolean getBoolean(String key, Boolean defaultValue) {
        Object value = get(key);
        if (value == null) {
            return defaultValue;
        }
        if (Boolean.class.isInstance(value)) {
            return (Boolean) value;
        } else {
            return defaultValue;
        }
    } 

    /**
     * 根据key获得Boolean类型的值
     *
     * @param key
     *            键
     * @return 该键对应的值,如果没有找到,返回null
     */
    public Boolean getBoolean(String key) {
        return getBoolean(key, null);
    } 

    /**
     * 从集合中获得一个Date类型的值。
     *
     * @param key
     *            键
     * @return 该key对应的值,如果没有找到,返回null
     */
    public Date getDate(String key) {
        return getDate(key, null);
    } 

    /**
     * 从集合中获得一个Date类型的值。
     *
     * @param key
     *            键
     * @param defaultValue
     *            默认值,如果根据key没有找到对应的值,使用该默认值
     * @return 该key对应的值或者为defaultValue
     */
    public Date getDate(String key, Date defualtValue) {
        Object value = get(key);
        if (value == null) {
            return null;
        } 

        if (value instanceof Date) {
            return (Date) value;
        } 

        else {
            String str = value.toString();
            if (StringUtils.isNotEmpty(str)) {
                return TimeUtil.parseYmdHms(key);
            } 

        }
        return defualtValue;
    } 

    /**
     * 根据key获得目标类型的值
     *
     * @param key
     *            键
     * @param type
     *            目标类型
     * @return 该键对应的值,如果没有找到,返回null
     */
    public <T> T getTypedObject(String key, T type) {
        Object value = get(key);
        if (value == null) {
            return null;
        }
        return (T) value;
    } 

}


TypedMap单元测试代码

package cn.fansunion.common.collection; 

import java.util.Date; 

import junit.framework.TestCase; 

import org.junit.Test; 

/**
* @author leiwen
*/
public class TypedMapTest extends TestCase {

    @Test
    public static void testGetInt() {
        TypedMap<String, Object> map = createMap(); 

        Integer value = 198962;
        map.put("intKey", value);
        assertEquals(value, map.getInt("intKey"));
        assertNull(map.getInt("notExistIntKey"));
    } 

    @Test
    public static void testGetIntWithDefaultValue() {
        TypedMap<String, Object> map = createMap();
        Integer defaultValue = 0;
        Integer value = 198962;
        map.put("intKey", value);
        assertEquals(value, map.getInt("intKey", defaultValue));
        assertEquals(defaultValue, map.getInt("notExistIntKey", defaultValue));
    } 

    @Test
    public static void testGetLong() {
        TypedMap<String, Object> map = createMap(); 

        Long value = 198962L;
        map.put("longKey", value);
        assertEquals(value, map.getLong("longKey"));
        assertNull(map.getLong("notExistLongKey"));
    } 

    @Test
    public static void testGetLongWithDefualtValue() {
        TypedMap<String, Object> map = createMap();
        Long defaultValue = 0L;
        Long value = 198962L;
        map.put("longKey", value);
        assertEquals(value, map.getLong("longKey", defaultValue));
        assertEquals(defaultValue, map.getLong("notExistLongKey", defaultValue));
    } 

    @Test
    public static void testGetString() {
        TypedMap<String, Object> map = createMap(); 

        String value = "http://FansUnion.cn";
        map.put("stringKey", value);
        assertEquals(value, map.getString("stringKey"));
        assertNull(map.getString("notExistStringKey"));
    } 

    @Test
    public static void testGetStringWithDefualtValue() {
        TypedMap<String, Object> map = createMap();
        String defaultValue = "leiwen";
        String value = "http://FansUnion.cn";
        map.put("stringKey", value);
        assertEquals(value, map.getString("stringKey", defaultValue));
        assertEquals(defaultValue,
                map.getString("notExistStringKey", defaultValue));
    } 

    @Test
    public static void testGetDate() {
        TypedMap<String, Object> map = createMap(); 

        Date value = new Date();
        map.put("dateKey", value);
        assertEquals(value, map.getDate("dateKey"));
        assertNull(map.getDate("notExistDateKey"));
    } 

    @Test
    public static void testGetDateWithDefualtValue() {
        TypedMap<String, Object> map = createMap();
        Date defaultValue = null;
        Date value = new Date();
        map.put("dateKey", value);
        assertEquals(value, map.getDate("dateKey", defaultValue));
        assertEquals(defaultValue, map.getDate("notExistDateKey", defaultValue));
    } 

    @Test
    public static void testGetBoolean() {
        TypedMap<String, Object> map = createMap(); 

        Boolean value = false;
        map.put("booleanKey", value);
        assertEquals(value, map.getBoolean("booleanKey"));
        assertNull(map.getBoolean("notExistBooleanKey"));
    } 

    @Test
    public static void testGetBooleanWithDefaultValue() {
        TypedMap<String, Object> map = createMap();
        Boolean defaultValue = false;
        Boolean value = true;
        map.put("booleanKey", value);
        assertEquals(value, map.getBoolean("booleanKey", defaultValue));
        assertEquals(defaultValue,
                map.getBoolean("notExistBooleanKey", defaultValue));
    } 

    @Test
    public static void testGetTypedObject() {
        TypedMap<String, Object> map = createMap();
        Integer value = 198962;
        map.put("intKey", value);
        assertEquals(value, map.getTypedObject("intKey", Integer.class)); 

    } 

    public static TypedMap<String, Object> createMap() {
        return new TypedMap<String, Object>();
    }
}



原文参见: 提高生产力:SpringMVC中,使用扩展数据类型TypedMap接收Web请求参数
相关阅读: 提高生产力

© 著作权归作者所有

jtn

jtn

粉丝 12
博文 879
码字总数 879609
作品 0
武汉
程序员
私信 提问
Spring MVC 实践 - Base

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/hanqing280441589/article/details/51831530 标签 : Java与Web Spring Web MVC Spring-Web-MVC是一种基于请求...

菜鸟-翡青
2016/07/05
0
0
JAVA学习笔记21——SpingMVC框架第一章

JAVA学习笔记21——SpingMVC框架第一章 Harries Blog™2017-12-210 阅读 ACESpringAppcatapachebeanAOPAction 前面学习了MyBatis的相关知识,今天带大家一起来学习一下关于表现层的另一个框架...

Harries Blog™
2017/12/21
0
0
阿里P7工作总结:Spring MVC的工作原理,看完受益匪浅

这篇文章将深入探讨Spring框架的一部分——Spring Web MVC的强大功能及其内部工作原理。 项目安装 在本文中,我们将使用最新、最好的Spring Framework 5。我们将重点介绍Spring的经典Web堆栈...

Java架构资源分享
06/27
119
0
SpringMVC+Spring+Mybatis整合应用(3)

实现图片上传 需求:在用户注册页面实现上传图片作为用户头像 1. springmvc中对多部件类型请求数据解析:在页面form中提交enctype="multipart/form-data"的数据时,需要springmvc对multipart...

江左煤郎
2018/12/03
32
0
Spring MVC 执行过程详解

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 https://blog.csdn.net/Rsx/article/details/96309840 文章目录 Spring MVC简述 大部分Java应...

不专业得Cook
07/17
0
0

没有更多内容

加载失败,请刷新页面

加载更多

spring源码分析6: ApplicationContext的初始化与BeanDefinition的搜集入库

先前几篇都是概念的讲解:回顾下 BeanDefinition 是物料 Bean是成品 BeanFactory是仓库,存储物料与成品 ApplicationContext初始化搜集物料入库,触发生产线,取出物料生产Bean 本文研究spr...

星星之焱
20分钟前
5
0
彻底解决tomcat乱码问题

本地项目请求访问,浏览器中文输出没问题。 部署到服务器上面之后,返回到浏览器的中文就乱码了。 尝试办法: 1.修改tomcat下的conf中的service.xml中的配置信息: 重新启动后,没有效果还是...

诗书易经
36分钟前
5
0
Java开发需要掌握的IDEA插件大全

1、Lombok 解释:这是最基本的插件,2017年就火了,还没用的百度一下吧。 博客链接:Intellij IDEA 安装lombok及使用详解 2、PlantUML integration 解释:各种类之间的关联图,高级开发必备。...

木九天
37分钟前
6
0
python学习10.05:Python range()快速初始化数字列表

实际场景中,经常需要存储一组数字。例如在游戏中,需要跟踪每个角色的位置,还可能需要跟踪玩家的几个最高得分。在数据可视化中,处理的几乎都是由数字(如温度、距离、人口数量、经度和纬度...

太空堡垒185
44分钟前
4
0
java单元测试,PowerMockito模拟方法内new对象

在做单元测试中有时候需要对方法内new出来的对象进行隔离,这是我们需要使用PowerMockito。 添加依赖 <dependency> <groupId>org.powermock</groupId> <artifactId>......

如梦之猿
46分钟前
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部