node.js是否有任何模板引擎像JSP一样表达?

时间:2012-11-07 15:03:40

标签: node.js jsp express tiles template-engine

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

  1. 只需将新页面文件放入网页文件夹,在浏览器中输入uri即可显示
  2. 删除此页面文件,它将消失
  3. 并支持<%include %>,如jsp(支持查询参数)
  4. 如果更多的财富,它将支持像阿帕奇瓷砖的瓷砖。在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,dress layout / simple.jsp中。

    我可以在运行时完成所有操作,无需重启webserver。

2 个答案:

答案 0 :(得分:1)

ejs可能是最接近的东西。 https://github.com/visionmedia/ejs

./视图/帐户

<% if (user) { %>
    <h2><%= user.name %></h2>
<% } %>

./路由/ account.js:

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

答案 1 :(得分: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);
  }  
});

现在,测试。

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

在视图中放置一个名为test.html的新文件

test.html:

<% include header.html %>

<h1>Test</h1>

<% include footer.html %>

输入test.shtml?title=Test Page,因此此页面会显示。并在header.html中查询参数 title bind。

好吧,但是我们可以在页面中做得更少,因为渲染是由res.render()控制的。如果我们想在渲染之前做一些事情,或者直接输出一些东西而不是html内容,那就看看吧。

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

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

再次键入test.shtml?title=Test Page,您将在控制台上看到test.js输出'do someting ....',然后在浏览器中呈现同名页面。

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

因此主题模式与Apache Tiles的关系不是很接近。 :(

相关问题