James 7 年 前
コミット
f95c7b65a8

+ 2 - 0
src/main/java/com/jfinal/core/ActionMapping.java

@@ -79,6 +79,8 @@ public class ActionMapping {
 					continue ;
 				if (sonOfController && !Modifier.isPublic(method.getModifiers()))
 					continue ;
+				if (method.getAnnotation(NotAction.class) != null)
+					continue ;
 				
 				Interceptor[] actionInters = interMan.buildControllerActionInterceptor(routes.getInterceptors(), controllerInters, controllerClass, method);
 				String controllerKey = route.getControllerKey();

+ 14 - 1
src/main/java/com/jfinal/core/JFinalFilter.java

@@ -43,8 +43,21 @@ public class JFinalFilter implements Filter {
 	private static Log log;
 	private int contextPathLength;
 	
+	public JFinalFilter() {
+		this.jfinalConfig = null;
+	}
+	
+	/**
+	 * 支持 web 项目无需 web.xml 配置文件,便于嵌入式整合 jetty、undertow
+	 */
+	public JFinalFilter(JFinalConfig jfinalConfig) {
+		this.jfinalConfig = jfinalConfig;
+	}
+	
 	public void init(FilterConfig filterConfig) throws ServletException {
-		createJFinalConfig(filterConfig.getInitParameter("configClass"));
+		if (jfinalConfig == null) {
+			createJFinalConfig(filterConfig.getInitParameter("configClass"));
+		}
 		
 		jfinal.init(jfinalConfig, filterConfig.getServletContext());
 		

+ 12 - 12
src/main/java/com/jfinal/template/OutputDirectiveFactory.java

@@ -14,21 +14,21 @@
  * limitations under the License.
  */
 
-package com.jfinal.template;
+package com.jfinal.core;
 
-import com.jfinal.template.expr.ast.ExprList;
-import com.jfinal.template.stat.Location;
-import com.jfinal.template.stat.ast.Output;
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Inherited;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
 
 /**
- * OutputDirectiveFactory
+ * NotAction is used to configure the method in controller is not an action
  */
-public class OutputDirectiveFactory implements IOutputDirectiveFactory {
-	
-	public static final OutputDirectiveFactory me = new OutputDirectiveFactory();
-	
-	public Output getOutputDirective(ExprList exprList, Location location) {
-		return new Output(exprList, location);
-	}
+@Inherited
+@Retention(RetentionPolicy.RUNTIME)
+@Target({ElementType.METHOD})
+public @interface NotAction {
 }
 
+

+ 7 - 0
src/main/java/com/jfinal/kit/PathKit.java

@@ -24,6 +24,13 @@ import java.io.UnsupportedEncodingException;
  * 1: getPath() 获取相对路径,例如   ..\path\abc.txt
  * 2: getAbsolutePath() 获取绝对路径,但可能包含 ".." 或 "." 字符,例如  D:\otherPath\..\path\abc.txt
  * 3: getCanonicalPath() 获取绝对路径,但不包含 ".." 或 "." 字符,例如  D:\path\abc.txt
+ * 
+ * 2018-05-12 新测试:
+ * 1:PathKit.class.getResource("/") 将获取 class path 根目录,例如:/Users/james/workspace/jfinal/webapp/WEB-INF/classes
+ * 2:PathKit.class.getResource("") 将获取 PathKit 这个 class 所在的目录,即:rootClassPath + "/com/jfinal/kit"
+ * 
+ * 3:ClassLoader.getResource("/") 将获取到 null 值,该用法无意义
+ * 4:ClassLoader.getResource("") 将获取 class path 根目录,与 PathKit.class.getResource("/") 一样
  */
 public class PathKit {
 	

+ 7 - 1
src/main/java/com/jfinal/kit/Prop.java

@@ -29,7 +29,13 @@ import com.jfinal.core.Const;
  */
 public class Prop {
 	
-	private Properties properties = null;
+	protected Properties properties = null;
+	
+	/**
+	 * protected 构造方法便于子类扩展
+	 */
+	protected Prop() {
+	}
 	
 	/**
 	 * Prop constructor.

+ 5 - 5
src/main/java/com/jfinal/plugin/activerecord/ActiveRecordPlugin.java

@@ -34,13 +34,13 @@ import com.jfinal.plugin.activerecord.sql.SqlKit;
  */
 public class ActiveRecordPlugin implements IPlugin {
 	
-	private IDataSourceProvider dataSourceProvider = null;
-	private Boolean devMode = null;
+	protected IDataSourceProvider dataSourceProvider = null;
+	protected Boolean devMode = null;
 	
-	private Config config = null;
+	protected Config config = null;
 	
-	private volatile boolean isStarted = false;
-	private List<Table> tableList = new ArrayList<Table>();
+	protected volatile boolean isStarted = false;
+	protected List<Table> tableList = new ArrayList<Table>();
 	
 	public ActiveRecordPlugin(String configName, DataSource dataSource, int transactionLevel) {
 		if (StrKit.isBlank(configName)) {

+ 4 - 1
src/main/java/com/jfinal/plugin/activerecord/SqlPara.java

@@ -16,6 +16,7 @@
 
 package com.jfinal.plugin.activerecord;
 
+import java.io.Serializable;
 import java.util.ArrayList;
 import java.util.List;
 
@@ -23,7 +24,9 @@ import java.util.List;
  * SqlPara
  * 封装查询使用的 sql 与参数,主要用于 getSqlPara(...) 返回值
  */
-public class SqlPara {
+public class SqlPara implements Serializable {
+	
+	private static final long serialVersionUID = -8586448059592782381L;
 	
 	String sql;
 	List<Object> paraList;

+ 2 - 1
src/main/java/com/jfinal/template/Engine.java

@@ -26,6 +26,7 @@ import com.jfinal.template.source.ClassPathSourceFactory;
 import com.jfinal.template.source.ISource;
 import com.jfinal.template.source.ISourceFactory;
 import com.jfinal.template.source.StringSource;
+import com.jfinal.template.stat.OutputDirectiveFactory;
 import com.jfinal.template.stat.Parser;
 import com.jfinal.template.stat.ast.Stat;
 
@@ -276,7 +277,7 @@ public class Engine {
 	/**
 	 * Set output directive factory
 	 */
-	public Engine setOutputDirectiveFactory(IOutputDirectiveFactory outputDirectiveFactory) {
+	public Engine setOutputDirectiveFactory(OutputDirectiveFactory outputDirectiveFactory) {
 		config.setOutputDirectiveFactory(outputDirectiveFactory);
 		return this;
 	}

+ 3 - 2
src/main/java/com/jfinal/template/EngineConfig.java

@@ -35,6 +35,7 @@ import com.jfinal.template.source.ISource;
 import com.jfinal.template.source.ISourceFactory;
 import com.jfinal.template.source.StringSource;
 import com.jfinal.template.stat.Location;
+import com.jfinal.template.stat.OutputDirectiveFactory;
 import com.jfinal.template.stat.Parser;
 import com.jfinal.template.stat.ast.Define;
 import com.jfinal.template.stat.ast.Output;
@@ -53,7 +54,7 @@ public class EngineConfig {
 	
 	Map<String, Object> sharedObjectMap = null;
 	
-	private IOutputDirectiveFactory outputDirectiveFactory = OutputDirectiveFactory.me;
+	private OutputDirectiveFactory outputDirectiveFactory = OutputDirectiveFactory.me;
 	private ISourceFactory sourceFactory = new FileSourceFactory();
 	private Map<String, Class<? extends Directive>> directiveMap = new HashMap<String, Class<? extends Directive>>();
 	private SharedMethodKit sharedMethodKit = new SharedMethodKit();
@@ -210,7 +211,7 @@ public class EngineConfig {
 	/**
 	 * Set output directive factory
 	 */
-	public void setOutputDirectiveFactory(IOutputDirectiveFactory outputDirectiveFactory) {
+	public void setOutputDirectiveFactory(OutputDirectiveFactory outputDirectiveFactory) {
 		if (outputDirectiveFactory == null) {
 			throw new IllegalArgumentException("outputDirectiveFactory can not be null");
 		}

+ 12 - 8
src/main/java/com/jfinal/template/IOutputDirectiveFactory.java

@@ -14,14 +14,13 @@
  * limitations under the License.
  */
 
-package com.jfinal.template;
+package com.jfinal.template.stat;
 
 import com.jfinal.template.expr.ast.ExprList;
-import com.jfinal.template.stat.Location;
 import com.jfinal.template.stat.ast.Output;
 
 /**
- * IOutputDirectiveFactory
+ * OutputDirectiveFactory
  * 用于定制自定义输出指令,替换系统默认输出指令,满足个性化需求
  * 
  * 用法:
@@ -32,12 +31,15 @@ import com.jfinal.template.stat.ast.Output;
  *   }
  *   
  *   public void exec(Env env, Scope scope, Writer writer) {
- *     write(writer, exprList.eval(scope));
+ *     Object value = exprList.eval(scope);
+ *     if (value != null) {
+ *     	  write(writer, value.toString());
+ *     }
  *   }
  * }
  * 
  * 2:定义 MyOutputDirectiveFactory
- * public class MyOutputDirectiveFactory implements IOutputDirectiveFactory {
+ * public class MyOutputDirectiveFactory extends OutputDirectiveFactory {
  *   public Output getOutputDirective(ExprList exprList) {
  *     return new MyOutput(exprList);
  *   }
@@ -46,11 +48,13 @@ import com.jfinal.template.stat.ast.Output;
  * 3:配置
  * engine.setOutputDirectiveFactory(new MyOutputDirectiveFactory())
  */
-public interface IOutputDirectiveFactory {
+public class OutputDirectiveFactory {
 	
-	public Output getOutputDirective(ExprList exprList, Location location);
+	public static final OutputDirectiveFactory me = new OutputDirectiveFactory();
 	
+	public Output getOutputDirective(ExprList exprList, Location location) {
+		return new Output(exprList, location);
+	}
 }
 
 
-