浏览代码

JFinal 1.1.6 release :)

JamesZhan 13 年之前
父节点
当前提交
94f4cbf9f1
共有 44 个文件被更改,包括 225 次插入80 次删除
  1. 3 3
      src/com/jfinal/config/Constants.java
  2. 4 4
      src/com/jfinal/config/JFinalConfig.java
  3. 11 11
      src/com/jfinal/core/ActionMapping.java
  4. 1 1
      src/com/jfinal/core/Const.java
  5. 1 1
      src/com/jfinal/core/Controller.java
  6. 3 3
      src/com/jfinal/core/JFinal.java
  7. 1 1
      src/com/jfinal/core/ModelInjector.java
  8. 1 1
      src/com/jfinal/ext/handler/ContextPathHandler.java
  9. 1 1
      src/com/jfinal/ext/handler/FakeStaticHandler.java
  10. 1 1
      src/com/jfinal/ext/handler/UrlSkipHandler.java
  11. 53 0
      src/com/jfinal/ext/kit/DateKit.java
  12. 1 1
      src/com/jfinal/ext/util/SessionIdGenerator.java
  13. 5 0
      src/com/jfinal/ext/plugin/redis/RedisKit.java
  14. 14 0
      src/com/jfinal/ext/plugin/redis/RedisPlugin.java
  15. 11 0
      src/com/jfinal/ext/plugin/shiro/ShiroInterceptor.java
  16. 14 0
      src/com/jfinal/ext/plugin/shiro/ShiroPlugin.java
  17. 2 1
      src/com/jfinal/ext/render/CaptchaRender.java
  18. 2 2
      src/com/jfinal/ext/render/JsonWithContentTypeRender.java
  19. 15 0
      src/com/jfinal/ext/render/StaticHtmlRender.java
  20. 1 1
      src/com/jfinal/util/HandlerKit.java
  21. 6 2
      src/com/jfinal/util/JsonBuilder.java
  22. 5 5
      src/com/jfinal/util/PathUtil.java
  23. 1 1
      src/com/jfinal/util/StringKit.java
  24. 4 0
      src/com/jfinal/log/Logger.java
  25. 12 5
      src/com/jfinal/plugin/activerecord/CaseInsensitiveContainerFactory.java
  26. 1 1
      src/com/jfinal/plugin/activerecord/Model.java
  27. 1 1
      src/com/jfinal/plugin/activerecord/Record.java
  28. 2 2
      src/com/jfinal/plugin/activerecord/TableInfo.java
  29. 4 0
      src/com/jfinal/plugin/activerecord/dialect/Dialect.java
  30. 4 0
      src/com/jfinal/plugin/activerecord/dialect/OracleDialect.java
  31. 1 1
      src/com/jfinal/plugin/activerecord/tx/TxByRegex.java
  32. 1 1
      src/com/jfinal/plugin/c3p0/C3p0Plugin.java
  33. 1 1
      src/com/jfinal/plugin/druid/DruidPlugin.java
  34. 1 1
      src/com/jfinal/plugin/druid/DruidStatViewHandler.java
  35. 16 1
      src/com/jfinal/plugin/ehcache/CacheKit.java
  36. 2 2
      src/com/jfinal/plugin/spring/SpringPlugin.java
  37. 1 4
      src/com/jfinal/render/Error404Render.java
  38. 1 4
      src/com/jfinal/render/Error500Render.java
  39. 2 2
      src/com/jfinal/render/FileRender.java
  40. 4 4
      src/com/jfinal/render/JsonRender.java
  41. 2 2
      src/com/jfinal/render/RenderFactory.java
  42. 2 2
      src/com/jfinal/server/JettyServer.java
  43. 5 5
      src/com/jfinal/server/ServerFactory.java
  44. 1 1
      src/com/jfinal/token/TokenManager.java

+ 3 - 3
src/com/jfinal/config/Constants.java

@@ -19,14 +19,14 @@ package com.jfinal.config;
 import java.io.File;
 import java.util.Locale;
 import com.jfinal.core.Const;
+import com.jfinal.kit.PathKit;
+import com.jfinal.kit.StringKit;
 import com.jfinal.log.ILoggerFactory;
 import com.jfinal.log.Logger;
 import com.jfinal.render.IMainRenderFactory;
 import com.jfinal.render.RenderFactory;
 import com.jfinal.render.ViewType;
 import com.jfinal.token.ITokenCache;
