【问题标题】:Is there any template engine for node.js express quitely like JSP?是否有任何 node.js 的模板引擎非常像 JSP?
【发布时间】:2012-11-07 15:03:39
【问题描述】:

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

  1. 只需在网页文件夹中新建一个页面文件,在浏览器中输入它的uri,它就会显示出来
  2. 删除这个页面文件,它就会消失
  3. 并支持<%include %> like jsp(支持查询参数)

如果有更多的财富,它会支持像apache tile这样的tile。在 apache 瓦片中,我可以编写一个模板页面,如

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。

我可以做以上所有运行时,不需要重新启动网络服务器。

【问题讨论】:

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


    【解决方案1】:

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

    ./views/account

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

    ./routes/account.js:

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

    【讨论】:

    • 你好,在ejs中,我应该把什么文件放在像jsp这样的文件夹中,而不添加路由声明语句?
    【解决方案2】:

    我几乎没有实现这一点。让我们在 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,现在我们在运行时。

    在视图中放置一个名为 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 Page,您将在控制台上看到test.js 输出'do someting....',然后它会在您的浏览器中呈现同名页面。

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

    因此主题模式还不是很接近 Apache Tiles。 :(

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-12-19
      • 2015-08-21
      • 2011-11-11
      • 1970-01-01
      • 1970-01-01
      • 2011-04-21
      • 1970-01-01
      相关资源
      最近更新 更多