关于Injector类的一些看法

类全路径: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


把表单内容处理成listmodel对象

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;

}


可以很好处理此类的表单提交,转换成listmodel对象。


但是应用在另一个场景,如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类就不能很好的处理了。

查看源码发现

图片1.png

关键问题出现在这里

图片2.png

我做了如下暴力处理之后就可以正确返回listmodel对象。



原方法:

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;
}









评论区

热门反馈

扫码入社