在说完了网页中的编码与乱码(一, 二, 三, 四, 五 ), servlet 中的编码问题 后, 这次来探讨一下 JSP 中的编码与乱码问题.
在之前, 曾谈到过 JSP 与 HTML 间的关系, JSP 本质上是一个 HTML 的模板, 用于在服务端动态生成 HTML, 这点跟 servlet 是类似.
其实 JSP 本质就是 servlet, 一个 JSP 页面它会被编译成一个 java 文件, 实际上就是一个 servlet 类(或其子类, 在文章的后面会具体讨论这个问题).
深入介绍了 JSP 中的编码与乱码问题, 分析对比了 page 指令中的 pageEncoding 属性和 contentType 属性, 还对 JSP 与 servlet 及 HTML 的关系作了一个简要介绍.
在说完了网页中的编码与乱码(一, 二, 三, 四, 五 ), servlet 中的编码问题 后, 这次来探讨一下 JSP 中的编码与乱码问题.
在之前, 曾谈到过 JSP 与 HTML 间的关系, JSP 本质上是一个 HTML 的模板, 用于在服务端动态生成 HTML, 这点跟 servlet 是类似.
其实 JSP 本质就是 servlet, 一个 JSP 页面它会被编译成一个 java 文件, 实际上就是一个 servlet 类(或其子类, 在文章的后面会具体讨论这个问题).
我发现不少初学者不能很好理解 JSP 与 HTML 的关系,不少的视频教程也没有强调两者间的关系,或者只是说得很简略。
先来看一张图:
这里很好概括了两者的关系,简单讲就是 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,看看是哪个环节的生成结果有误。