需求:根据请求吐出一些json串
实现:借助 jfinal 的 renderJson很快就实现了。
问题: 出现if else 时某个分支没有处理,服务500 ,提示FREE_MARKER XXX 地址不存在, 由于该服务仅限于返回json ,压根没有烤梨页面,模板什么的。
解决:1、在枚举 ViewType类增加一个JSON
效果如下:
public enum ViewType { JSP, FREE_MARKER, VELOCITY, JSON, OTHER; }
2、修改RenderFactory类,加入json相关内容。
效果如下:
public class RenderFactory { private Constants constants; private static IMainRenderFactory mainRenderFactory; private static IErrorRenderFactory errorRenderFactory; private static ServletContext servletContext; static ServletContext getServletContext() { return servletContext; } private static final RenderFactory me = new RenderFactory(); private RenderFactory() { } public static RenderFactory me() { return me; } public static void setMainRenderFactory(IMainRenderFactory mainRenderFactory) { if (mainRenderFactory != null) RenderFactory.mainRenderFactory = mainRenderFactory; } public static void setErrorRenderFactory(IErrorRenderFactory errorRenderFactory) { if (errorRenderFactory != null) RenderFactory.errorRenderFactory = errorRenderFactory; } public void init(Constants constants, ServletContext servletContext) { this.constants = constants; RenderFactory.servletContext = servletContext; // init Render Render.init(constants.getEncoding(), constants.getDevMode()); initFreeMarkerRender(servletContext); initJspRender(servletContext); initFileRender(servletContext); initJsonRender(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.JSON) mainRenderFactory = new JsonRenderFactory(); else throw new RuntimeException("View Type can not be null."); } // create errorRenderFactory if (errorRenderFactory == null) { errorRenderFactory = new ErrorRenderFactory(); } } 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!"); } } private void initJspRender(ServletContext servletContext) { try { Class.forName("javax.el.ELResolver"); Class.forName("javax.servlet.jsp.JspFactory"); com.jfinal.plugin.activerecord.ModelRecordElResolver.init(servletContext); } catch (ClassNotFoundException e) { // System.out.println("Jsp or JSTL can not be supported!"); } catch (Exception e) { } } private void initJsonRender(ServletContext servletContext){ //@TODO 不知道如何继续了 } private void initFileRender(ServletContext servletContext) { FileRender.init(getFileRenderPath(), servletContext); } private String getFileRenderPath() { String result = constants.getFileRenderPath(); if (result == null) { result = PathKit.getWebRootPath() + DEFAULT_FILE_RENDER_BASE_PATH; } if (!result.endsWith(File.separator) && !result.endsWith("/")) { result = result + File.separator; } return result; } /** * Return Render by default ViewType which config in JFinalConfig */ public Render getRender(String view) { return mainRenderFactory.getRender(view); } public Render getFreeMarkerRender(String view) { return new FreeMarkerRender(view); } public Render getJspRender(String view) { return new JspRender(view); } public Render getJsonRender() { return new JsonRender(); } public Render getJsonRender(String key, Object value) { return new JsonRender(key, value); } public Render getJsonRender(String[] attrs) { return new JsonRender(attrs); } public Render getJsonRender(String jsonText) { return new JsonRender(jsonText); } public Render getJsonRender(Object object) { return new JsonRender(object); } public Render getTextRender(String text) { return new TextRender(text); } public Render getTextRender(String text, String contentType) { return new TextRender(text, contentType); } public Render getTextRender(String text, ContentType contentType) { return new TextRender(text, contentType); } public Render getDefaultRender(String view) { ViewType viewType = constants.getViewType(); if (viewType == ViewType.FREE_MARKER) { return new FreeMarkerRender(view + constants.getFreeMarkerViewExtension()); } else if (viewType == ViewType.JSP) { return new JspRender(view + constants.getJspViewExtension()); } else if (viewType == ViewType.JSON) { return new JsonRender(); } else { return mainRenderFactory.getRender(view + mainRenderFactory.getViewExtension()); } } public Render getErrorRender(int errorCode, String view) { return errorRenderFactory.getRender(errorCode, view); } public Render getErrorRender(int errorCode) { return errorRenderFactory.getRender(errorCode, constants.getErrorView(errorCode)); } public Render getFileRender(String fileName) { return new FileRender(fileName); } public Render getFileRender(File file) { return new FileRender(file); } public Render getRedirectRender(String url) { return new RedirectRender(url); } public Render getRedirectRender(String url, boolean withQueryString) { return new RedirectRender(url, withQueryString); } public Render getRedirect301Render(String url) { return new Redirect301Render(url); } public Render getRedirect301Render(String url, boolean withQueryString) { return new Redirect301Render(url, withQueryString); } public Render getNullRender() { return new NullRender(); } public Render getJavascriptRender(String jsText) { return new JavascriptRender(jsText); } public Render getHtmlRender(String htmlText) { return new HtmlRender(htmlText); } public Render getXmlRender(String view) { return new XmlRender(view); } // -------- private static final class FreeMarkerRenderFactory implements IMainRenderFactory { public Render getRender(String view) { return new FreeMarkerRender(view); } public String getViewExtension() { return ".html"; } } private static final class JspRenderFactory implements IMainRenderFactory { public Render getRender(String view) { return new JspRender(view); } public String getViewExtension() { return ".jsp"; } } private static final class JsonRenderFactory implements IMainRenderFactory { public Render getRender(String view) { return new JsonRender(); } public String getViewExtension() { return ""; } } private static final class ErrorRenderFactory implements IErrorRenderFactory { public Render getRender(int errorCode, String view) { return new ErrorRender(errorCode, view); } } }
3、在config里配置configConstant
me.setViewType(ViewType.JSON);