JSP 与 HTML 的关系

我发现不少初学者不能很好理解 JSP 与 HTML 的关系,不少的视频教程也没有强调两者间的关系,或者只是说得很简略。

先来看一张图:

image

这里很好概括了两者的关系,简单讲就是 JSP 是 HTML 的模板,用于生成 HTML。

请求一个比如 index.jsp,并不是为了获取这个 jsp 本身的内容,而是获取这个 JSP 所生成的 HTML(可以包括 Javascript 及 CSS 等)。

这个生成过程在服务器端完成,在这个过程中,所有的 JSP 的 tag,各种表达式(jstl,el 等)以及各种脚本被处理以生成最终的 HTML。

最终得到的 HTML 被发送到浏览器端,内容中也不再包含 JSP 的各种 tag 等,因为浏览器实际上也不认识这些东西。

一个单纯的 HTML 页面中如果包含这些则是非法的。

当然,这个生成过程可以是动态的,可以边生成,边往浏览器端发送,可以完全是一种流式的(事实上也是如此),服务器端不需要真正生成一个 HTML 文件。

另外这个过程是在服务器端完成的。这点要跟一些客户端模板技术区别开,比如一些 js 的框架,如 Angular,vue 之类的。

JSP 属于后端模板,数据在后台与 tag 及 el 表达式等作用生成最终的 HTML,处理过程由 tomcat 等 servlet 容器完成。

Angular 等属于前端模板,数据与 HTML 页面一起发送到浏览器端,或者单独再通过另一次 ajax 请求到达前台(通常为 json 格式),然后由 javascript 引擎处理模板得到最终的 HTML,这个处理过程在前台由浏览器完成。

注意:JSP 也可以在后端生成一个前端模板,然后交给前台。事实上,http 是一个文本协议,JSP 在后端可以生成什么文本由程序员自己决定。

我们说 JSP 是 HTML 的模板,但如果你要用 JSP 生成 XML,那也未尝不可。

如果对 JSP 页面的结果有疑问,可以在浏览器端用开发人员工具查看最终发送过去的 HTML,看看是哪个环节的生成结果有误。

minifier——一个 nodejs 的 js 及 css 压缩插件

简要介绍了如何通过 minifier 插件来精简压缩 js 和 css 文件。

minifier 是一个 nodejs 下的用于压缩 js 和 css 文件的插件。

首先确保已经安装了 nodejs 的环境,然后通过以下命令安装此插件:

npm install [-g] minifier

之后,如下图所示:假如在 d:\dev\exp\web 下有一些 js 和 css 文件:

那么,假如想压缩那个 hello.js 文件,则通过执行如下 minify 命令:

minify hello.js

则当前文件夹下会默认生成一个叫 hello.min.js 的精简压缩的文件:

压缩之前文件是这样:

[js]/**

  • test minify */ function sayHello(name) { console.log('hello ' + name + '.'); } // hello golden sayHello('golden');[/js]

之后的 min 版本的文件则这样:

[js]/**

  • test minify */ function sayHello(l){console.log("hello "+l+".")}sayHello("golden") [/js]

可以看到,除了开头处的 jsdoc 文件注释保留原样外,其它部分都变得很紧凑了,某些注释也去掉了,甚至一些局部变量名也简化了。

压缩 css 文件过程类似。

如果不喜欢它缺省的文件名,还可以用 --output 选项显式指定压缩后的文件名(还可以包含一个不同的路径):

minify --output my.js hello.js

那么压缩后的文件名则变为 my.js,位置与原文件相同(因为没有额外指定其它路径)。

还可以去到上一级目录上,然后针对整个 web 文件夹执行 minify 命令:

minify web

如此则将整个 web 文件夹下的所有 js 和 css 文件都压缩了,压缩后的文件名还是按缺省的方式,也即是 xxx.min.js 或 xxx.min.css,并放在跟原文件同样的位置。

更多用法可以参考官网的介绍:https://www.npmjs.com/package/minifier

Javascript 实现匿名递归

介绍了在 javascript 中利用 arguments.callee 来实现匿名递归的方式.

递归是一种常见的编程技巧, 实名递归相信大家都不陌生, 但如果想要实现匿名递归呢? 比如想要返回一个匿名递归函数, 又或者是定义一个匿名递归函数并直接调用它, 该怎样去做呢? 本文将来探讨一下它的实现.

实名递归

我们还是先从实名递归说起吧, 还是用那个最简单的求阶乘的例子:

function fact(n) {
	if (n < 2) {
		return n;
	} else {
		return n * fact(n - 1);
	}
}
console.log(fact(5));

递归要求自己调用自己, 如果函数有名字, 这就太简单不过了.

继续阅读

Web 开发的几本必读之书推荐

Web 开发的几本必读之书推荐,O'Relly 的动物书权威指南系列。

对于 web 开发,之前推荐了 W3schools——一个学习 HTML,CSS 和 Javascript 的好网站W3schools——一个学习 HTML,CSS 和 Javascript 的好网站这个网站。对于初步了解,这已经够了,但想进一步了解,那就要通过书籍了。

总体而言,IT 技术书籍方面,O’Relly 出版社的《XXX 权威指南》系列是不错的。对于 web 方面,我觉得以下几本书值得一看。(单击图片链接查看具体详情)

Http 权威指南

Http 权威指南

HTML 与 XHTML 权威指南

HTML 与 XHTML 权威指南

CSS 权威指南

CSS 权威指南

Javascript 权威指南

Javascript 权威指南

关于这几本动物的书就介绍到这里。如果你有更好的推荐,欢迎留言!