`

web获取参数值工具(改进,使用Callback)

阅读更多

     在前面的博客中写了一篇《自己封装的获取web端参数值工具》

     当时对具体获取值的逻辑进行的封装和抽象,如下:

    

    @SuppressWarnings("unchecked")  
    public static <T> T getValue(HttpServletRequest request, String paramName, T defaultValue, boolean notNull) throws ParamCheckException {  
        String paramValue = request.getParameter(paramName);  
        checkValue(paramName, paramValue, notNull);  
        if (paramValue != null) {  
            if (defaultValue instanceof Integer) {  
                return (T)(Integer.valueOf(paramValue));  
            }  
            if (defaultValue instanceof Double) {  
                return (T)(Double.valueOf(paramValue));  
            }  
            if (defaultValue instanceof Long) {  
                return (T)(Long.valueOf(paramValue));  
            }  
            if (defaultValue instanceof Float) {  
                return (T)(Float.valueOf(paramValue));  
            }  
            if (defaultValue instanceof String) {  
                return (T)(paramValue);  
            }  
        }  
        return defaultValue;  
    }  

    虽然进行了一定的封装和抽象,可是总是觉得缺少了一下优雅,感觉十分臃肿, 在深入学习了Callback模式后,对原来的代码进行了改进,如下是全部代码:

   

package com.malone.family.util;

import javax.servlet.http.HttpServletRequest;

import org.apache.commons.lang.StringUtils;

import com.malone.family.common.Pagination;
import com.malone.family.exception.ParamCheckException;

public class WebUtils {

	
	/**
	 * 获取int值
	 * @param request
	 * @param paramName
	 * @param defaultValue
	 * @return
	 */
	public static int getIntValue(HttpServletRequest request, String paramName, int defaultValue, boolean notNull) {
		return getValue(request, paramName, defaultValue, notNull, new WebUtilsCallback<Integer>(){
			public Integer doAction(String paramValue) {
				return Integer.valueOf(paramValue);
			}
		});
	}
	
	/**
	 * 所有方法的底层实现
	 * @param <T>
	 * @param request
	 * @param paramName
	 * @param defaultValue
	 * @param notNull
	 * @param action
	 * @return
	 * @throws ParamCheckException
	 */
	public static <T> T getValue(HttpServletRequest request, String paramName, T defaultValue, boolean notNull, WebUtilsCallback<T> action) throws ParamCheckException {
		String paramValue = request.getParameter(paramName);
		checkValue(paramName, paramValue, notNull);
		if (paramValue != null) {
			return action.doAction(paramValue);
		}
		return defaultValue;
	}
	
	/**
	 * 辅助方法
	 * @param paramValue
	 * @param notNull
	 */
	private static void checkValue(String paramName, String paramValue, boolean notNull) throws ParamCheckException {
		if (notNull && StringUtils.isBlank(paramValue)) {
			throw new ParamCheckException("请传递参数:" + paramName);
		}
	}
	
	/**
	 * 获取int值
	 * @param request
	 * @param paramName
	 * @param defaultValue
	 * @return
	 */
	public static int getIntValue(HttpServletRequest request, String paramName) {
		return getIntValue(request, paramName, -1, false);
	}
	
	/**
	 * 获取int值
	 * @param request
	 * @param paramName
	 * @param defaultValue
	 * @return
	 */
	public static int getIntValue(HttpServletRequest request, String paramName, int defaultValue) {
		return getIntValue(request, paramName, defaultValue, false);
	}
	
	/**
	 * 获取int值
	 * @param request
	 * @param paramName
	 * @param notNull
	 * @return
	 */
	public static int getIntValue(HttpServletRequest request, String paramName, boolean notNull) {
		return getIntValue(request, paramName, -1, false);
	}
	
	/**
	 * 返回字符串,默认返回""
	 * @param request
	 * @param paramName
	 * @return
	 */
	public static String getStringValue(HttpServletRequest request, String paramName) {
		return getStringValue(request, paramName, false);
	}
	
	/**
	 * 获取String值
	 * @param request
	 * @param paramName
	 * @param notNull
	 * @return
	 */
	public static String getStringValue(HttpServletRequest request, String paramName, boolean notNull) throws ParamCheckException {
		return getValue(request, paramName, "", notNull, new WebUtilsCallback<String>(){
			public String doAction(String paramValue) {
				return paramValue;
			}
		});
	}
	
	/**
	 * 获取double值
	 * @param request
	 * @param paramName
	 * @param defaultValue
	 * @return
	 */
	public static double getDoubleValue(HttpServletRequest request, String paramName, double defaultValue) {
		return getDoubleValue(request, paramName, defaultValue, false);
	}
	
	/**
	 * 获取double值
	 * @param request
	 * @param paramName
	 * @param defaultValue
	 * @return
	 */
	public static double getDoubleValue(HttpServletRequest request, String paramName, double defaultValue, boolean notNull) throws ParamCheckException {
		return getValue(request, paramName, defaultValue, notNull, new WebUtilsCallback<Double>(){
			public Double doAction(String paramValue) {
				return Double.valueOf(paramValue);
			}
		});
	}
	
	public static double getDoubleValue(HttpServletRequest request, String paramName,  boolean notNull) throws ParamCheckException {
		return getDoubleValue(request, paramName, -1, notNull);
	}
	
	/**
	 * 获取double值
	 * @param request
	 * @param paramName
	 * @return
	 */
	public static double getDoubleValue(HttpServletRequest request, String paramName) {
		return getDoubleValue(request, paramName, 0);
	}
	
	/**
	 * 获取boolean值
	 * @param request
	 * @param paramName
	 * @param defaultValue
	 * @return
	 */
	public static boolean getBooleanValue(HttpServletRequest request, String paramName, boolean defaultValue) {
		return getBooleanValue(request, paramName, defaultValue, false);
	}
	
	/**
	 * 获取boolean值
	 * @param request
	 * @param paramName
	 * @param defaultValue
	 * @param notNull
	 * @return
	 */
	public static boolean getBooleanValue(HttpServletRequest request, String paramName, boolean defaultValue, boolean notNull) {
		return getValue(request, paramName, defaultValue, notNull, new WebUtilsCallback<Boolean>(){
			public Boolean doAction(String paramValue) {
				if (paramValue.equals("true")) {
					return true;
				} 
				if (paramValue.equals("false")) {
					return false;
				}
				if (paramValue.equals("1")) {
					return true;
				} 
				if (paramValue.equals("0")) {
					return false;
				}
				return false;
			}
		});
	}
	
	/**
	 * 获取long值
	 * @param request
	 * @param paramName
	 * @param defaultValue
	 * @param notNull
	 * @return
	 */
	public static Long getLongValue(HttpServletRequest request, String paramName, long defaultValue, boolean notNull) {
		return getValue(request, paramName, defaultValue, notNull, new WebUtilsCallback<Long>(){
			public Long doAction(String paramValue) {
				return Long.valueOf(paramValue);
			}
		});
	}
	
	/**
	 * 获取long值
	 * @param request
	 * @param paramName
	 * @param notNull
	 * @return
	 */
	public static Long getLongValue(HttpServletRequest request, String paramName, boolean notNull) {
		return getLongValue(request, paramName, -1l, notNull);
	}
	
	/**
	 * 获取long值
	 * @param request
	 * @param paramName
	 * @param defaultValue
	 * @return
	 */
	public static Long getLongValue(HttpServletRequest request, String paramName, long defaultValue) {
		return getLongValue(request, paramName, defaultValue, false);
	}
	
	/**
	 * 获取boolean值
	 * @param request
	 * @param paramName
	 * @return
	 */
	public static boolean getBooleanValue(HttpServletRequest request, String paramName) {
		return getBooleanValue(request, paramName, false);
	}

	
}

    上面是工具类源码,如下是WebUtilsCallback源码:

   

package com.malone.family.util;

public interface WebUtilsCallback<T> {

	T doAction(String paramValue);
}

  

   可能上面代码有点多,下面逐点说明改动及用意:

   具体底层实现,改变前:

           

    @SuppressWarnings("unchecked")  
    public static <T> T getValue(HttpServletRequest request, String paramName, T defaultValue, boolean notNull) throws ParamCheckException {  
        String paramValue = request.getParameter(paramName);  
        checkValue(paramName, paramValue, notNull);  
        if (paramValue != null) {  
            if (defaultValue instanceof Integer) {  
                return (T)(Integer.valueOf(paramValue));  
            }  
            if (defaultValue instanceof Double) {  
                return (T)(Double.valueOf(paramValue));  
            }  
            if (defaultValue instanceof Long) {  
                return (T)(Long.valueOf(paramValue));  
            }  
            if (defaultValue instanceof Float) {  
                return (T)(Float.valueOf(paramValue));  
            }  
            if (defaultValue instanceof String) {  
                return (T)(paramValue);  
            }  
        }  
        return defaultValue;  
    }  

   改变后:

  

	/**
	 * 所有方法的底层实现
	 * @param <T>
	 * @param request
	 * @param paramName
	 * @param defaultValue
	 * @param notNull
	 * @param action
	 * @return
	 * @throws ParamCheckException
	 */
	public static <T> T getValue(HttpServletRequest request, String paramName, T defaultValue, boolean notNull, WebUtilsCallback<T> action) throws ParamCheckException {
		String paramValue = request.getParameter(paramName);
		checkValue(paramName, paramValue, notNull);
		if (paramValue != null) {
			return action.doAction(paramValue);
		}
		return defaultValue;
	}

   具体到每个返回类型的实现改动(以getLongValue为例):

  

	/**
	 * 获取long值
	 * @param request
	 * @param paramName
	 * @param defaultValue
	 * @param notNull
	 * @return
	 */
	public static Long getLongValue(HttpServletRequest request, String paramName, long defaultValue, boolean notNull) {
		return getValue(request, paramName, defaultValue, notNull, new WebUtilsCallback<Long>(){
			public Long doAction(String paramValue) {
				return Long.valueOf(paramValue);
			}
		});
	}

   getLongValue()和原来的相比,改动的是:在调用getValue方法时,增加了一个参数,一个Callback对象

 

   最主要和最核心的改动就如上所述,改动的出发点和用意:引进Callback模式,把相同的处理逻辑放到具体的底层,不同的逻辑实现回调到具体的方法,

本人感觉这也是callback的好处, 把相同的逻辑封装到同一处,不同的逻辑回调到具体的操作中(此想法源自在看spring源码 HibernateCallback源码)

 

以上是本人的想法和理解,如有不对的地方还请指正!

  

分享到:
评论

相关推荐

    WebKit和Chromium源码及原理剖析.pdf

    - 本文介绍了如何使用这些工具来探索WebCore中C++类的继承关系。 - **操作步骤**: - 使用IDA反汇编WebCore的二进制文件。 - 利用LLDB动态调试WebCore运行时的状态。 - 分析类的继承结构和成员函数。 #### 第...

    jQuery上学时候的笔记(私人珍藏,全是精华)

    jQuery作为一款流行的JavaScript库,自从2006年发布以来,一直在Web开发中占据着重要的地位。通过它的核心函数和方法,开发者可以更简洁、高效地操作DOM、处理事件、进行动画效果的制作以及实现Ajax交互等。由于...

    Laravel开发-sl-freespee

    Freespee提供实时通话数据、通话跟踪和分析,帮助开发者获取用户通话行为的详细信息。通过集成Freespee,开发者可以深入了解用户的行为,从而优化用户体验,提高转化率。 集成Freespee到Laravel项目的第一步是安装...

    httpclient.jar4.4及4.5版本和httpcore.jar和commons-logging.jar.rar

    最后,使用HttpClient的execute方法发送请求,并获取HttpResponse对象以处理响应。 在实际应用中,HTTPClient库的高级特性包括: 1. **多路复用**:HTTP/2协议支持多路复用,允许多个HTTP请求共享一个TCP连接,...

    Nodejs最新API文档

    7. **错误处理**:在Node.js中,错误通常通过回调函数的第一个参数传递,或者使用`try...catch`语句捕获。此外,`unhandledRejection`和`process.error`事件可以帮助检测未处理的Promise错误。 8. **性能优化**:...

    BingMapNodeJS:使用node.js做后端,暴露一些rest api路由,比如travelduration,然后使用bing map api获取实时路况信息和行程时间

    在本文中,我们将深入探讨如何使用Node.js作为后端服务器,并结合Bing Maps API来实现获取实时路况信息和行程时间的功能。首先,我们要明白Node.js是一个基于Chrome V8引擎的JavaScript运行环境,它允许开发者使用...

    php7.4中文手册.chm

    4. 函数引用作为默认参数值:函数现在可以接受另一个函数作为默认参数,这增加了代码的灵活性,例如`function foo(callable $callback = null) {}`。 5. 特性(Attributes):PHP7.4引入了一种新的元数据表示方式...

    HttpClient

    - **异步模式**:使用Future和Callback实现非阻塞的HTTP请求。 - **多线程支持**:在高并发环境下,可以通过多线程并发处理请求。 在Apache HttpClient的jar包中,`RELEASE_NOTES.txt`包含了版本更新的历史记录和...

    multiple-select-master

    3. **事件绑定**:通过`on(eventName, callback)`方法绑定事件处理器,例如`on('change', function(values) {...})`监听值变化。 四、实践应用 1. **基本使用**:在HTML中创建一个`&lt;select&gt;`元素,添加`multiple`...

    分页插件.jar

    最后,我们需要注意的是,虽然"beneverard-jqPagination"是一个强大的工具,但它并不处理数据的获取和处理。在实际应用中,我们需要配合服务器端接口或前端数据模拟来获取和展示数据。例如,你可以使用AJAX异步请求...

    jquery1.8.0 chm 中文手册

    《jQuery 1.8.0中文手册》是针对JavaScript库jQuery 1.8.0版本的详尽参考资料,旨在帮助开发者充分利用这一强大的工具。jQuery是一个轻量级、高性能的JavaScript库,它极大地简化了HTML文档遍历、事件处理、动画制作...

    jQuery1.7中文API

    4. **属性操作(Attributes)**:可以使用`$(selector).attr('attributeName')`获取属性值,`$(selector).attr('attributeName', 'value')`设置属性值,或者`$(selector).removeAttr('attributeName')`移除属性。...

    php网络开发完全手册

    1.6 几种开发工具的介绍 20 1.6.1 Vi及Vim 20 1.6.2 Eclipse+PHPEclipse插件 21 1.6.3 UltraEdit 21 1.6.4 EditPlus 22 1.6.5 支持PHP的IDE环境 22 1.7 小结 23 第2章 PHP的基础语法 24 2.1 语言构成与工作原理 24 ...

    jquery+jquery api

    jQuery,一个轻量级的JavaScript库,因其简洁的API和强大的功能,成为Web开发中广泛使用的工具。它极大地简化了HTML文档遍历、事件处理、动画制作以及Ajax交互等任务,使得JavaScript编程变得更加简单。本篇文章将...

    blog源码java-Native-JavaScript-ASYNC:博客专栏—原生js异步相关—对应案例源码(https://blog.cs

    Callback函数是早期处理异步的常见方式,它将函数作为参数传递,当异步操作完成时执行。Event Loop是JavaScript异步模型的核心,它负责调度回调函数的执行顺序。Web Workers允许在后台线程中运行脚本,处理大量计算...

    acegi的详细配置实现

    1. **CAS Version 2.0**:CAS 2.0是较新的版本,提供了更多的功能和改进的安全性。 综上所述,Acegi Security是一个功能强大且高度可配置的安全管理工具,它支持多种认证机制和授权策略,可以满足不同类型应用程序...

    openapi3.0

    OpenAPI 3.0是对2.0版本的升级,引入了多项改进和新特性,以适应现代Web API设计的需求。 在OpenAPI 3.0中,主要包含以下几个核心概念和特点: 1. **信息对象(Info Object)**:这是API的基本元数据,包括API的...

Global site tag (gtag.js) - Google Analytics