上集回顾
在了解模板引擎之前首先我们看看普通的动态插入生成HTML代码:
代码如下:
// movie 对象 是一个json对象我们动态插入文档中
var movie = [
{
"name" : "The Mirror",
"year" : 2012
},
{
"name": "last night",
"year": 2016
}
];
$.each(movie,function (data) {
if(data.length === 0) return;
var partial =
"<dt>"+data.name+"</dt>"
+"<dd>"+data.year+"</dd>" ;
document.body.appendChild(partial);
})
事实上partial的拼接字符串还不够长,或者我们实际做一个动态生成网页你就会明白痛苦所在。
快速了解模板引擎
模板:
<div class="entry"> <h1>{{title}}</h1> <div class="body"> {{{body}}} </div></div>
给定一个上下文:
{ title: "All about <p> Tags", body: "<p>This is a post about tags</p>"}
注意{{{body}}}
是三个括号,与两括号的区别在于:两括号会对上下文的内容进行HTML转义,就是把p标签
作为文本显示给用户,而不是把它作为一个HTML标签。
选择模板引擎
事实上有大概十多种模板可供选择:
嗯,我们不选择Express默认的Jade,因为它的缩进及抽象会让新手感到非常Angry的,相当于重新学了一遍html难道不是吗??
值得一提的是,Jade和Express是同一个人发明的。
更为简单的Handlebars
我们来看看Handlebars引擎是怎样使用上下文结合模板渲染HTML的:
//
res.render('admin/home',{
name:'Buttercup'
})
/************* admin / home.hbs **************/
<h1>the home </h1>
<p>Welcome , {{name}}</p>
/*************** entry HTML ********************/
<h1> the home </h1>
<p>Welcome , Buttercup</p>
模板的复用与包含
如果我们有一个头部文件包含很多公共的静态资源引用,我们叫它模板A,
那么我们如果每一个页面都重写一个模板A确实是太烦了,因此我们这样在任意模板引用它:
// 引用以>开头
{{>A.hbs}}
小提示: 如果你的文件包含"-"这个符号,是这样引用的:
// xx-header.hbs
{{>xx_header.hbs}}
还有更为详尽的hbs语法详见
表单处理
一个HTTP表单请求一般包括四部分的内容:
HTTP方法(method),用来标识对资源的操作,对应上述的POST
。
路径(path),用来标识资源的位置,对应上述的/some/thing
;
URL参数(query),对应上述的guest=true
;
请求体(body),即请求附带的数据,对应上述的title=test&subtitle=somefinetitle
。请求体(body)往往是表单的主体。可能包括几个键值对,或者json数据,甚至可能是二进制文件。对于不同的内容我们需要请求体编码,否则服务器将很难知道我们提交的到底是什么东西。HTTP协议使用MIME框架来进行请求体编码,并在请求头的Content-Type
字段指定编码类型。表单中常用的又如下3种内容编码(MIME类型):
urlencoded:就像GET请求中的URL那样进行编码,例如title=test&subtitle=somefinetitle
;
multipart:使用定界符分隔的表单,一般用来包含二进制的文件;
json:顾名思义,这时可以提交一个json对象到服务器。
我们已经了解到了HTTP协议可以用来传输HTML文件给客户端。那么服务器如何接受用户的操作呢?这便需要HTTP POST方法,和Web表单的帮助。在继续开发之前,先来了解一下HTTP表单的基础知识。HTTP 协议提供了6中方法,该方法名将作为HTTP请求头部字段,用来标识操作的类型:
GET:获取URI制定的信息。
HEAD:同GET,但服务器不返回消息体。
POST:请求服务器接受请求中包装的实体,将其作为URI标识的资源的附属信息。
PUT:让服务器将请求中包装的实体存储为URI标识位置。
DELETE:让服务器将URI标识的资源删除。
TRACE:调用远程的应用层环回。最终服务器应将收到的消息包装为实体并返回状态码为200的应答。
还记得吗?服务器传输HTML文件给客户端使用的是HTTP GET方法。客户端提交信息给服务器,常常采用POST方法。Web表单(form)是一种特殊的HTML标签,它负责产生一个POST请求给服务器,并拿回结果给浏览器。
/*****************************以上来自互联网********************/
用户注册
/********************register.js ********************/
var router = require('express').Router();、
router.route('/register') // 返回注册页面
.get(function (req, res) {
res.render('account/register', {title: '注册'}) // 接受用户表单
.post(function (req, res, next) {
var username = req.body.username, password = req.body.password;
console.log('Register post received!');
console.log('username:', username, 'password::', password);
res.end('成功收到POST请求'); });
module.exports = router;
我们逐步来分析上述代码做了什么?
首先实例化一个Router对象这样我们就能快捷方便的操作路由然后如果有人或者猫向/register这个路由发起get请求我们就扔给Ta一张account/resister的模板并把title渲染为注册。
如果有人或者猫这张表单发起post请求也就是提交表单 我们得到用户的账号密码并且在命令行打印出来相关信息。
小问题:
本来如果没有安装body-parser第三方模块的话,我们是不能使用xxx.body.yyy这种形式的,一切都来自xxx.query.yyy ,query是用来表示参数的。
如同这个req.body.username,是指属性name为username的值我们把它给提交给服务器来处理。
表单的验证这里不会涉及因为大多数前端代码与静态代码一样,或者参加拙作javascript策略模式
作者:颜卿今天Coding了吗
链接:http://www.jianshu.com/p/6b501b3aed77
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。