如何在Controller中获取baseViewPath

@JFinal 如何中在Controller获取baseViewPath?想用renderTemplate(template,MapData)方法,发现template要传绝对路径,如何改为向render("aaa.html")一样自动加上baseViewPath?

评论区

icaotw

2017-08-14 16:54

public String renderToString(String template, Map data) {
return renderManager.getEngine().getTemplate(template).renderToString(data);
} template如何加上baseViewPath?

JFinal

2017-08-14 17:27

建议用一个拦截器辅助来做一下,添加一个拦截器,并通过如下代码将 viewPath 存放在 ThreadLocal 中:
public ViewPathInterceptor implements Interceptor {
private static final ThreadLocal threadLocal = new ThreadLocal();

public void intercept(Invocation inv) {
threadLocal.set(inv.getViewPath);
try {
inv.invoke();
} finally {
threadLocal.remove();
}
}

public static String getViewPath() {
return threadLocal.get();
}
}

然后在 BaseController extends Controller 中覆盖掉原先的 renderTemplateToString 方法,先通过 ViewPathInterceot.getViewPath() 获取到 viewPath,然后再与 template 参数组合一下即可

JFinal

2017-08-14 17:28

最后将 ViewPathInterceptor 配置为全局拦截器就好。 如果没有使用 BaseController,可以通过 inv.getController().setAttr("viewPath", ...) 传递也可以

ThreeX

2017-08-14 17:34

干不到。在Controller里没办法搞到viewPath,可以手工加上去(viewPath+template)。getTemplate是直接从baseTemplatePath取文件,这里可能需要改进。是的,这个方法需要改进。

JFinal

2017-08-14 17:38

@ThreeX 我倒是建议,直接用绝对路径:
renderTemplateToString("/path/file.html");

这类方法使用应该不多,偶尔不用 viewPath 还可以,除非你大量在用这个方法

icaotw

2017-08-14 18:09

好吧。。确实是有其他办法可以解决这个问题,我只是想知道有没有比较简便的方式可以直接获取baseViewPath

热门反馈

扫码入社