在前面的博客中写了一篇《自己封装的获取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源码)
以上是本人的想法和理解,如有不对的地方还请指正!