-import com.jfinal.util.PathUtil;
-import com.jfinal.util.StringKit;
 
 /**
  * The constant for JFinal runtime.
@@ -193,7 +193,7 @@ final public class Constants {
 		
 		if (!fileRenderPath.startsWith("/") && !fileRenderPath.startsWith(File.separator))
 			fileRenderPath = File.separator + fileRenderPath;
-		this.fileRenderPath = PathUtil.getWebRootPath() + fileRenderPath;
+		this.fileRenderPath = PathKit.getWebRootPath() + fileRenderPath;
 	}
 	
 	/**

+ 4 - 4
src/com/jfinal/config/JFinalConfig.java

@@ -22,8 +22,8 @@ import java.io.FileNotFoundException;
 import java.io.IOException;
 import java.io.InputStream;
 import java.util.Properties;
-import com.jfinal.util.PathUtil;
-import com.jfinal.util.StringKit;
+import com.jfinal.kit.PathKit;
+import com.jfinal.kit.StringKit;
 
 /**
  * JFinalConfig.
@@ -83,9 +83,9 @@ public abstract class JFinalConfig {
 		InputStream inputStream = null;
 		String fullFile;	// String fullFile = PathUtil.getWebRootPath() + file;
 		if (file.startsWith(File.separator))
-			fullFile = PathUtil.getWebRootPath() + File.separator + "WEB-INF" + file;
+			fullFile = PathKit.getWebRootPath() + File.separator + "WEB-INF" + file;
 		else
-			fullFile = PathUtil.getWebRootPath() + File.separator + "WEB-INF" + File.separator + file;
+			fullFile = PathKit.getWebRootPath() + File.separator + "WEB-INF" + File.separator + file;
 		
 		try {
 			inputStream = new FileInputStream(new File(fullFile));

+ 11 - 11
src/com/jfinal/core/ActionMapping.java

@@ -38,7 +38,7 @@ final class ActionMapping {
 	private Routes routes;
 	private Interceptors interceptors;
 	
-	private final Map<String, Action> actionMapping = new HashMap<String, Action>();
+	private final Map<String, Action> mapping = new HashMap<String, Action>();
 	
 	ActionMapping(Routes routes, Interceptors interceptors) {
 		this.routes = routes;
@@ -80,19 +80,19 @@ final class ActionMapping {
 						if (!actionKey.startsWith(SLASH))
 							actionKey = SLASH + actionKey;
 						
-						if (actionMapping.containsKey(actionKey)) {
+						if (mapping.containsKey(actionKey)) {
 							warnning(actionKey, controllerClass, method);
 							continue;
 						}
 						
 						Action action = new Action(controllerKey, actionKey, controllerClass, method, methodName, actionInters, routes.getViewPath(controllerKey));
-						actionMapping.put(actionKey, action);
+						mapping.put(actionKey, action);
 					}
 					else if (methodName.equals("index")) {
 						String actionKey = controllerKey;
 						
 						Action action = new Action(controllerKey, actionKey, controllerClass, method, methodName, actionInters, routes.getViewPath(controllerKey));
-						action = actionMapping.put(actionKey, action);
+						action = mapping.put(actionKey, action);
 						
 						if (action != null) {
 							warnning(action.getActionKey(), action.getControllerClass(), action.getMethod());
@@ -101,22 +101,22 @@ final class ActionMapping {
 					else {
 						String actionKey = controllerKey.equals(SLASH) ? SLASH + methodName : controllerKey + SLASH + methodName;
 						
-						if (actionMapping.containsKey(actionKey)) {
+						if (mapping.containsKey(actionKey)) {
 							warnning(actionKey, controllerClass, method);
 							continue;
 						}
 						
 						Action action = new Action(controllerKey, actionKey, controllerClass, method, methodName, actionInters, routes.getViewPath(controllerKey));
-						actionMapping.put(actionKey, action);
+						mapping.put(actionKey, action);
 					}
 				}
 			}
 		}
 		
 		// support url = controllerKey + urlParas with "/" of controllerKey
-		Action actoin = actionMapping.get("/");
+		Action actoin = mapping.get("/");
 		if (actoin != null)
-			actionMapping.put("", actoin);
+			mapping.put("", actoin);
 	}
 	
 	private static final void warnning(String actionKey, Class<? extends Controller> controllerClass, Method method) {
@@ -137,7 +137,7 @@ final class ActionMapping {
 	 * 4: http://abc.com/controllerKey/method/para     ---> 11
 	 */
 	Action getAction(String url, String[] urlPara) {
-		Action action = actionMapping.get(url);
+		Action action = mapping.get(url);
 		if (action != null) {
 			return action;
 		}
@@ -145,7 +145,7 @@ final class ActionMapping {
 		// --------
 		int i = url.lastIndexOf(SLASH);
 		if (i != -1) {
-			action = actionMapping.get(url.substring(0, i));
+			action = mapping.get(url.substring(0, i));
 			urlPara[0] = url.substring(i + 1);
 		}
 		
@@ -153,7 +153,7 @@ final class ActionMapping {
 	}
 	
 	List<String> getAllActionKeys() {
-		List<String> allActionKeys = new ArrayList<String>(actionMapping.keySet());
+		List<String> allActionKeys = new ArrayList<String>(mapping.keySet());
 		Collections.sort(allActionKeys);
 		return allActionKeys;
 	}

+ 1 - 1
src/com/jfinal/core/Const.java

@@ -24,7 +24,7 @@ import com.jfinal.render.ViewType;
  */
 public interface Const {
 	
-	String JFINAL_VERSION = "1.1.5";
+	String JFINAL_VERSION = "1.1.6";
 	
 	ViewType DEFAULT_VIEW_TYPE = ViewType.FREE_MARKER;
 	

+ 1 - 1
src/com/jfinal/core/Controller.java

@@ -29,11 +29,11 @@ import javax.servlet.http.HttpServletResponse;
 import javax.servlet.http.HttpSession;
 import static com.jfinal.core.Const.I18N_LOCALE;
 import com.jfinal.i18n.I18N;
+import com.jfinal.kit.StringKit;
 import com.jfinal.render.Render;
 import com.jfinal.render.RenderFactory;
 import com.jfinal.upload.MultipartRequest;
 import com.jfinal.upload.UploadFile;
-import com.jfinal.util.StringKit;
 
 /**
  * Controller

+ 3 - 3
src/com/jfinal/core/JFinal.java

@@ -24,6 +24,7 @@ import com.jfinal.config.JFinalConfig;
 import com.jfinal.handler.Handler;
 import com.jfinal.handler.HandlerFactory;
 import com.jfinal.i18n.I18N;
+import com.jfinal.kit.PathKit;
 import com.jfinal.plugin.IPlugin;
 import com.jfinal.plugin.activerecord.ActiveRecordPlugin;
 import com.jfinal.render.RenderFactory;
@@ -31,7 +32,6 @@ import com.jfinal.server.ServerFactory;
 import com.jfinal.token.ITokenCache;
 import com.jfinal.token.TokenManager;
 import com.jfinal.upload.OreillyCos;
-import com.jfinal.util.PathUtil;
 
 /**
  * JFinal
@@ -99,7 +99,7 @@ public final class JFinal {
 		if (OreillyCos.isMultipartSupported()) {
 			String uploadedFileSaveDirectory = ct.getUploadedFileSaveDirectory();
 			if (uploadedFileSaveDirectory == null || "".equals(uploadedFileSaveDirectory.trim())) {
-				uploadedFileSaveDirectory = PathUtil.getWebRootPath() + File.separator + "upload" + File.separator;
+				uploadedFileSaveDirectory = PathKit.getWebRootPath() + File.separator + "upload" + File.separator;
 				ct.setUploadedFileSaveDirectory(uploadedFileSaveDirectory);
 				
 				/*File file = new File(uploadedFileSaveDirectory);
@@ -116,7 +116,7 @@ public final class JFinal {
 	
 	private void initPathUtil() {
 		String path = servletContext.getRealPath("/");
-		PathUtil.setWebRootPath(path);
+		PathKit.setWebRootPath(path);
 	}
 	
 	private void initRender() {

+ 1 - 1
src/com/jfinal/core/ModelInjector.java

@@ -20,11 +20,11 @@ import java.lang.reflect.Method;
 import java.util.Map;
 import java.util.Map.Entry;
 import javax.servlet.http.HttpServletRequest;
+import com.jfinal.kit.StringKit;
 import com.jfinal.plugin.activerecord.ActiveRecordException;
 import com.jfinal.plugin.activerecord.Model;
 import com.jfinal.plugin.activerecord.TableInfo;
 import com.jfinal.plugin.activerecord.TableInfoMapping;
-import com.jfinal.util.StringKit;
 
 /**
  * ModelInjector

+ 1 - 1
src/com/jfinal/ext/handler/ContextPathHandler.java

@@ -19,7 +19,7 @@ package com.jfinal.ext.handler;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 import com.jfinal.handler.Handler;
-import com.jfinal.util.StringKit;
+import com.jfinal.kit.StringKit;
 
 /**
  * Provide a context path to view if you need.

+ 1 - 1
src/com/jfinal/ext/handler/FakeStaticHandler.java

@@ -19,7 +19,7 @@ package com.jfinal.ext.handler;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 import com.jfinal.handler.Handler;
-import com.jfinal.util.StringKit;
+import com.jfinal.kit.StringKit;
 
 /**
  * FakeStaticHandler.

+ 1 - 1
src/com/jfinal/ext/handler/UrlSkipHandler.java

@@ -20,7 +20,7 @@ import java.util.regex.Pattern;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 import com.jfinal.handler.Handler;
-import com.jfinal.util.StringKit;
+import com.jfinal.kit.StringKit;
 
 /**
  * Skip the excluded url request from browser.

+ 53 - 0
src/com/jfinal/ext/kit/DateKit.java

@@ -0,0 +1,53 @@
+/**
+ * Copyright (c) 2011-2012, James Zhan 詹波 (jfinal@126.com).
+ *
+ * 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.ext.kit;
+
+import java.util.Date;
+import com.jfinal.kit.StringKit;
+
+/**
+ * DateKit.
+ */
+public class DateKit {
+	
+	public static String dateFormat = "yyyy-MM-dd";
+	public static String timeFormat = "yyyy-MM-dd HH:mm:ss";
+	
+	public static void setDateFromat(String dateFormat) {
+		if (StringKit.isBlank(dateFormat))
+			throw new IllegalArgumentException("dateFormat can not be blank.");
+		DateKit.dateFormat = dateFormat;
+	}
+	
+	public static void setTimeFromat(String timeFormat) {
+		if (StringKit.isBlank(timeFormat))
+			throw new IllegalArgumentException("timeFormat can not be blank.");
+		DateKit.timeFormat = timeFormat;
+	}
+	
+	public static Date toDate(String dateStr) {
+		throw new RuntimeException("Not finish!!!");
+	}
+	
+	public static String toStr(Date date) {
+		return toStr(date, DateKit.dateFormat);
+	}
+	
+	public static String toStr(Date date, String format) {
+		throw new RuntimeException("Not finish!!!");
+	}
+}

+ 1 - 1
src/com/jfinal/ext/util/SessionIdGenerator.java

@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package com.jfinal.ext.util;
+package com.jfinal.ext.kit;
 
 import java.security.SecureRandom;
 import java.util.Random;

+ 5 - 0
src/com/jfinal/ext/plugin/redis/RedisKit.java

@@ -0,0 +1,5 @@
+package com.jfinal.ext.plugin.redis;
+
+public class RedisKit {
+	
+}

+ 14 - 0
src/com/jfinal/ext/plugin/redis/RedisPlugin.java

@@ -0,0 +1,14 @@
+package com.jfinal.ext.plugin.redis;
+
+import com.jfinal.plugin.IPlugin;
+
+public class RedisPlugin implements IPlugin {
+	
+	public boolean start() {
+		throw new RuntimeException("Not finish!!!");
+	}
+	
+	public boolean stop() {
+		throw new RuntimeException("Not finish!!!");
+	}
+}

+ 11 - 0
src/com/jfinal/ext/plugin/shiro/ShiroInterceptor.java

@@ -0,0 +1,11 @@
+package com.jfinal.ext.plugin.shiro;
+
+import com.jfinal.aop.Interceptor;
+import com.jfinal.core.ActionInvocation;
+
+public class ShiroInterceptor implements Interceptor {
+	
+	public void intercept(ActionInvocation ai) {
+		throw new RuntimeException("Not finish!!!");
+	}
+}

+ 14 - 0
src/com/jfinal/ext/plugin/shiro/ShiroPlugin.java

@@ -0,0 +1,14 @@
+package com.jfinal.ext.plugin.shiro;
+
+import com.jfinal.plugin.IPlugin;
+
+public class ShiroPlugin implements IPlugin {
+	
+	public boolean start() {
+		throw new RuntimeException("Not finish!!!");
+	}
+	
+	public boolean stop() {
+		throw new RuntimeException("Not finish!!!");
+	}
+}

+ 2 - 1
src/com/jfinal/ext/render/CaptchaRender.java

@@ -27,8 +27,8 @@ import javax.imageio.ImageIO;
 import javax.servlet.ServletOutputStream;
 import javax.servlet.http.Cookie;
 import com.jfinal.core.Controller;
+import com.jfinal.kit.StringKit;
 import com.jfinal.render.Render;
-import com.jfinal.util.StringKit;
 
 public class CaptchaRender extends Render {
 	
@@ -150,6 +150,7 @@ public class CaptchaRender extends Render {
 //		}
 //	}
 	
+	// TODO 需要改进
 	public static boolean validate(Controller controller, String inputRandomCode, String randomCodeKey) {
 		if (StringKit.isBlank(inputRandomCode))
 			return false;

+ 2 - 2
src/com/jfinal/ext/render/JsonWithContentTypeRender.java

@@ -21,9 +21,9 @@ import java.io.PrintWriter;
 import java.util.Enumeration;
 import java.util.HashMap;
 import java.util.Map;
+import com.jfinal.kit.JsonKit;
 import com.jfinal.render.Render;
 import com.jfinal.render.RenderException;
-import com.jfinal.util.JsonBuilder;
 
 /**
  * JsonRenderWithContentType
@@ -93,7 +93,7 @@ public class JsonWithContentTypeRender extends Render {
 			}
 		}
 		
-		return JsonBuilder.mapToJson(map, depth);
+		return JsonKit.mapToJson(map, depth);
 	}
 }
 

+ 15 - 0
src/com/jfinal/ext/render/StaticHtmlRender.java

@@ -0,0 +1,15 @@
+package com.jfinal.ext.render;
+
+import com.jfinal.render.Render;
+
+/**
+ * 生成静态 html
+ */
+public class StaticHtmlRender extends Render {
+	
+	private static final long serialVersionUID = 1438855188898365097L;
+	
+	public void render() {
+		throw new RuntimeException("Not finish!!!");
+	}
+}

+ 1 - 1
src/com/jfinal/util/HandlerKit.java

@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package com.jfinal.util;
+package com.jfinal.kit;
 
 import java.io.IOException;
 import javax.servlet.http.HttpServletRequest;

+ 6 - 2
src/com/jfinal/util/JsonBuilder.java

@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package com.jfinal.util;
+package com.jfinal.kit;
 
 import java.lang.reflect.Method;
 import java.util.ArrayList;
@@ -37,7 +37,7 @@ import com.jfinal.plugin.activerecord.Record;
  * object			java.util.Map
  */
 @SuppressWarnings({"rawtypes", "unchecked"})
-public class JsonBuilder {
+public class JsonKit {
 	
 	public static String mapToJson(Map map, int depth) {
 		if(map == null)
@@ -155,6 +155,10 @@ public class JsonBuilder {
 		}
 	}
 	
+	public static String toJson(Object value) {
+		return toJson(value, 8);
+	}
+	
 	public static String toJson(Object value, int depth) {
 		if(value == null || (depth--) <= 0)
 			return "null";

+ 5 - 5
src/com/jfinal/util/PathUtil.java

@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package com.jfinal.util;
+package com.jfinal.kit;
 
 import java.io.File;
 import java.io.IOException;
@@ -25,7 +25,7 @@ import java.io.IOException;
  * 2: getAbslutlyPath() 获取绝对路径,但可能包含 ".." 或 "." 字符,例如  D:\otherPath\..\path\abc.txt
  * 3: getCanonicalPath() 获取绝对路径,但不包含 ".." 或 "." 字符,例如  D:\path\abc.txt
  */
-public class PathUtil {
+public class PathKit {
 	
 	private static String webRootPath;
 	
@@ -41,7 +41,7 @@ public class PathUtil {
 	}
 	
 	public static String getRootClassPath() {
-		String path = PathUtil.class.getClassLoader().getResource("").getPath();
+		String path = PathKit.class.getClassLoader().getResource("").getPath();
 		return new File(path).getAbsolutePath();
 	}
 	
@@ -63,12 +63,12 @@ public class PathUtil {
 	public static void setWebRootPath(String webRootPath) {
 		if (webRootPath.endsWith(File.separator))
 			webRootPath = webRootPath.substring(0, webRootPath.length() - 1);
-		PathUtil.webRootPath = webRootPath;
+		PathKit.webRootPath = webRootPath;
 	}
 	
 	private static String detectWebRootPath() {
 		try {
-			String path = PathUtil.class.getResource("/").getFile();
+			String path = PathKit.class.getResource("/").getFile();
 			return new File(path).getParentFile().getParentFile().getCanonicalPath();
 		} catch (IOException e) {
 			throw new RuntimeException(e);

+ 1 - 1
src/com/jfinal/util/StringKit.java

@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package com.jfinal.util;
+package com.jfinal.kit;
 
 /**
  * StringKit.

+ 4 - 0
src/com/jfinal/log/Logger.java

@@ -28,6 +28,10 @@ public abstract class Logger {
 	
 	private static ILoggerFactory factory;
 	
+	static {
+		init();
+	}
+	
 	public static void setLoggerFactory(ILoggerFactory loggerFactory) {
 		if (loggerFactory != null)
 			Logger.factory = loggerFactory;

+ 12 - 5
src/com/jfinal/plugin/activerecord/CaseInsensitiveContainerFactory.java

@@ -24,13 +24,13 @@ import java.util.Set;
 @SuppressWarnings({"rawtypes", "unchecked"})
 public class CaseInsensitiveContainerFactory implements IContainerFactory {
 	
-	private boolean toLowerCase = false;
+	private static boolean toLowerCase = false;
 	
 	public CaseInsensitiveContainerFactory() {
 	}
 	
 	public CaseInsensitiveContainerFactory(boolean toLowerCase) {
-		this.toLowerCase = toLowerCase;
+		CaseInsensitiveContainerFactory.toLowerCase = toLowerCase;
 	}
 	
 	public Map<String, Object> getAttrsMap() {
@@ -45,13 +45,20 @@ public class CaseInsensitiveContainerFactory implements IContainerFactory {
 		return new CaseInsensitiveSet();
 	}
 	
-	private Object convertCase(Object key) {
+	private static Object convertCase(Object key) {
 		if (key instanceof String)
 			return toLowerCase ? ((String)key).toLowerCase() : ((String)key).toUpperCase();
 		return key;
 	}
 	
-	class CaseInsensitiveSet extends HashSet {
+	/*
+	 * 1:非静态内部类拥有对外部类的所有成员的完全访问权限,包括实例字段和方法,
+	 *    为实现这一行为,非静态内部类存储着对外部类的实例的一个隐式引用
+	 * 2:序列化时要求所有的成员变量是Serializable 包括上面谈到的引式引用
+	 * 3:外部类CaseInsensitiveContainerFactory 需要 implements Serializable 才能被序列化
+	 * 4:可以使用静态内部类来实现内部类的序列化,而非让外部类实现 implements Serializable 
+	 */
+	public static class CaseInsensitiveSet extends HashSet {
 		
 		private static final long serialVersionUID = 102410961064096233L;
 		
@@ -68,7 +75,7 @@ public class CaseInsensitiveContainerFactory implements IContainerFactory {
 		}
 	}
 	
-	class CaseInsensitiveMap extends HashMap {
+	public static class CaseInsensitiveMap extends HashMap {
 		
 		private static final long serialVersionUID = 6843981594457576677L;
 		

+ 1 - 1
src/com/jfinal/plugin/activerecord/Model.java

@@ -703,7 +703,7 @@ public abstract class Model<M extends Model> implements Serializable {
 	 * Return json string of this model.
 	 */
 	public String toJson() {
-		return com.jfinal.util.JsonBuilder.toJson(attrs, 4);
+		return com.jfinal.kit.JsonKit.toJson(attrs, 4);
 	}
 }
 

+ 1 - 1
src/com/jfinal/plugin/activerecord/Record.java

@@ -292,7 +292,7 @@ public class Record implements Serializable {
 	 * Return json string of this record.
 	 */
 	public String toJson() {
-		return com.jfinal.util.JsonBuilder.toJson(columns, 4);
+		return com.jfinal.kit.JsonKit.toJson(columns, 4);
 	}
 }
 

+ 2 - 2
src/com/jfinal/plugin/activerecord/TableInfo.java

@@ -17,7 +17,7 @@
 package com.jfinal.plugin.activerecord;
 
 import java.util.Map;
-import com.jfinal.util.StringKit;
+import com.jfinal.kit.StringKit;
 
 /**
  * TableInfo save the table info like column name and column type.
@@ -59,7 +59,7 @@ public class TableInfo {
 	private Class<? extends Model<?>> modelClass;
 	
 	public TableInfo(String tableName, Class<? extends Model<?>> modelClass) {
-		this(tableName, "id", modelClass);
+		this(tableName, DbKit.dialect.getDefaultPrimaryKey(), modelClass);
 	}
 	
 	public TableInfo(String tableName, String primaryKey, Class<? extends Model<?>> modelClass) {

+ 4 - 0
src/com/jfinal/plugin/activerecord/dialect/Dialect.java

@@ -74,6 +74,10 @@ public abstract class Dialect {
 			pst.setObject(i + 1, paras[i]);
 		}
 	}
+	
+	public String getDefaultPrimaryKey() {
+		return "id";
+	}
 }
 
 

+ 4 - 0
src/com/jfinal/plugin/activerecord/dialect/OracleDialect.java

@@ -202,4 +202,8 @@ public class OracleDialect extends Dialect {
 				pst.setObject(i + 1, value);
 		}
 	}
+	
+	public String getDefaultPrimaryKey() {
+		return "ID";
+	}
 }

+ 1 - 1
src/com/jfinal/plugin/activerecord/tx/TxByRegex.java

@@ -20,9 +20,9 @@ import java.sql.SQLException;
 import java.util.regex.Pattern;
 import com.jfinal.aop.Interceptor;
 import com.jfinal.core.ActionInvocation;
+import com.jfinal.kit.StringKit;
 import com.jfinal.plugin.activerecord.Db;
 import com.jfinal.plugin.activerecord.IAtom;
-import com.jfinal.util.StringKit;
 
 /**
  * TxByRegex.

+ 1 - 1
src/com/jfinal/plugin/c3p0/C3p0Plugin.java

@@ -22,9 +22,9 @@ import java.io.FileInputStream;
 import java.io.IOException;
 import java.util.Properties;
 import javax.sql.DataSource;
+import com.jfinal.kit.StringKit;
 import com.jfinal.plugin.IPlugin;
 import com.jfinal.plugin.activerecord.IDataSourceProvider;
-import com.jfinal.util.StringKit;
 import com.mchange.v2.c3p0.ComboPooledDataSource;
 
 /**

+ 1 - 1
src/com/jfinal/plugin/druid/DruidPlugin.java

@@ -22,9 +22,9 @@ import java.util.List;
 import javax.sql.DataSource;
 import com.alibaba.druid.filter.Filter;
 import com.alibaba.druid.pool.DruidDataSource;
+import com.jfinal.kit.StringKit;
 import com.jfinal.plugin.IPlugin;
 import com.jfinal.plugin.activerecord.IDataSourceProvider;
-import com.jfinal.util.StringKit;
 
 /**
  * DruidPlugin.

+ 1 - 1
src/com/jfinal/plugin/druid/DruidStatViewHandler.java

@@ -14,7 +14,7 @@ import com.alibaba.druid.support.logging.Log;
 import com.alibaba.druid.support.logging.LogFactory;
 import com.alibaba.druid.util.IOUtils;
 import com.jfinal.handler.Handler;
-import com.jfinal.util.HandlerKit;
+import com.jfinal.kit.HandlerKit;
 
 /**
  * 替代 StatViewServlet

+ 16 - 1
src/com/jfinal/plugin/ehcache/CacheKit.java

@@ -78,7 +78,7 @@ public class CacheKit {
 	}
 	
 	@SuppressWarnings("unchecked")
-	public static <T> T handle(String cacheName, Object key, IDataLoader dataLoader) {
+	public static <T> T get(String cacheName, Object key, IDataLoader dataLoader) {
 		Object data = get(cacheName, key);
 		if (data == null) {
 			data = dataLoader.load();
@@ -86,6 +86,21 @@ public class CacheKit {
 		}
 		return (T)data;
 	}
+	
+	@SuppressWarnings("unchecked")
+	public static <T> T get(String cacheName, Object key, Class<? extends IDataLoader> dataLoaderClass) {
+		Object data = get(cacheName, key);
+		if (data == null) {
+			try {
+				IDataLoader dataLoader = dataLoaderClass.newInstance();
+				data = dataLoader.load();
+				put(cacheName, key, data);
+			} catch (Exception e) {
+				throw new RuntimeException(e);
+			}
+		}
+		return (T)data;
+	}
 }
 
 

+ 2 - 2
src/com/jfinal/plugin/spring/SpringPlugin.java

@@ -18,8 +18,8 @@ package com.jfinal.plugin.spring;
 
 import org.springframework.context.ApplicationContext;
 import org.springframework.context.support.FileSystemXmlApplicationContext;
+import com.jfinal.kit.PathKit;
 import com.jfinal.plugin.IPlugin;
-import com.jfinal.util.PathUtil;
 
 /**
  * SpringPlugin.
@@ -49,7 +49,7 @@ public class SpringPlugin implements IPlugin {
 		else if (configurations != null)
 			IocInterceptor.ctx = new FileSystemXmlApplicationContext(configurations);
 		else
-			IocInterceptor.ctx = new FileSystemXmlApplicationContext(PathUtil.getWebRootPath() + "/WEB-INF/applicationContext.xml");
+			IocInterceptor.ctx = new FileSystemXmlApplicationContext(PathKit.getWebRootPath() + "/WEB-INF/applicationContext.xml");
 		return true;
 	}
 	

+ 1 - 4
src/com/jfinal/render/Error404Render.java

@@ -29,7 +29,6 @@ public class Error404Render extends Render {
 	private static final long serialVersionUID = 1764764489766904795L;
 	private static final String contentType = "text/html;charset=" + getEncoding();
 	private static final String defaultHtml = "<html><head><title>404 Not Found</title></head><body bgcolor='white'><center><h1>404 Not Found</h1></center><hr><center><a href='http://www.jfinal.com'>JFinal/" + Const.JFINAL_VERSION + "</a></center></body></html>";
-	private Render render;
 	
 	public Error404Render(String view) {
 		this.view = view;
@@ -44,9 +43,7 @@ public class Error404Render extends Render {
 		
 		// render with view
 		if (view != null) {
-			render = RenderFactory.me().getRender(view);
-			render.setContext(request, response);
-			render.render();
+			RenderFactory.me().getRender(view).setContext(request, response).render();
 			return;
 		}
 		

+ 1 - 4
src/com/jfinal/render/Error500Render.java

@@ -29,7 +29,6 @@ public class Error500Render extends Render {
 	private static final long serialVersionUID = 4864834986049401413L;
 	private static final String contentType = "text/html;charset=" + getEncoding();
 	private static final String defaultHtml = "<html><head><title>500 Internal Server Error</title></head><body bgcolor='white'><center><h1>500 Internal Server Error</h1></center><hr><center><a href='http://www.jfinal.com'>JFinal/" + Const.JFINAL_VERSION + "</a></center></body></html>";
-	private Render render;
 	
 	public Error500Render(String view) {
 		this.view = view;
@@ -44,9 +43,7 @@ public class Error500Render extends Render {
 		
 		// render with view
 		if (view != null) {
-			render = RenderFactory.me().getRender(view);
-			render.setContext(request, response);
-			render.render();
+			RenderFactory.me().getRender(view).setContext(request, response).render();
 			return;
 		}
 		

+ 2 - 2
src/com/jfinal/render/FileRender.java

@@ -24,7 +24,7 @@ import java.io.InputStream;
 import java.io.OutputStream;
 import javax.servlet.ServletContext;
 import static com.jfinal.core.Const.DEFAULT_FILE_CONTENT_TYPE;
-import com.jfinal.util.PathUtil;
+import com.jfinal.kit.PathKit;
 
 /**
  * FileRender.
@@ -49,7 +49,7 @@ public class FileRender extends Render {
 	static void init(String fileDownloadPath, ServletContext servletContext) {
 		FileRender.fileDownloadPath = fileDownloadPath;
 		FileRender.servletContext = servletContext;
-		webRootPath = PathUtil.getWebRootPath();
+		webRootPath = PathKit.getWebRootPath();
 	}
 	
 	public void render() {

+ 4 - 4
src/com/jfinal/render/JsonRender.java

@@ -21,7 +21,7 @@ import java.io.PrintWriter;
 import java.util.Enumeration;
 import java.util.HashMap;
 import java.util.Map;
-import com.jfinal.util.JsonBuilder;
+import com.jfinal.kit.JsonKit;
 
 /**
  * JsonRender.
@@ -52,7 +52,7 @@ public class JsonRender extends Render {
 	public JsonRender(final String key, final Object value) {
 		if (key == null)
 			throw new IllegalArgumentException("The parameter key can not be null.");
-		this.jsonText = JsonBuilder.mapToJson(new HashMap<String, Object>(){{put(key, value);}}, depth);
+		this.jsonText = JsonKit.mapToJson(new HashMap<String, Object>(){{put(key, value);}}, depth);
 	}
 	
 	public JsonRender(String[] attrs) {
@@ -70,7 +70,7 @@ public class JsonRender extends Render {
 	public JsonRender(Object object) {
 		if (object == null)
 			throw new IllegalArgumentException("The parameter object can not be null.");
-		this.jsonText = JsonBuilder.toJson(object, depth);
+		this.jsonText = JsonKit.toJson(object, depth);
 	}
 	
 	public void render() {
@@ -114,7 +114,7 @@ public class JsonRender extends Render {
 			}
 		}
 		
-		this.jsonText = JsonBuilder.mapToJson(map, depth);
+		this.jsonText = JsonKit.mapToJson(map, depth);
 	}
 }
 

+ 2 - 2
src/com/jfinal/render/RenderFactory.java

@@ -20,7 +20,7 @@ import java.io.File;
 import java.util.Locale;
 import javax.servlet.ServletContext;
 import com.jfinal.config.Constants;
-import com.jfinal.util.PathUtil;
+import com.jfinal.kit.PathKit;
 import static com.jfinal.core.Const.DEFAULT_FILE_RENDER_BASE_PATH;
 
 /**
@@ -102,7 +102,7 @@ public class RenderFactory {
 	private String getFileRenderPath() {
 		String result = constants.getFileRenderPath();
 		if (result == null) {
-			result = PathUtil.getWebRootPath() + DEFAULT_FILE_RENDER_BASE_PATH;
+			result = PathKit.getWebRootPath() + DEFAULT_FILE_RENDER_BASE_PATH;
 		}
 		if (!result.endsWith(File.separator) && !result.endsWith("/")) {
 			result = result + File.separator;

+ 2 - 2
src/com/jfinal/server/JettyServer.java

@@ -30,7 +30,7 @@ import org.mortbay.jetty.nio.SelectChannelConnector;
 import org.mortbay.jetty.webapp.WebAppContext;
 import org.mortbay.management.MBeanContainer;
 import org.mortbay.util.Scanner;
-import com.jfinal.util.PathUtil;
+import com.jfinal.kit.PathKit;
 
 /**
  * JettyServer is used to config and start jetty web server.
@@ -125,7 +125,7 @@ class JettyServer implements IServer {
 		// configureScanner
 		if (enablescanner) {
 			final ArrayList<File> scanList = new ArrayList<File>();
-			scanList.add(new File(PathUtil.getRootClassPath()));
+			scanList.add(new File(PathKit.getRootClassPath()));
 			Scanner scanner = new Scanner();
 			scanner.setReportExistingFilesOnStartup(false);
 			scanner.setScanInterval(scanIntervalSeconds);

+ 5 - 5
src/com/jfinal/server/ServerFactory.java

@@ -17,7 +17,7 @@
 package com.jfinal.server;
 
 import java.io.File;
-import com.jfinal.util.PathUtil;
+import com.jfinal.kit.PathKit;
 
 /**
  * ServerFactory
@@ -65,22 +65,22 @@ public class ServerFactory {
 	}
 	
 	private static String detectWebAppDir() {
-		String rootClassPath = PathUtil.getRootClassPath();
+		String rootClassPath = PathKit.getRootClassPath();
 		String[] temp = null;
 		if (rootClassPath.indexOf("\\WEB-INF\\") != -1)
 			temp = rootClassPath.split("\\\\");
 		else
-			temp = rootClassPath.split("/");	// linux support, need test!!!
+			temp = rootClassPath.split("/");
 		return temp[temp.length - 3];
 	}
 	
 	@SuppressWarnings("unused")
 	@Deprecated
 	private static String detectWebAppDir_old() {
-		String rootClassPath = PathUtil.getRootClassPath();
+		String rootClassPath = PathKit.getRootClassPath();
 		String[] temp = null;
 		try {
-			temp = rootClassPath.split(File.separator);	// linux support, need test!!!
+			temp = rootClassPath.split(File.separator);
 		}
 		catch (Exception e) {
 			temp = rootClassPath.split("\\\\");

+ 1 - 1
src/com/jfinal/token/TokenManager.java

@@ -23,7 +23,7 @@ import java.util.Timer;
 import java.util.TimerTask;
 import com.jfinal.core.Const;
 import com.jfinal.core.Controller;
-import com.jfinal.util.StringKit;
+import com.jfinal.kit.StringKit;
 
 /**
  * TokenManager.