我需要一个真正的jsp模式模板引擎,而不是像jade和ejs:
<%include %>
,如jsp(支持查询参数)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。
答案 0 :(得分:1)
./视图/帐户
<% 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的关系不是很接近。 :(