浏览代码

JFinal 1.3 Release :)

JamesZhan 12 年之前
父节点
当前提交
8736a9c024

+ 17 - 11
WebRoot/WEB-INF/lib/1_lib_description.txt

@@ -5,30 +5,36 @@ JFinal 自身对第三方无依赖,但当需要第三方功能支持时则需
 2:jetty-server-8.1.8.jar 用来支持无需额外安装 tomcat jetty 等 web server
    即可开始开发,同时它也是支持热部署的必要包。jetty-server-8.1.8.jar 中
    包含:jetty-8.1.8发行版"/lib"目录下所有jetty模块jar包、servlet-api-3.0.jar、
-   "/lib/jsp"下所有jar包。
+  "/lib/jsp"下的 com.sun.el-2.2.0.v201108011116.jar、
+  javax.el-2.2.0.v201108011116.jar、javax.servlet.jsp-2.2.0.v201112011158.jar
+  org.apache.jasper.glassfish-2.2.2.v201112011158.jar
 
 3:freemarker-2.3.16.jar 支持 FreeMarker 视图类型。
 
-4:velocity-1.7.jar、velocity-1.7-dep.jar支持 Velocity 视图。
+4:javax.servlet.jsp.jstl-1.2.0.v201105211821.jar 与 
+   org.apache.taglibs.standard.glassfish-1.2.0.v201112081803.jar
+   支持 jsp 视图类型
 
-5:cos-26Dec2008.jar 支持文件上传功能。
+5:velocity-1.7.jar、velocity-1.7-dep.jar支持 Velocity 视图
 
-6:mysql-connector-java-5.1.20-bin.jar 支持 mysql 数据库
+6:cos-26Dec2008.jar 支持文件上传功能
 
-7:c3p0-0.9.1.2.jar 数据库连接池
+7:mysql-connector-java-5.1.20-bin.jar 支持 mysql 数据库
 
-8:ehcache-core-2.5.2.jar、slf4j-api-1.6.1.jar、slf4j-log4j12-1.6.1.jar 支持 EhCache。
+8:c3p0-0.9.1.2.jar 数据库连接池。
+
+9:ehcache-core-2.5.2.jar、slf4j-api-1.6.1.jar、slf4j-log4j12-1.6.1.jar 支持 EhCache。
    在使用EhCache时需要有ehcache.xml文件。
 
-9:以org.springframework 打头的所有 jar 包支持 SpringPlugin
+10:以org.springframework 打头的所有 jar 包支持 SpringPlugin
 
-10:sqlite-jdbc-3.7.2.jar 支持 Sqlite 数据库
+11:sqlite-jdbc-3.7.2.jar 支持 Sqlite 数据库
 
-11:druid-0.2.6.jar 支持 Druid 数据库连接池
+12:druid-0.2.6.jar 支持 Druid 数据库连接池
 
-12:ojdbc6.jar Oracle Database 11g Release 2 (11.2.0.3) JDBC Driver
+13:ojdbc6.jar Oracle Database 11g Release 2 (11.2.0.3) JDBC Driver
 
-13:log4j-1.2.16.jar 支持 log4j 日志,当此文件不存在时,自动切换至 JDK Logger,
+14:log4j-1.2.16.jar 支持 log4j 日志,当此文件不存在时,自动切换至 JDK Logger,
    注意,log4j需要相应的配置文件 log4j.properties,否则当log4j-1.2.16.jar 存在
    而log4j.properties 不存在时无日志输出。jdk logger 需要的logging.properties文件
    也在此目录下提供了

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

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

+ 6 - 1
src/com/jfinal/core/JFinal.java

