找了一圈controller,似乎并没有直接的支持。在跟踪的时候发现,原来Engine早有了这样的功能。于是,
先写个BusController。
public abstract class BusController extends Controller { private static final RenderManager renderManager = RenderManager.me(); public String renderToString(String content) { return renderManager.getEngine().getTemplateByString(content).renderToString(putRequestAttrsInMap(getRequest())); } public void renderHtmlWithTemplate(String content) { renderHtml(renderToString(content)); } public Map<?, ?> putRequestAttrsInMap(HttpServletRequest request) { if (request == null) { return null; } Map<String, Object> map = new HashMap<String, Object>(); Enumeration<String> names = request.getAttributeNames(); while (names.hasMoreElements()) { String name = names.nextElement(); Object value = request.getAttribute(name); map.put(name, value); } return map; } }
然后写个IndexController继承BusController就可以愉快地玩耍了。
@UrlMapping(url="/admin/index", routeClass=AdminRoutes.class, viewPath="/ooo") public class IndexController extends BusController { public void index() { File file = new File("D:\\360Chrome\\page.html"); String html = FileKit.onceReadToString(file); Kv kv = new Kv(); kv.set("hello", "hello"); kv.set("world", "world"); setAttr("wo", kv); renderHtmlWithTemplate(html); } }
然后就可以传入任意路径的模板文件了,此时路由中的viewPath不会起作用。
当然也可以直接以拼接字符串的方式构造模板,有时我们需要从项目外读取模板文件,这是相当的方便啊!
FileKit.onceReadToString是从文件读取内容为字符串,网上一搜一大堆,代码就不贴出来了哈。
这是一个小小的技巧,主要功规于Engine中有getTemplateByString的方法。