private void initRender() {
RenderFactory renderFactory = RenderFactory.me();
renderFactory.init(constants, servletContext);
}
2.renderFactory.init(constants, servletContext);总的来说,这是主要是初始化FreeMarker,Velocity等模板
public void init(Constants constants, ServletContext servletContext) {
this.constants = constants;
RenderFactory.servletContext = servletContext;
// init Render
Render.init(constants.getEncoding(), constants.getDevMode());
initFreeMarkerRender(servletContext);
initVelocityRender(servletContext);
initFileRender(servletContext);
// create mainRenderFactory
if (mainRenderFactory == null) {
ViewType defaultViewType = constants.getViewType();
if (defaultViewType == ViewType.FREE_MARKER)
mainRenderFactory = new FreeMarkerRenderFactory();
else if (defaultViewType == ViewType.JSP)
mainRenderFactory = new JspRenderFactory();
else if (defaultViewType == ViewType.VELOCITY)
mainRenderFactory = new VelocityRenderFactory();
else
throw new RuntimeException("View Type can not be null.");
}
// create errorRenderFactory
if (errorRenderFactory == null) {
errorRenderFactory = new ErrorRenderFactory();
}
}
3.initFreeMarkerRender 主要就是java初始化FreeMarker模版代码比较简单,自己看看应该会懂
private void initFreeMarkerRender(ServletContext servletContext) {
try {
Class.forName("freemarker.template.Template"); // detect freemarker.jar
FreeMarkerRender.init(servletContext, Locale.getDefault(), constants.getFreeMarkerTemplateUpdateDelay());
} catch (ClassNotFoundException e) {
// System.out.println("freemarker can not be supported!");
}
}
static void init(ServletContext servletContext, Locale locale, int template_update_delay) {
// Initialize the FreeMarker configuration;
// - Create a configuration instance
// config = new Configuration();
// - Templates are stoted in the WEB-INF/templates directory of the Web app.
config.setServletContextForTemplateLoading(servletContext, "/"); // "WEB-INF/templates"
// - Set update dealy to 0 for now, to ease debugging and testing.
// Higher value should be used in production environment.
if (getDevMode()) {
config.setTemplateUpdateDelay(0);
}
else {
config.setTemplateUpdateDelay(template_update_delay);
}
// - Set an error handler that prints errors so they are readable with
// a HTML browser.
// config.setTemplateExceptionHandler(TemplateExceptionHandler.HTML_DEBUG_HANDLER);
config.setTemplateExceptionHandler(TemplateExceptionHandler.RETHROW_HANDLER);
// - Use beans wrapper (recommmended for most applications)
config.setObjectWrapper(ObjectWrapper.BEANS_WRAPPER);
// - Set the default charset of the template files
config.setDefaultEncoding(encoding); // config.setDefaultEncoding("ISO-8859-1");
// - Set the charset of the output. This is actually just a hint, that
// templates may require for URL encoding and for generating META element
// that uses http-equiv="Content-type".
config.setOutputEncoding(encoding); // config.setOutputEncoding("UTF-8");
// - Set the default locale
config.setLocale(locale /* Locale.CHINA */ ); // config.setLocale(Locale.US);
config.setLocalizedLookup(false); config.setNumberFormat("#0.#####");
}
4.initVelocityRender(servletContext);主要是java初始化Velocity模版
static void init(ServletContext servletContext) {
String webPath = servletContext.getRealPath("/");
properties.setProperty(Velocity.FILE_RESOURCE_LOADER_PATH, webPath);
properties.setProperty(Velocity.ENCODING_DEFAULT, encoding);
properties.setProperty(Velocity.INPUT_ENCODING, encoding);
properties.setProperty(Velocity.OUTPUT_ENCODING, encoding);
}
5.initFileRender(servletContext);主要是java初始化FileRead,主要用于下载文件的,我顺便把他的reader()代码也贴出来吧,
这个reader()什么时候执行,在doFilter里面我会介绍
static void init(String fileDownloadPath, ServletContext servletContext) {
FileRender.fileDownloadPath = fileDownloadPath;
FileRender.servletContext = servletContext;
webRootPath = PathKit.getWebRootPath();
}
public static String getWebRootPath() {
if (webRootPath == null)
webRootPath = detectWebRootPath();;
return webRootPath;
}
private static String detectWebRootPath() {
try {
String path = PathKit.class.getResource("/").toURI().getPath();
return new File(path).getParentFile().getParentFile().getCanonicalPath();
} catch (Exception e) {
throw new RuntimeException(e);
}
}
public void render() {
if (fileName != null) {
if (fileName.startsWith("/"))
file = new File(webRootPath + fileName);
else
file = new File(fileDownloadPath + fileName);
}
if (file == null || !file.isFile() || file.length() > Integer.MAX_VALUE) {
// response.sendError(HttpServletResponse.SC_NOT_FOUND);
// return;
// throw new RenderException("File not found!");
RenderFactory.me().getErrorRender(404).setContext(request, response).render();
return ;
}
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";
}
response.setContentType(contentType);
response.setContentLength((int)file.length());
InputStream inputStream = null;
OutputStream outputStream = null;
try {
inputStream = new BufferedInputStream(new FileInputStream(file));
outputStream = response.getOutputStream();
byte[] buffer = new byte[1024];
for (int n = -1; (n = inputStream.read(buffer)) != -1;) {
outputStream.write(buffer, 0, n);
}
outputStream.flush();
}
catch (Exception e) {
throw new RenderException(e);
}
finally {
if (inputStream != null) {
try {
inputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (outputStream != null) {
try {
outputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
6.mainRenderFactory = new FreeMarkerRenderFactory(); 我就解释这个把,这里运用了
抽象工厂模式,跟JFinal里面的Logger的JDKLogger和Logger4j类似