JFinalのControllerのgetModelメソッドに接頭辞を付けない変数名をサポートさせ、extjsなどで使いやすい

4746 ワード

このインプリメンテーションでは、JFinalソースコードを変更する必要があります.現在、このコードインプリメンテーションはJFinalにコミットされています.次のバージョンでこの機能が追加されると推定されます.事前に使いたいのは、自分でコードを修正してjfinalを再コンパイルしましょう.
修正com.jfinal.CoreパッケージのModelInjector.JAvaファイル、(すべてを置換)
/**
 * Copyright (c) 2011-2015, James Zhan    ([email protected]).
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.jfinal.core;

import java.lang.reflect.Method;
import java.util.Map;
import java.util.Map.Entry;
import javax.servlet.http.HttpServletRequest;
import com.jfinal.kit.StrKit;
import com.jfinal.plugin.activerecord.ActiveRecordException;
import com.jfinal.plugin.activerecord.Model;
import com.jfinal.plugin.activerecord.Table;
import com.jfinal.plugin.activerecord.TableMapping;

/**
 * ModelInjector
 */
final class ModelInjector {
	
	@SuppressWarnings("unchecked")
	public static <T> T inject(Class<?> modelClass, HttpServletRequest request, boolean skipConvertError) {
		String modelName = modelClass.getSimpleName();
		return (T)inject(modelClass, StrKit.firstCharToLowerCase(modelName), request, skipConvertError);
	}
	
	@SuppressWarnings({ "rawtypes", "unchecked" })
	public static final <T> T inject(Class<?> modelClass, String modelName, HttpServletRequest request, boolean skipConvertError) {
		Object model = null;
		try {
			model = modelClass.newInstance();
		} catch (Exception e) {
			throw new RuntimeException(e);
		}
		
		if (model instanceof Model)
			injectActiveRecordModel((Model)model, modelName, request, skipConvertError);
		else
			injectCommonModel(model, modelName, request, modelClass, skipConvertError);
		
		return (T)model;
	}
	
	private static final void injectCommonModel(Object model, String modelName, HttpServletRequest request, Class<?> modelClass, boolean skipConvertError) {
		Method[] methods = modelClass.getMethods();
		// modelName null  “” ,     
		String modelNameAndDot = "";
		if(StrKit.notBlank(modelName)){
			modelNameAndDot= modelName + ".";
		}
		for (Method method : methods) {
			String methodName = method.getName();
			if (methodName.startsWith("set") == false)	// only setter method
				continue;
			
			Class<?>[] types = method.getParameterTypes();
			if (types.length != 1)						// only one parameter
				continue;
			
			String attrName = methodName.substring(3);
			String value = request.getParameter(modelNameAndDot + StrKit.firstCharToLowerCase(attrName));

			if (value != null) {
				try {
					method.invoke(model, TypeConverter.convert(types[0], value));
				} catch (Exception e) {
					if (skipConvertError == false)
					throw new RuntimeException(e);
				}
			}
		}
	}
	
	@SuppressWarnings("rawtypes")
	private static final void injectActiveRecordModel(Model<?> model, String modelName, HttpServletRequest request, boolean skipConvertError) {
		
		// modelName null  “” ,     
		String modelNameAndDot = "";
		if(StrKit.notBlank(modelName)){
			modelNameAndDot= modelName + ".";
		}
		Table table = TableMapping.me().getTable(model.getClass());
		Map<String, Class<?>> columnTypeMap = table.getColumnTypeMap();
		Map<String, String[]> parasMap = request.getParameterMap();
		//       
		for(Entry<String, Class<?>> entry: columnTypeMap.entrySet()){
			String key = modelNameAndDot + entry.getKey();
			//request         
			if(parasMap.containsKey(key)){
				Class colType = entry.getValue();
				String[] paraValue = parasMap.get(key);
				try {
					// Object value = Converter.convert(colType, paraValue != null ? paraValue[0] : null);
					Object value = paraValue[0] != null ? TypeConverter.convert(colType, paraValue[0]) : null;
					model.set(entry.getKey(), value);
				} catch (Exception ex) {
					if (skipConvertError == false)
						throw new RuntimeException("Can not convert parameter: " + key, ex);
				}
			}
		}
	}
}

使用方法:
getModel(Model.class,"")
2番目のパラメータが空の場合は、接頭辞を付けない属性値を取得し、部位が空の場合は対応する接頭辞の属性値を取得することを示します.
仮定User.classにはusername,passwordの2つの属性がある.
たとえばgetModel(User.class,")では、username、passwordプロパティが取得されます.
getModel(User.class,“user”)は、userを取得します.username,user.passwordプロパティ.