001/** 002 * Copyright (c) 2015-2022, Michael Yang 杨福海 (fuhai999@gmail.com). 003 * <p> 004 * Licensed under the Apache License, Version 2.0 (the "License"); 005 * you may not use this file except in compliance with the License. 006 * You may obtain a copy of the License at 007 * <p> 008 * http://www.apache.org/licenses/LICENSE-2.0 009 * <p> 010 * Unless required by applicable law or agreed to in writing, software 011 * distributed under the License is distributed on an "AS IS" BASIS, 012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 013 * See the License for the specific language governing permissions and 014 * limitations under the License. 015 */ 016package io.jboot.web.render; 017 018import com.jfinal.kit.JsonKit; 019import com.jfinal.render.IRenderFactory; 020import com.jfinal.render.Render; 021import com.jfinal.render.RenderManager; 022import io.jboot.utils.DateUtil; 023import io.jboot.utils.StrUtil; 024import io.jboot.web.ResponseEntity; 025 026import javax.servlet.http.HttpServletRequest; 027import javax.servlet.http.HttpServletResponse; 028import java.io.File; 029import java.math.BigDecimal; 030import java.math.BigInteger; 031import java.util.Date; 032 033/** 034 * @author Michael Yang 杨福海 (fuhai999@gmail.com) 035 * @version V1.0 036 */ 037public class JbootReturnValueRender extends Render { 038 039 protected IRenderFactory factory = RenderManager.me().getRenderFactory(); 040 protected Object value; 041 protected Render render; 042 043 protected String forwardTo; 044 045 public JbootReturnValueRender(Object returnValue) { 046 047 if (returnValue == null) { 048 this.value = null; 049 } else if (isBaseType(returnValue)) { 050 this.value = String.valueOf(returnValue); 051 } else { 052 this.value = returnValue; 053 } 054 055 initRealRender(); 056 } 057 058 059 protected void initRealRender() { 060 if (this.value == null) { 061 this.render = factory.getNullRender(); 062 } else if (this.value instanceof ResponseEntity) { 063 this.render = new JbootResponseEntityRender((ResponseEntity) value); 064 } else if (this.value instanceof String) { 065 String newVal = ((String) value).toLowerCase(); 066 067 //template 068 if (newVal.endsWith(".html") && !newVal.contains(":")) { 069 this.render = factory.getTemplateRender((String) value); 070 } 071 072 //error 073 else if (newVal.startsWith("error") && newVal.length() > 8) { 074 String trim = ((String) value).substring(5).trim(); 075 if (trim.startsWith(":")) { 076 String errorCodeStr = trim.substring(1).trim(); 077 if (StrUtil.isNumeric(errorCodeStr)) { 078 this.render = factory.getErrorRender(Integer.parseInt(errorCodeStr)); 079 } 080 } 081 if (this.render == null) { 082 this.render = factory.getTextRender((String) value); 083 } 084 } 085 086 //forward 087 else if (newVal.startsWith("forward")) { 088 String trim = ((String) value).substring(7).trim(); 089 if (trim.startsWith(":")) { 090 this.forwardTo = trim.substring(1).trim(); 091 } else { 092 this.render = factory.getTextRender((String) value); 093 } 094 } 095 096 //redirect 097 else if (newVal.startsWith("redirect")) { 098 String trim = ((String) value).substring(8).trim(); 099 if (trim.startsWith(":")) { 100 String redirectTo = trim.substring(1).trim(); 101 if (StrUtil.isNotBlank(redirectTo)) { 102 this.render = factory.getRedirectRender(redirectTo); 103 } 104 } 105 if (this.render == null) { 106 this.render = factory.getTextRender((String) value); 107 } 108 } 109 110 //text 111 else { 112 this.render = factory.getTextRender((String) value); 113 } 114 } else if (this.value instanceof Date) { 115 this.render = factory.getTextRender(DateUtil.toDateTimeString((Date) value)); 116 } else if (this.value instanceof File) { 117 this.render = factory.getFileRender((File) value); 118 } else if (this.value instanceof Render) { 119 this.render = (Render) value; 120 } else { 121 this.render = factory.getJsonRender(JsonKit.toJson(value)); 122 } 123 } 124 125 126 @Override 127 public Render setContext(HttpServletRequest request, HttpServletResponse response) { 128 render.setContext(request, response); 129 return this; 130 } 131 132 @Override 133 public Render setContext(HttpServletRequest request, HttpServletResponse response, String viewPath) { 134 render.setContext(request, response, viewPath); 135 return this; 136 } 137 138 @Override 139 public void render() { 140 this.render.render(); 141 } 142 143 144 protected boolean isBaseType(Object value) { 145 Class<?> c = value.getClass(); 146 return c == String.class || c == char.class 147 || c == Integer.class || c == int.class 148 || c == Long.class || c == long.class 149 || c == Double.class || c == double.class 150 || c == Float.class || c == float.class 151 || c == Boolean.class || c == boolean.class 152 || c == Short.class || c == short.class 153 || c == BigDecimal.class || c == BigInteger.class; 154 } 155 156 public Render getRealRender(){ 157 return render; 158 } 159 160 public String getForwardTo() { 161 return forwardTo; 162 } 163}