如何配置Javalin以正确渲染Pebble模板页面?
问题根因
当前配置把存放Pebble模板的目录纳入了静态资源路径,访问时Javalin会直接读取文件原始文本返回给浏览器,完全没有走模板引擎渲染流程,因此Pebble的{% %}、{{ }}语法标签会直接原样展示在页面上。
正确配置步骤
- 调整项目目录结构
把css、js、图片等不需要动态渲染的静态资源放在src/main/resources/public目录,保留给静态资源配置使用;所有Pebble模板文件(包括login.html、base.html)统一移动到src/main/resources/templates目录,禁止将templates目录配置为静态资源路径。 - 引入必要依赖
确保项目中引入了Javalin渲染模块和Pebble模板引擎依赖,Maven配置示例如下:<dependency> <groupId>io.javalin</groupId> <artifactId>javalin-rendering</artifactId> <version>与你当前使用的Javalin版本保持一致</version> </dependency> <dependency> <groupId>io.pebbletemplates</groupId> <artifactId>pebble</artifactId> <version>3.2.2</version> </dependency> - 修改启动配置代码
注册Pebble模板渲染器,路由逻辑不要直接重定向到模板文件路径,而是调用render()方法触发模板渲染,正确代码示例:import io.javalin.Javalin; import io.javalin.http.staticfiles.Location; import io.javalin.rendering.template.JavalinPebble; import java.util.Map; public class App { public static void main(String[] args){ Javalin app = Javalin.create(config -> { // 仅配置静态资源目录,不存放模板文件 config.addStaticFiles("src/main/resources/public", Location.EXTERNAL); // 注册Pebble模板引擎,默认读取classpath下templates目录的模板 config.fileRenderer(new JavalinPebble()); }); app.start(9090); app.get("/", ctx -> { // 渲染模板,传入模板需要的上下文变量 ctx.render("login.html", Map.of("success", "")); }); } }
额外注意点
- 模板中引用的继承、包含组件(比如示例中的
base.html)需要放在templates目录下,保持相对路径和模板中写的路径一致 - 如果需要自定义模板加载路径、开启模板缓存等配置,可以自行构建
PebbleEngine实例传入JavalinPebble构造方法
内容的提问来源于stack exchange,提问作者Hiep Huynh
相关产品推荐
相关产品推荐

