4

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

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

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

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。

我可以在运行时完成以上所有操作,无需重新启动网络服务器。

4

2 回答 2

3

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

./views/account

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

./routes/account.js:

   res.render('account', { user: user });
于 2012-11-07T20:08:03.000 回答
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 %>

type test.shtml?title=Test Page,所以这个页面转向显示。并在 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。:(

于 2012-11-08T08:58:35.923 回答