从任意路径读取模板文件

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



评论区

JFinal

2017-07-29 22:28

这个需求经常有人问题,非常有价值的分享

JFinal

2017-07-29 22:30

还有一个扩展方式是通过 ISource 接口来做,ISource 里面有一个 getContent() 方法是用来得到模板内容的,实现这个接口后,可以这样来用:
Engine.use().getTemplate(new MySource(fileName)).render(...);

注意:ISource 是最新版本 jfinal 3.2 的名字,在老版本中叫: IStringSource

当然,用 RenderManager.me().getEngine() 获取到 engine 对象也是可以的,这个 engine 对象与 configEngine(Engine engine) 中的是同一个对象

热门分享

扫码入社