@@ -44,6 +44,7 @@ public final class JFinal {
 	private Handler handler;
 	private ServletContext servletContext;
 	private static IServer server;
+	private String contextPath = "";
 	
 	Handler getHandler() {
 		return handler;
@@ -51,7 +52,6 @@ public final class JFinal {
 	
 	private static final JFinal me = new JFinal();
 	
-	// singleton
 	private JFinal() {
 	}
 	
@@ -61,6 +61,7 @@ public final class JFinal {
 	
 	boolean init(JFinalConfig jfinalConfig, ServletContext servletContext) {
 		this.servletContext = servletContext;
+		this.contextPath = servletContext.getContextPath();
 		
 		initPathUtil();
 		
@@ -198,6 +199,10 @@ public final class JFinal {
 	public Action getAction(String url, String[] urlPara) {
 		return actionMapping.getAction(url, urlPara);
 	}
+	
+	public String getContextPath() {
+		return contextPath;
+	}
 }
 
 

+ 0 - 1
src/com/jfinal/plugin/activerecord/TableInfoMapping.java

@@ -28,7 +28,6 @@ public class TableInfoMapping {
 	
 	private static TableInfoMapping me = new TableInfoMapping(); 
 	
-	// singleton
 	private TableInfoMapping() {
 	}
 	

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

@@ -39,7 +39,7 @@ public class Tx implements Interceptor {
 		Connection conn = null;
 		Boolean autoCommit = null;
 		try {
-			conn = DbKit.getDataSource().getConnection();
+			conn = DbKit.getConnection();
 			autoCommit = conn.getAutoCommit();
 			DbKit.setThreadLocalConnection(conn);
 			conn.setTransactionIsolation(getTransactionLevel());	// conn.setTransactionIsolation(transactionLevel);

+ 2 - 3
src/com/jfinal/plugin/ehcache/CacheInterceptor.java

@@ -73,14 +73,13 @@ public class CacheInterceptor implements Interceptor {
 		useCacheDataAndRender(cacheData, controller);
 	}
 	
+	// TODO 考虑与 EvictInterceptor 一样强制使用  @CacheName
 	private String buildCacheName(ActionInvocation ai, Controller controller) {
 		CacheName cacheName = ai.getMethod().getAnnotation(CacheName.class);
 		if (cacheName != null)
 			return cacheName.value();
 		cacheName = controller.getClass().getAnnotation(CacheName.class);
-		if (cacheName != null)
-			return cacheName.value();
-		return ai.getActionKey();
+		return (cacheName != null) ? cacheName.value() : ai.getActionKey();
 	}
 	
 	private String buildCacheKey(ActionInvocation ai, Controller controller) {

+ 17 - 1
src/com/jfinal/plugin/ehcache/CacheName.java

@@ -1,3 +1,19 @@
+/**
+ * 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.plugin.ehcache;
 
 import java.lang.annotation.ElementType;
@@ -7,7 +23,7 @@ import java.lang.annotation.RetentionPolicy;
 import java.lang.annotation.Target;
 
 /**
- * CacheName can configure CacheInterceptor's cache name.
+ * CacheName can configure CacheInterceptor's cache name or EvictInterceptor's evict cache name.
  * <p>
  * The order of CacheInterceptor searching for CacheName annotation:<br>
  * 1: Action method of current invocation<br>

+ 46 - 0
src/com/jfinal/plugin/ehcache/EvictInterceptor.java

@@ -0,0 +1,46 @@
+/**
+ * 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.plugin.ehcache;
+
+import com.jfinal.aop.Interceptor;
+import com.jfinal.core.ActionInvocation;
+import com.jfinal.core.Controller;
+
+/**
+ * EvictInterceptor.
+ */
+public class EvictInterceptor implements Interceptor {
+	
+	final public void intercept(ActionInvocation ai) {
+		ai.invoke();
+		
+		String cacheName = buildCacheName(ai, ai.getController());
+		CacheKit.removeAll(cacheName);
+	}
+	
+	private String buildCacheName(ActionInvocation ai, Controller controller) {
+		CacheName cacheName = ai.getMethod().getAnnotation(CacheName.class);
+		if (cacheName != null)
+			return cacheName.value();
+		
+		cacheName = controller.getClass().getAnnotation(CacheName.class);
+		if (cacheName == null)
+			throw new RuntimeException("EvictInterceptor need CacheName annotation in controller.");
+		return cacheName.value();
+	}
+}
+

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

@@ -26,7 +26,7 @@ import com.jfinal.core.Const;
  */
 public class Error404Render extends Render {
 	
-	private static final long serialVersionUID = 1764764489766904795L;
+	private static final long serialVersionUID = 3925763221184467994L;
 	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>";
 	

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

@@ -26,7 +26,7 @@ import com.jfinal.core.Const;
  */
 public class Error500Render extends Render {
 	
-	private static final long serialVersionUID = 4864834986049401413L;
+	private static final long serialVersionUID = -7993459890626145958L;
 	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>";
 	

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

@@ -22,6 +22,7 @@ import java.io.FileInputStream;
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.OutputStream;
+import java.io.UnsupportedEncodingException;
 import javax.servlet.ServletContext;
 import static com.jfinal.core.Const.DEFAULT_FILE_CONTENT_TYPE;
 import com.jfinal.kit.PathKit;
@@ -31,7 +32,7 @@ import com.jfinal.kit.PathKit;
  */
 public class FileRender extends Render {
 	
-	private static final long serialVersionUID = -627386273750207255L;
+	private static final long serialVersionUID = 4293616220202691369L;
 	private File file;
 	private String fileName;
 	private static String fileDownloadPath;
@@ -69,7 +70,12 @@ public class FileRender extends Render {
 			return ;
         }
 		
-		response.addHeader("Content-disposition", "attachment; filename=" + file.getName());
+		try {
+			response.addHeader("Content-disposition", "attachment; filename=" + new String(file.getName().getBytes("GBK"), "ISO8859-1"));
+		} catch (UnsupportedEncodingException e) {
+			response.addHeader("Content-disposition", "attachment; filename=" + file.getName());
+		}
+		
         String contentType = servletContext.getMimeType(file.getName());
         if (contentType == null) {
         	contentType = DEFAULT_FILE_CONTENT_TYPE;		// "application/octet-stream";

+ 1 - 1
src/com/jfinal/render/FreeMarkerRender.java

@@ -34,7 +34,7 @@ import freemarker.template.TemplateExceptionHandler;
  */
 public class FreeMarkerRender extends Render {
 	
-	private static final long serialVersionUID = 3959102981898502071L;
+	private static final long serialVersionUID = -7649769283048920381L;
 	private transient static final String encoding = getEncoding();
 	private transient static final String contentType = "text/html; charset=" + encoding;
 	private transient static final Configuration config = new Configuration();

+ 1 - 1
src/com/jfinal/render/HtmlRender.java

@@ -24,7 +24,7 @@ import java.io.PrintWriter;
  */
 public class HtmlRender extends Render {
 	
-	private static final long serialVersionUID = -1805855373995133760L;
+	private static final long serialVersionUID = 8145891655998147406L;
 	private static final String contentType = "text/html;charset=" + getEncoding();
 	private String text;
 	

+ 1 - 1
src/com/jfinal/render/JavascriptRender.java

@@ -24,7 +24,7 @@ import java.io.PrintWriter;
  */
 public class JavascriptRender extends Render {
 	
-	private static final long serialVersionUID = 3378793486917573848L;
+	private static final long serialVersionUID = 8559524286644647476L;
 	private static final String contentType = "text/javascript;charset=" + getEncoding();
 	private String jsText;
 	

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

@@ -31,7 +31,7 @@ import com.jfinal.kit.JsonKit;
  */
 public class JsonRender extends Render {
 	
-	private static final long serialVersionUID = 6970249421567251974L;
+	private static final long serialVersionUID = 3606364198859021837L;
 	
 	/**
 	 * http://zh.wikipedia.org/zh/MIME

+ 1 - 1
src/com/jfinal/render/JspRender.java

@@ -33,7 +33,7 @@ import com.jfinal.plugin.activerecord.Record;
 @SuppressWarnings({"rawtypes", "unchecked"})
 public class JspRender extends Render {
 	
-	private static final long serialVersionUID = 4979806661797436765L;
+	private static final long serialVersionUID = -688478484751775667L;
 	private transient static boolean isSupportActiveRecord = true;
 	
 	public static void setSupportActiveRecord(boolean supportActiveRecord) {

+ 1 - 1
src/com/jfinal/render/NullRender.java

@@ -21,7 +21,7 @@ package com.jfinal.render;
  */
 public class NullRender extends Render {
 	
-	private static final long serialVersionUID = -389288806463724481L;
+	private static final long serialVersionUID = 4383753964688920354L;
 	
 	/**
 	 * Render nothing

+ 5 - 1
src/com/jfinal/render/Redirect301Render.java

@@ -23,9 +23,10 @@ import javax.servlet.http.HttpServletResponse;
  */
 public class Redirect301Render extends Render {
 	
-	private static final long serialVersionUID = -6822589387282014944L;
+	private static final long serialVersionUID = -115860447207423482L;
 	private String url;
 	private boolean withQueryString;
+	private static final String contextPath = RedirectRender.getContxtPath();
 	
 	public Redirect301Render(String url) {
 		this.url = url;
@@ -38,6 +39,9 @@ public class Redirect301Render extends Render {
 	}
 	
 	public void render() {
+		if (contextPath != null && url.indexOf("://") == -1)
+			url = contextPath + url;
+		
 		if (withQueryString) {
 			String queryString = request.getQueryString();
 			if (queryString != null)

+ 11 - 1
src/com/jfinal/render/RedirectRender.java

@@ -17,15 +17,22 @@
 package com.jfinal.render;
 
 import java.io.IOException;
+import com.jfinal.core.JFinal;
 
 /**
  * RedirectRender with status: 302 Found.
  */
 public class RedirectRender extends Render {
 	
-	private static final long serialVersionUID = -3120354341585834890L;
+	private static final long serialVersionUID = 1812102713097864255L;
 	private String url;
 	private boolean withQueryString;
+	private static final String contextPath = getContxtPath();
+	
+	static String getContxtPath() {
+		String cp = JFinal.me().getContextPath();
+		return ("".equals(cp) || "/".equals(cp)) ? null : cp;
+	}
 	
 	public RedirectRender(String url) {
 		this.url = url;
@@ -38,6 +45,9 @@ public class RedirectRender extends Render {
 	}
 	
 	public void render() {
+		if (contextPath != null && url.indexOf("://") == -1)
+			url = contextPath + url;
+		
 		if (withQueryString) {
 			String queryString = request.getQueryString();
 			if (queryString != null)

+ 0 - 1
src/com/jfinal/render/RenderFactory.java

@@ -36,7 +36,6 @@ public class RenderFactory {
 		return servletContext;
 	}
 	
-	// singleton
 	private static final RenderFactory me = new RenderFactory();
 	
 	private RenderFactory() {

+ 1 - 1
src/com/jfinal/render/TextRender.java

@@ -24,7 +24,7 @@ import java.io.PrintWriter;
  */
 public class TextRender extends Render {
 	
-	private static final long serialVersionUID = -5264892635310241831L;
+	private static final long serialVersionUID = 4775148244778489992L;
 	private static final String defaultContentType = "text/plain;charset=" + getEncoding();
 	private String text;
 	

+ 1 - 1
src/com/jfinal/render/VelocityRender.java

@@ -34,7 +34,7 @@ import org.apache.velocity.exception.ResourceNotFoundException;
  */
 public class VelocityRender extends Render {
 	
-	private static final long serialVersionUID = 2195369405439638708L;
+	private static final long serialVersionUID = 1012573049421601960L;
 	private transient static final String encoding = getEncoding();
 	private transient static final String contentType = "text/html;charset=" + encoding;
 	private transient static final Properties properties = new Properties();