在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请求参数
相关阅读: 提高生产力

提高生产力:SpringMVC中,使用扩展数据类型TypedMap接收Web请求参数的更多相关文章

  1. springMvc源码学习之:spirngMVC获取请求参数的方法2

    @RequestParam,你一定见过:@PathVariable,你肯定也知道:@QueryParam,你怎么会不晓得?!还有你熟悉的他 (@CookieValue)!她(@ModelAndView ...

  2. QT 信号槽connect中解决自定义数据类型或数组作为函数参数的问题——QT qRegisterMetaType 注册MetaType——关键:注册自定义数据类型或QMap等容器类

    一般情况下信号槽直接连接方式不会出现问题,但是如果信号与槽在不同线程或Qt::QueuedConnection方式连接,可能会在连接期间报以下类似问题,如: QObject::connect: Can ...

  3. springMvc源码学习之:spirngMvc获取请求参数的方法

    一.      通过@PathVariabl获取路径中的参数 @RequestMapping(value="user/{id}/{name}",method=RequestMeth ...

  4. springMVC(spring)+WebSocket案例(获取请求参数)

    开发环境(最低版本):spring 4.0+java7+tomcat7.0.47+sockjs 前端页面要引入: <script src="http://cdn.jsdelivr.ne ...

  5. SpringMVC中使用RedirectAttributes重定向传参,防止暴露参数

    RedirectAttributes是SpringMVC3.1版本之后出来的一个功能,专门用于重定向之后还能带参数跳转的. 当我从jsp页面函数中带参数到controller层方法,方法执行完毕后返回 ...

  6. [置顶] 提高生产力:Web开发基础平台WebCommon的设计和实现

    Web开发中,存在着各种各样的重复性的工作.为了提高开发效率,不在当码农,我在思考和实践如何搭建一个Web开发的基础平台. Web开发基础平台的目标和功能 1.提供一套基础的开发环境,整合了常用的框架 ...

  7. 提高生产力:Web开发基础平台WebCommon的设计和实现

    Web开发中,存在着各种各样的重复性的工作.为了提高开发效率,不在当码农,我在思考和实践如何搭建一个Web开发的基础平台. Web开发基础平台的目标和功能 1.提供一套基础的开发环境,整合了常用的框架 ...

  8. Spring|SpringMVC中的注解

    文章目录 一.Spring注解 @Controller @ResuController @Service @Autowired @RequestMapping @RequestParam @Model ...

  9. 提高生产力:Web前端验证的标准化

    统一验证标准,减少重复劳动,提高生产力. 当公司内部有多个Web项目的时候,统一验证标准就很有必要了.统一不同项目的验证规则,比如 同为用户名 使用同一套标准,甚至用户名和机构名等也使用同一套标准.( ...

随机推荐

  1. Ruby 读取文件

    Ruby 读取文件 一次全读出来 textAll = File.read("fileName.txt") puts textAll 一次读取一行 file = File.open( ...

  2. hdu1542 Atlantis(扫描线+线段树+离散)矩形相交面积

    题目链接:点击打开链接 题目描写叙述:给定一些矩形,求这些矩形的总面积.假设有重叠.仅仅算一次 解题思路:扫描线+线段树+离散(代码从上往下扫描) 代码: #include<cstdio> ...

  3. JavaFX本地应用自己主动更新功能的实现FXLauncher

    JavaFX本地应用自己主动更新功能的实现--FXLauncher 作者:chszs,未经博主同意不得转载.经许可的转载需注明作者和博客主页:http://blog.csdn.net/chszs 一. ...

  4. RecyclerView的使用(1)之HelloWorld

    原创文章.转载请注明 http://blog.csdn.net/leejizhou/article/details/50670657 RecyclerView是伴随Android 5.0公布的新控件, ...

  5. 不使用系统自带的button

    // //  LKTitleBtn.m //  01-彩票 // //  Created by Lenny  on 3/17/15. //  Copyright (c) 2015 Lenny. All ...

  6. 【移动开发】布局优化利器&lt;include/&gt;和ViewStub

    本文翻译自<50 android hacks> 当创建复杂的布局的时候.有时候会发现加入了非常多的ViewGroup和View.随之而来的问题是View树的层次越来越深,应用也变的越来越慢 ...

  7. luogu2714 四元组统计 莫比乌斯反演 组合数

    题目大意 给出一段序列,求其中最大公约数为1的四元组的个数. 思路 我们要用到反演.正难则反的思想.对于每一个大于1的数字\(x\),求出最大公约数为\(x\)的四元组的个数\(g(x)\),然后用排 ...

  8. Uva 11754(枚举+中国剩余定理)

    #include<iostream> #include<cstdio> #include<cmath> #include<cstring> #inclu ...

  9. php---依赖倒转(反转控制)原则

    一.简介 依赖注入和控制反转说的实际上是同一个东西,它们是一种设计模式,这种设计模式用来减少程序间的耦合 优点:使用依赖注入,最重要的一点好处就是有效的分离了对象和它所需要的外部资源,使得它们松散耦合 ...

  10. golang iris下面的websocket

    最近要做后台主动推送:(iris框架,封装的有wesocket,刚开始以为直接拿过来用,结果不是现在贴一下代码,写一下遇到的坑) func main() {    app := iris.New()  ...