1.在 SpringMVC在控制层中获取参数的使用,使用map的结构在控制层中获取参数是一个很方便,并且可以适应前端传递过来的参数,不需要提前知道参数名称,也可以对一些必要参数进行包装加工,比如模糊查询,就可以在前端约定好参数名称下对该参数前后加% ,这样传递到dao里面就不需要重复操作, 下面贴上源码:
public Map getKeyAndValue(HttpServletRequest request) {
Map param=new HashMap();
Enumeration ens=request.getParameterNames();
while (ens.hasMoreElements()) {
String key = ens.nextElement();
String newkey = null;
//去除参数中的前缀,在jsp表单中,事先对每个参数设置的前缀
String[] key_prefix=key.split(getPreFixBySession(request));
if (key_prefix.length>1) {
newkey=key.substring(getPreFixBySession(request).length(), key.length());
}else{
newkey=key;
}
if (StringUtils.isNotBlank(request.getParameter(key))) {
param.put(newkey, request.getParameter(key).trim());
}else{
param.put(newkey, request.getParameter(key));
}
}
param.remove("_");//去除一些无用的参数
param.remove("math");
return param;
}
使用该方法获取的参数可以直接传递到dao中进行数据保存操作,
在service中也可以对map中的key和value进行循环,自动生成sql语句,进行数据存储,
从而到达了,在前端页面input上写好name,js部分使用jquery的序列化提交,后台使用该方法进行获取数据,,,从而大大的减少了重复代码的编写量,从而提高了开发效率,还增加了更多的可变,可以任意在前端页面增加和减少参数,做到完全不需要修改后台和js代码
下面是在查询时的衍生代码:
public Map<String,Object> getKeyAndValueQuery(HttpServletRequest request) {
Map<String,Object> param=new HashMap<String, Object>();
Enumeration<String> ens=request.getParameterNames();
while (ens.hasMoreElements()) {
String key = ens.nextElement();
if (StringUtils.isNotBlank(request.getParameter(key))) {
param.put(key, request.getParameter(key).trim());
}
}
if (param.get("searchKey")!=null&¶m.get("searchKey")!="") {
if (!param.get("searchKey").toString().startsWith("%")) {
param.put("searchKey", "%"+param.get("searchKey")+"%");
}
}else{
param.remove("searchKey");
}
if (param.get("beginDate")!=null&&isMapKeyNull(param, "beginTime")) {
String sourceBegin=param.get("beginDate").toString()+" 00:00:00.000";
param.put("beginTime", sourceBegin);
}
if (param.get("endDate")!=null&&isMapKeyNull(param, "endTime")) {
String sourceEnd=param.get("endDate").toString()+" 23:59:59.999";
param.put("endTime", sourceEnd);
}
if(isMapKeyNull(param, "rows")){
param.put("rows",10);
}
param.remove("ver");
return param;
}
在后台查询的时候也可以通过该方法对前端传递过来的参数进行包装或补全,
使用以上方法在项目中就可以做到不需要修改后台Java代码,从而达到程序的改变,也不需要进行服务器重启
下面在介绍一下自动生成sql:
public String getInsertSql(String table, Map<String, Object> map) {
StringBuffer buffer = new StringBuffer("insert into ").append(table).append("(");
StringBuffer key = new StringBuffer();
StringBuffer val = new StringBuffer();
Object[] objs = map.keySet().toArray();
Collection<Object> c = map.values();
Object[] vals = c.toArray();
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss",
Locale.CHINA);
for (int i = 0; i < vals.length; i++) {
if (vals[i] != null &&!"".equals(vals[i])) {
key.append(objs[i]).append(",");
if (vals[i] instanceof Date) {
val.append("'").append(format.format((Date) vals[i]))
.append("',");
} else {
if (vals[i]!=null) {
vals[i]=vals[i].toString().trim();
}
val.append("'").append(vals[i]).append("',");
}
}
}
key=key.delete(key.length() - 1, key.length());
val.delete(val.length() - 1, val.length());
buffer.append(key);
buffer.append(")values(");
buffer.append(val);
buffer.append(")");
return buffer.toString();
}
也可以将上面的方法演变成预编译模式sql语句的生成
在dao中接口的申明也要尽量使用map,这样再从前端传递到dao中的参数个数和名称也不需要改变后台代码,只需要在xml中对sql语句进行操作,可以自由的增加和减少参数的传递,大大提高了系统的可维护性.