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()代码也贴出来吧,
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类似