ソースを参照

Merge remote-tracking branch 'origin/master'

James 3 年 前
コミット
21a5ca15f9

+ 1 - 1
README.md

@@ -25,7 +25,7 @@ JFinal 是基于 Java 语言的极速 WEB + ORM 框架,其核心设计目标
 <dependency>
     <groupId>com.jfinal</groupId>
     <artifactId>jfinal</artifactId>
-    <version>5.0.5</version>
+    <version>5.0.6</version>
 </dependency>
 ```
 

+ 1 - 1
pom.xml

@@ -4,7 +4,7 @@
 
 	<groupId>com.jfinal</groupId>
 	<artifactId>jfinal</artifactId>
-	<version>5.0.5</version>
+	<version>5.0.6</version>
 	<packaging>jar</packaging>
 
 	<name>JFinal</name>

+ 12 - 1
src/main/java/com/jfinal/core/ActionException.java

@@ -31,6 +31,7 @@ public class ActionException extends RuntimeException {
 	private static final long serialVersionUID = 1998063243843477017L;
 	// private static final Log log = Log.getLog(ActionException.class);
 	private int errorCode;
+	private String errorMessage;
 	private Render errorRender;
 	
 	public ActionException(int errorCode, Render errorRender) {
@@ -72,7 +73,7 @@ public class ActionException extends RuntimeException {
 	}
 	
 	public ActionException(int errorCode, Render errorRender, String errorMessage) {
-		super(errorMessage);
+		this.errorMessage = errorMessage;
 		init(errorCode, errorRender);
 		// log.warn(errorMessage);		// ActionHandler 中添加了对 message 的日志输出
 	}
@@ -81,6 +82,16 @@ public class ActionException extends RuntimeException {
 		return errorCode;
 	}
 	
+	@Override
+	public String getMessage() {
+		return errorMessage;
+	}
+	
+	@Override
+	public String getLocalizedMessage() {
+		return errorMessage;
+	}
+	
 	public Render getErrorRender() {
 		return errorRender;
 	}

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

@@ -23,7 +23,7 @@ import com.jfinal.render.ViewType;
  */
 public interface Const {
 
-	String JFINAL_VERSION = "5.0.5";
+	String JFINAL_VERSION = "5.0.6";
 
 	ViewType DEFAULT_VIEW_TYPE = ViewType.JFINAL_TEMPLATE;
 

+ 8 - 2
src/main/java/com/jfinal/render/ErrorRender.java

@@ -17,6 +17,7 @@
 package com.jfinal.render;
 
 import java.io.IOException;
+import java.io.OutputStream;
 import java.io.UnsupportedEncodingException;
 import java.util.HashMap;
 import java.util.Map;
@@ -134,10 +135,15 @@ public class ErrorRender extends Render {
 		}
 		
 		// render with html content
+		OutputStream os = null;
 		try {
 			response.setContentType(isJsonContentType ? contentTypeJson : contentTypeHtml);
-			response.getOutputStream().write(isJsonContentType ? getErrorJson() : getErrorHtml());
-		} catch (IOException e) {
+			os = response.getOutputStream();
+			os.write(isJsonContentType ? getErrorJson() : getErrorHtml());
+		} catch (Exception e) {
+		    if (e instanceof IOException) {
+		        close(os);
+		    }
 			throw new RenderException(e);
 		}
 	}

+ 4 - 0
src/main/java/com/jfinal/render/FreeMarkerRender.java

@@ -16,6 +16,7 @@
 
 package com.jfinal.render;
 
+import java.io.IOException;
 import java.io.PrintWriter;
 import java.util.Enumeration;
 import java.util.HashMap;
@@ -158,6 +159,9 @@ public class FreeMarkerRender extends Render {
 			template.process(data, writer);		// Merge the data-model and the template
 			writer.flush();
 		} catch (Exception e) {
+		    if (e instanceof IOException) {
+		        close(writer);
+		    }
 			throw new RenderException(e);
 		}
 	}

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

@@ -139,7 +139,10 @@ public class JsonRender extends Render {
 			writer = response.getWriter();
 			writer.write(jsonText);
 			writer.flush();
-		} catch (IOException e) {
+		} catch (Exception e) {
+		    if (e instanceof IOException) {
+		        close(writer);
+		    }
 			throw new RenderException(e);
 		}
 	}

+ 5 - 1
src/main/java/com/jfinal/render/QrCodeRender.java

@@ -24,6 +24,7 @@ import com.google.zxing.qrcode.QRCodeWriter;
 import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;
 import com.jfinal.kit.StrKit;
 import java.io.IOException;
+import java.io.OutputStream;
 import java.util.HashMap;
 import java.util.Map;
 
@@ -110,6 +111,7 @@ public class QrCodeRender extends Render {
 			hints.put(EncodeHintType.ERROR_CORRECTION, errorCorrectionLevel);
 		}
 
+		OutputStream os = null;
 		try {
 			// MultiFormatWriter 可支持多种格式的条形码,在此直接使用 QRCodeWriter,通过查看源码可知少创建一个对象
 			// BitMatrix bitMatrix = new MultiFormatWriter().encode(content, BarcodeFormat.QR_CODE, width, height, hints);
@@ -117,9 +119,11 @@ public class QrCodeRender extends Render {
 			QRCodeWriter writer = new QRCodeWriter();
 			BitMatrix bitMatrix = writer.encode(content, BarcodeFormat.QR_CODE, width, height, hints);
 
+			os = response.getOutputStream();
 			// 经测试 200 X 200 大小的二维码使用 "png" 格式只有 412B,而 "jpg" 却达到 15KB
-			MatrixToImageWriter.writeToStream(bitMatrix, "png", response.getOutputStream());    // format: "jpg"、"png"
+			MatrixToImageWriter.writeToStream(bitMatrix, "png", os);    // format: "jpg"、"png"
 		} catch (IOException e) {	// ClientAbortException、EofException 直接或间接继承自 IOException
+			close(os);
 			String name = e.getClass().getSimpleName();
 			if ("ClientAbortException".equals(name) || "EofException".equals(name)) {
 			} else {

+ 10 - 10
src/main/java/com/jfinal/render/Render.java

@@ -73,18 +73,18 @@ public abstract class Render {
 	 * Render to client
 	 */
 	public abstract void render();
-	
-	/**
-	 * OutputStream、Writer 写入异常时,关闭它们,ActionHandler 中未向底层容器继续抛出 IOException,
-	 * 以防容器在意外情况下未关闭它们(虽然调试 undertow 源码得知,无论异常产生与否,都将关闭它们)
-	 */
-	protected void close(AutoCloseable autoCloseable) {
-	    if (autoCloseable != null) {
-	        try {
+    
+    /**
+     * OutputStream、Writer 写入异常时,关闭它们,ActionHandler 中未向底层容器继续抛出 IOException,
+     * 以防容器在意外情况下未关闭它们(虽然调试 undertow 源码得知,无论异常产生与否,都将关闭它们)
+     */
+    protected void close(AutoCloseable autoCloseable) {
+        if (autoCloseable != null) {
+            try {
                 autoCloseable.close();
             } catch (Exception e) {
                 Log.getLog(getClass()).error(e.getMessage(), e);
             }
-	    }
-	}
+        }
+    }
 }

+ 7 - 2
src/main/java/com/jfinal/render/TemplateRender.java

@@ -56,15 +56,17 @@ public class TemplateRender extends Render {
 			data.put(attrName, request.getAttribute(attrName));
 		}
 		
+		OutputStream os = null;
 		try {
 			
-			OutputStream os = response.getOutputStream();
+			os = response.getOutputStream();
 			engine.getTemplate(view).render(data, os);
 			os.flush();
 			
 		} catch (RuntimeException e) {	// 捕获 ByteWriter.close() 抛出的 RuntimeException
 			Throwable cause = e.getCause();
 			if (cause instanceof IOException) {	// ClientAbortException、EofException 直接或间接继承自 IOException
+				close(os);
 				String name = cause.getClass().getSimpleName();
 				if ("ClientAbortException".equals(name) || "EofException".equals(name)) {
 					return ;
@@ -72,7 +74,10 @@ public class TemplateRender extends Render {
 			}
 			
 			throw e;
-		} catch (IOException e) {
+		} catch (Exception e) {
+		    if (e instanceof IOException) {
+		        close(os);
+		    }
 			throw new RenderException(e);
 		}
 	}

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

@@ -66,7 +66,10 @@ public class TextRender extends Render {
 			writer = response.getWriter();
 			writer.write(text);
 			writer.flush();
-		} catch (IOException e) {
+		} catch (Exception e) {
+		    if (e instanceof IOException) {
+		        close(writer);
+		    }
 			throw new RenderException(e);
 		}
 	}

+ 1 - 1
src/main/java/com/jfinal/template/Template.java

@@ -218,7 +218,7 @@ public class Template {
         }
     }
 	
-	/**
+    /**
      * 渲染到 OutputStream 中去,autoCloseOutputStream 指定是否自动关闭 OutputStream
      */
     public void render(Map<?, ?> data, OutputStream outputStream, boolean autoCloseOutputStream) {

+ 1 - 1
src/main/java/com/jfinal/template/expr/ast/Arith.java

@@ -78,7 +78,7 @@ public class Arith extends Expr {
 	public Object eval(Scope scope) {
 		try {
 			return doEval(scope);
-		} catch (TemplateException e) {
+		} catch (TemplateException | ParseException e) {
 			throw e;
 		} catch (Exception e) {
 			throw new TemplateException(e.getMessage(), location, e);

+ 1 - 1
src/main/java/com/jfinal/template/ext/directive/DateDirective.java

@@ -96,7 +96,7 @@ public class DateDirective extends Directive {
 				throw new TemplateException("The first parameter of #date directive can not be " + date.getClass().getName(), location);
 			}
 
-		} catch (TemplateException e) {
+		} catch (TemplateException | ParseException e) {
 			throw e;
 		} catch (Exception e) {
 			throw new TemplateException(e.getMessage(), location, e);

+ 2 - 2
src/main/java/com/jfinal/template/ext/directive/EscapeDirective.java

@@ -53,9 +53,9 @@ public class EscapeDirective extends Directive {
 			} else if (value != null) {
 				escape(value.toString(), writer);
 			}
-		} catch(TemplateException | ParseException e) {
+		} catch (TemplateException | ParseException e) {
 			throw e;
-		} catch(Exception e) {
+		} catch (Exception e) {
 			throw new TemplateException(e.getMessage(), location, e);
 		}
 	}

+ 2 - 2
src/main/java/com/jfinal/template/stat/ast/Output.java

@@ -67,9 +67,9 @@ public class Output extends Stat {
 			} else if (value != null) {
 				writer.write(value.toString());
 			}
-		} catch(TemplateException | ParseException e) {
+		} catch (TemplateException | ParseException e) {
 			throw e;
-		} catch(Exception e) {
+		} catch (Exception e) {
 			throw new TemplateException(e.getMessage(), location, e);
 		}
 	}