003-Servlet使用模板引擎

本文介绍了在Servlet中如何使用模板引擎来处理前端页面,特别推荐了Pebble模板引擎,因为它有着类似Python的简洁语法。通过添加依赖、编写Java代码和设置模板文件,展示了如何在Servlet中集成并测试Pebble模板引擎,从而实现更方便的页面渲染。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

还是一样,如果觉得这里啰嗦,见“–啰嗦分割线–”

记得我是初学者的时候,我自告奋勇地写了一个简单的登录的页面和提交,前端页面代码如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <title>登录</title>
</head>
<body>
<form action="/login">
    <input name="username" type="text" placeholder="用户名" />
    <input name="password" type="password" placeholder="密码" />
    <button type="submit">提交</button>
</form>
</body>
</html>

???
???
这……

也许,你在<head>里面加一个:

<meta charset="UTF-8">

会好,或者再doGet里面加:

resp.setHeader("content-type", "text/html;charset=UTF-8");
resp.setCharacterEncoding("UTF-8");

但是有的时候,可能解决不了问题。这个时候,模板引擎就可以解决这个问题。不仅是这样,它还比JSP写起控制逻辑或变量更加方便!

—啰嗦分割线—

下面就不多说了,上代码!
首先,我们创建一个ModelAndView.java,用于设定页面的html文件和模型:

import java.util.Map;

public class ModelAndView {
    private String view;
    private Map<String, Object> model;

    public ModelAndView() {}

    public ModelAndView(String view) {
        this.view = view;
    }

    public ModelAndView(String view, Map<String, Object> model) {
        this.view = view;
        this.model = model;
    }

    // 获取所有模型
    public Map<String, Object> getModels() {
        return model;
    }

    // 一次设置所有模型
    public void setModels(Map<String, Object> model) {
        this.model = model;
    }

    // 获取视图(html文件)名称
    public String getViewName() {
        return view;
    }

    // 设置视图(html文件)名称
    public void setViewName(String view) {
        this.view = view;
    }

    // 添加模型
    public void addObject(String k, Object v) {
        model.put(k, v);
    }

    // 删除模型
    public void removeObject(String k) {
        model.remove(k);
    }
}

然后,我们需要选择一个模板。常见的模板有:

但我不太喜欢它们几个的语法。我更喜欢Pebble模板引擎。它和那个啥……哦,Python的语法很像:

<html>
<body>
  <ul>
  {% for user in users %}
    <li><a href="{{ user.url }}">{{ user.username }}</a></li>
  {% endfor %}
  </ul>
</body>
</html>

{% ... %}代表控制语句,{{ ... }}代表模型(变量)。
我们就以Pebble为例吧!上代码,奥利给!

Maven所有依赖:

<dependencies>
    <dependency>
        <groupId>org.apache.tomcat.embed</groupId>
        <artifactId>tomcat-embed-core</artifactId>
        <version>9.0.39</version>
    </dependency>
    <dependency>
        <groupId>org.apache.tomcat.embed</groupId>
        <artifactId>tomcat-embed-jasper</artifactId>
        <version>9.0.39</version>
    </dependency>
    <dependency>
        <groupId>io.pebbletemplates</groupId>
        <artifactId>pebble</artifactId>
        <version>3.1.4</version>
    </dependency>
</dependencies>

其中这一段:

<dependency>
    <groupId>io.pebbletemplates</groupId>
    <artifactId>pebble</artifactId>
    <version>3.1.4</version>
</dependency>

就是Pebble的依赖。
上Java代码!

创建ViewEngine.java,封装模板引擎代码!:

import com.mitchellbosecke.pebble.PebbleEngine;
import com.mitchellbosecke.pebble.loader.ServletLoader;
import com.mitchellbosecke.pebble.template.PebbleTemplate;

import javax.servlet.ServletContext;
import java.io.IOException;
import java.io.Writer;

public class ViewEngine {
    private final PebbleEngine engine;

    public ViewEngine(ServletContext servletContext) {
        ServletLoader loader = new ServletLoader(servletContext);
        // 模板编码:
        loader.setCharset("UTF-8");
        // 模板前缀,这里默认模板必须放在`/templates/`目录:
        loader.setPrefix("/templates/");
        // 模板后缀:
        loader.setSuffix(".html");
        // 创建Pebble实例:
        this.engine = new PebbleEngine.Builder()
                .autoEscaping(true) // 默认打开HTML字符转义,防止XSS攻击
                .cacheActive(false) // 禁用缓存使得每次修改模板可以立刻看到效果
                .loader(loader).build();
    }

    public void render(ModelAndView mv, Writer writer) throws IOException {
        // 查找模板:
        // 这里带入了视图名称
        PebbleTemplate template = this.engine.getTemplate(mv.getViewName());

        // 渲染:
        // 这里带入了ModelAndView中的所有模型,模板引擎会帮我们传到前端
        template.evaluate(writer, mv.getModels());
    }
}

然后我们写个Servlet测试一下:

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet(urlPatterns = "/test")
public class TestServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        ViewEngine engine = new ViewEngine(getServletContext());

        resp.setContentType("text/html");
        resp.setCharacterEncoding("UTF-8");

        ModelAndView mv = new ModelAndView("test");
        engine.render(mv, resp.getWriter());
    }
}

再创建test.html,写前端页面:

<!DOCTYPE html>
<html lang="en">
<head>
    <title>Test</title>
</head>
<body>
<h1>Hello, world!</h1>
</body>
</html>

启动项目!
面对疾风吧!
完美
非常完美。
再来,来个中文版的!

<!DOCTYPE html>
<html>
<head>
    <title>测试</title>
</head>
<body>
<h1>奥利给!</h1>
</body>
</html>

奥利给!
Wonderful! Unbelievable! Bravo! Incomparable!
哈哈,说着玩的。

OK,模板引擎,大家会用了吧?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值