有没有类似于JSP的Node.js Express静态模板引擎?

4

我需要一个真正的jsp模板引擎,不像jade和ejs:

  1. 只需将新页面文件放在网页文件夹中,输入其URI到浏览器中,即可显示
  2. 删除此页面文件,它就会消失
  3. 并支持像jsp一样的<%include %>(支持查询参数)

如果更好的话,它可以支持Apache Tile。在Apache Tiles中,我可以编写类似以下代码的模板页面:

main.jsp:
<%@ taglib uri="http://tiles.apache.org/tags-tiles" prefix="tiles" %>
<tiles:insertTemplate template="/layout/simple.jsp">
  <tiles:putAttribute name="header"  value="/common/header.jsp" />
  <tiles:putAttribute name="left" value="/common/leftmenu.jsp" />
  <tiles:putAttribute name="body" value="<%= request.getParameter("body")%>" />
  <tiles:putAttribute name="footer"   value="/common/footer.jsp" />
</tiles:insertTemplate>

现在输入main.jsp?body=content1.jsp,你会看到content.jsp出现在main.jsp内部,装饰layout/simple.jsp。
我可以在运行时完成所有上述操作,无需重新启动web服务器。
2个回答

3
ejs可能是最接近的东西。 https://github.com/visionmedia/ejs ./views/account
<% if (user) { %>
    <h2><%= user.name %></h2>
<% } %>

./routes/account.js:

   res.render('account', { user: user });

嗨,在ejs中,我应该像jsp一样将哪个文件放入文件夹中,而不需要添加路由声明语句? - Inshua

0

我已经快完成这个了。让我们在express的ejs示例中添加一些内容。https://github.com/visionmedia/express

修改index.js,首先导入vm和fs。

var express = require('express'),
    fs = require('fs'), 
    vm = require('vm');

然后,将所有的*.shtml文件(任何扩展名都可以)路由到相应的页面。

app.get('*.shtml', function(req, res){
  var url = req._parsedUrl.pathname;
  url = url.substring(1, url.length - 6);
  //console.log(req);
  var jsPath = 'controllers/' + url + '.js';
  //console.log('jsPath ' + jsPath);
  if(fs.existsSync(jsPath)){
      var code = fs.readFileSync(jsPath);
      var context = vm.createContext({req : req, res : res, url : url, console : console});
      vm.runInContext(code, context, jsPath);
  } else {
      res.render(url, req.query);
  }  
});

现在,测试。

运行 node index.js,现在我们处于运行时。

在 views 中放置一个名为 test.html 的新文件。

test.html:

<% include header.html %>

<h1>Test</h1>

<% include footer.html %>

输入 test.shtml?title=Test Page,这个页面就会显示出来。查询参数title绑定在header.html中。

但是,在页面中我们可以做的很少,因为渲染由res.render()控制。如果我们想在渲染之前做一些事情,或者直接输出一些非HTML内容,让我们看看怎么做。

创建一个名为controllers的文件夹,然后创建一个名为test.js的文件。

test.js
console.log('do something....');
res.render(url, req.query);

重新输入test.shtml?title=测试页面,您将在控制台上看到test.js输出“做一些事情...”,然后它会在您的浏览器中呈现相同名称的页面。

所有控制器js和html文件都是动态的~~~

因此,主题模式与Apache Tiles的关系还不是非常紧密。:(


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接