还是一样,如果觉得这里啰嗦,见“–啰嗦分割线–”
记得我是初学者的时候,我自告奋勇地写了一个简单的登录的页面和提交,前端页面代码如下:
<!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,模板引擎,大家会用了吧?