需求:根据请求吐出一些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);