JSP 中的字符集编码与乱码问题

深入介绍了 JSP 中的编码与乱码问题, 分析对比了 page 指令中的 pageEncoding 属性和 contentType 属性, 还对 JSP 与 servlet 及 HTML 的关系作了一个简要介绍.

在说完了网页中的编码与乱码(, , , , ), servlet 中的编码问题 后, 这次来探讨一下 JSP 中的编码与乱码问题.

在之前, 曾谈到过 JSP 与 HTML 间的关系, JSP 本质上是一个 HTML 的模板, 用于在服务端动态生成 HTML, 这点跟 servlet 是类似.

其实 JSP 本质就是 servlet, 一个 JSP 页面它会被编译成一个 java 文件, 实际上就是一个 servlet 类(或其子类, 在文章的后面会具体讨论这个问题).

继续阅读

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,看看是哪个环节的生成结果有误。