Nodejs中ejs的页面中有没有和jsp一样的内置对象?
Nodejs中ejs的页面中有没有和jsp一样的内置对象?
<p>jsp中有out,page,reqeust等内置对象,ejs的页面中有类似写法吗?</p>
<p>ejs的资料除了 https://github.com/visionmedia/ejs 中的readme意外,有没有其他资料了?</p>
<p><%= %>和<%- %>的unescape是什么意思?</p>
<p>谢谢。</p>
Node.js 中 EJS 页面中的内置对象
JSP 内置对象 vs EJS 内置对象
在 JSP 中,有一些内置对象如 out
、page
和 request
等,它们可以直接在页面中使用,无需显式声明。那么在 EJS 中是否也有类似的内置对象呢?
EJS 中的内置对象
EJS 是一个简单易用的模板引擎,它提供了几个内置对象来帮助你处理数据和逻辑。这些内置对象主要包括:
locals
对象:这是 EJS 中最常用的内置对象之一。你可以通过locals
对象向 EJS 模板传递数据。app
对象(如果你使用 Express 框架):Express 提供了一些全局对象,如app
和res
。
示例代码
假设你有一个简单的 Express 应用,并且你希望将一些数据传递给 EJS 模板:
const express = require('express');
const app = express();
const ejs = require('ejs');
// 设置视图引擎为 EJS
app.set('view engine', 'ejs');
// 定义路由
app.get('/', (req, res) => {
// 使用 locals 对象传递数据
res.locals.user = { name: 'John Doe' };
res.render('index');
});
// 启动服务器
app.listen(3000, () => {
console.log('Server is running on port 3000');
});
在这个例子中,我们定义了一个路由 /
,并使用 res.locals
将用户对象传递给 EJS 模板。然后,在 EJS 模板中,我们可以直接访问 user
对象:
<!-- views/index.ejs -->
<!DOCTYPE html>
<html>
<head>
<title>EJS Example</title>
</head>
<body>
<h1>Welcome, <%= user.name %></h1>
</body>
</html>
在这个例子中,<%= user.name %>
就是访问 locals
对象中的 user
对象的属性。
<%=
和 <%-
的含义
<%=
和 <%-
在 EJS 中用于不同的目的:
<%=
:用于输出变量的内容,并且会自动转义 HTML 特殊字符(如<
,>
,&
等),以防止 XSS 攻击。<%-
:用于输出变量的内容,但不会进行转义,这可能会导致 XSS 攻击的风险。
例如:
<!-- views/index.ejs -->
<h1><%= '<script>alert("XSS")</script>' %></h1> <!-- 输出 <script>alert("XSS")</script> -->
<h1><%- '<script>alert("XSS")</script>' %></h1> <!-- 输出 <script>alert("XSS")</script> -->
总结来说,EJS 提供了一些内置对象和标签,可以方便地处理数据和逻辑。虽然没有像 JSP 那样的 out
和 page
对象,但 locals
和 Express 的 app
对象提供了类似的功能。
Unbuffered code for conditionals etc <% code %>
不会有缓存的(就是不会生成值的)代码(用来控制逻辑的)
Escapes html by default with <%= code %>
默认转化为 html 的代码
Unescaped buffering with <%- code %>
不转化为 html 且有产生值的代码
个人的理解
仅供参考
在ejs的模版中可以使用的对象有request和response对象。 比如你在session中存储了用户信息user.包含有username和email地址。那么你在模版中可以用一下方法调用:
当前登录用户:<%=request.session.user.username%>
邮件地址:<%=request.session.user.emal%>
Escapes html by default with <%= code %> 默认转化为 html 的代码 这就好比如果这个code中内容如下
<b>你好么</b>
使用<%=code%>时,页面看到就是: <b>你好么</b>
使用<%-code%>时,页面看到就是: 你好么
看到了,今天上线时修复
不知道你说的request和response对象是在哪个环境下提供的?我用的Express框架。 不知道你的信息是从那里获取来的?直接看的源代码吗?
您好,运行提示request is not defined session is not defined
在Node.js中使用EJS模板引擎时,并没有与JSP中完全相同的内置对象。不过,EJS提供了几种内置变量和一些默认对象,可以在模板中直接使用。
-
内置变量:
locals
: 这个对象包含通过res.render('templateName', locals)
传递给模板的数据。settings
: 包含一些EJS的配置选项。
-
默认对象:
request
和response
: 如果你在Express框架中使用EJS,这些对象会自动传递给模板。app
: 应用实例(如果你需要访问应用级别的设置)。
示例代码
假设你使用Express来渲染一个EJS模板:
// app.js
const express = require('express');
const app = express();
app.set('view engine', 'ejs');
app.get('/', (req, res) => {
const data = {
title: 'Hello EJS',
message: 'Welcome to my page!'
};
res.render('index', data);
});
app.listen(3000, () => {
console.log('Server running on port 3000');
});
在views/index.ejs
文件中:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title><%= title %></title>
</head>
<body>
<h1><%= message %></h1>
<p>Request URL: <%= request.url %></p>
<p>Response Status: <%= response.statusCode %></p>
</body>
</html>
在这个例子中:
<%= title %>
使用了传递给模板的data
对象中的title
属性。<%= request.url %>
和<%= response.statusCode %>
使用了通过Express传递给模板的request
和response
对象。
解释
<%= %>
: 输出不转义的内容。<%- %>
: 输出内容并且不转义,通常用于包含外部文件或HTML片段。
关于unescape
问题,<%- %>
是用来输出未经转义的内容,而<%= %>
默认会转义输出以防止XSS攻击。因此,<%- %>
可以理解为"不要转义"的意思。
希望这些信息对你有所帮助!如果你还有其他问题,请继续提问。