找了一圈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的方法。