类全路径:com.jfinal.core.Injector
表单内容
<input type="hidden" name="groupList[0].ids" value="111"/>
<input type="text" name="groupList[0].names" value="222"/>
<input type="hidden" name="groupList[1].ids" value="333"/>
<input type="text" name="groupList[1].names" value="444"/>
提交表单
Parameter : groupList[0].ids=111 groupList[0].names=222 groupList[0].ids=333 groupList[0].names=444
把表单内容处理成list的model对象
List<Group> groupList = ToolModelInjector.injectModels(getRequest(), Group.class, "groupList");
处理类方法
public static <T extends Model<T>> List<T> injectModels(final HttpServletRequest request, Class<? extends T> modelClass, String prefix) {
int index = 0;
String arrayPrefix = prefix + "[";
String key = null;
Enumeration<String> names = request.getParameterNames();
while (names.hasMoreElements()) {
key = names.nextElement();
if (key.startsWith(arrayPrefix) && key.indexOf("]") != -1) {
int indexTemp = Integer.parseInt(key.substring(key.indexOf("[") + 1, key.indexOf("]")));
if(indexTemp > index){
index = indexTemp; // 找到最大的数组索引
}
}
}
List<T> modelList = new ArrayList<T>();
for (int i = 0; i <= index; i++) {
T baseModel = (T) Injector.injectModel(modelClass, prefix + "[" + i + "]", request, false);
modelList.add(baseModel);
}
return modelList;
}
可以很好处理此类的表单提交,转换成list的model对象。
但是应用在另一个场景,如json提交
var postData = {
groupList:[
{ids:"111", names:"222"},
{ids:"333", names:"444"},
]
}
$http.post(url, postData)
.success(function(data, status, headers, config){
$scope.msg = data;
});
提交表单
Parameter : groupList[0][ids]=111 groupList[0][names]=222 groupList[0][ids]=333 groupList[0][names]=444
这个情况com.jfinal.core.Injector类就不能很好的处理了。
查看源码发现
关键问题出现在这里
我做了如下暴力处理之后就可以正确返回list的model对象。
原方法:
if (modelNameAndDot != null) {
if (paraName.startsWith(modelNameAndDot)) {
attrName = paraName.substring(modelNameAndDot.length(), paraName.length()-1);
} else {
continue ;
}
} else {
attrName = paraName;
}
个人觉得应该先对modelName进行判空处理
paraName.startsWith(modelNameAndDot)
在此方法之前paraName是不是需要先用正则匹配一下
groupList[0].ids
groupList[0][ids]
无非出现这两类情况
一类情况处理方法
attrName = paraName.substring(modelNameAndDot.length());
二类情况处理方法
attrName = paraName.substring(modelNameAndDot.length(), paraName.length()-1);
这样这个方法就能兼容表单提交和json提交。
if (StrKit.notBlank(modelName)) {
// 判断 paraName 的格式
if (场景一) {
String modelNameAndDot = modelName + ".";
attrName = paraName.substring(modelNameAndDot.length());
} else if(场景二) {
String modelNameAndDot = modelName + "[";
attrName = paraName.substring(modelNameAndDot.length(), paraName.length()-1);
} else {
continue ;
}
} else {
attrName = paraName;
}
或者做简单处理
String modelNameAndDot1 = StrKit.notBlank(modelName) ? modelName + "." : null; String modelNameAndDot2 = StrKit.notBlank(modelName) ? modelName + "[" : null; if (modelNameAndDot != null) { if (paraName.startsWith(modelNameAndDot1)) { attrName = paraName.substring(modelNameAndDot.length()); } else if(paraName.startsWith(modelNameAndDot2)) { attrName = paraName.substring(modelNameAndDot.length(), paraName.length()-1); } else { continue ; } } else { attrName = paraName; }