1.2 静态代码和动态代码
静态代码与动态代码的界定是相对于浏览器而言的。浏览器能够直接解析的代码称为静态代码,反之,则称为动态代码。典型的静态代码有HTML代码、CSS代码、JavaScript代码,以及图片(实际上是二进制数据)。
1.2.1 HTML和静态代码
HTML是Hypertext Marked Language的缩写,译作超文本标记语言。HTML 1.0诞生于1990年,最新版本是HTML5,于2008年发布。
HTML的首字母H,代表Hyper,意思是“above”“beyond”,译作超越。Hypertext,译作超文本,该词诞生于1965年,直到1991年才被引入互联网。超文本突破了普通文本的限制,允许浏览器用户通过单击超链接等方式访问互联网上的资源文件。
Marked Language译作标记语言,标记语言的典型特征是使用“开始标签”和“结束标签”作为成对标签(有时称为标记)定义页面的布局和页面内的元素。
HTML是一种能够编写HTML页面的语言。由于浏览器可以直接解析HTML,因此使用HTML编写的代码是静态代码。下面的代码片段只包含HTML代码,因此该代码片段是一段静态代码,它定义了页面的标题和页面的一个段落。
<!doctype html> <html> <head> <title>Java Web开发</title> </head> <body> <p>这是HTML的一个段落。</p> </body> </html>
第一行定义了HTML文件包含的内容的类型。“<!doctype html>”表示该页面用HTML5编写。HTML页面通常包含<html>、<head>和<body>等标签。HTML页面的标题、元数据和引用文件的链接等,位于<head>和</head>标签之间。HTML页面的实际内容位于<body>和</body>标签之间。
1.2.2 服务器端脚本语言和动态代码
使用服务器端脚本语言编写的代码被称为动态代码。之所以被称为动态代码,是因为服务器端脚本语言不能直接被浏览器解析。常见的服务器端脚本语言有PHP、.NET、Python,还有本书使用的Java(这里提到的Java主要指Servlet代码和JSP代码)。
下面的代码片段是一个JSP代码片段,该代码片段不能直接被浏览器解析,因此该代码片段是一段动态代码。该代码片段的功能将在本章实践任务环节详细讲解。
<% System.out.println("你好,Tomcat控制台"); String realPath = request.getServletContext().getRealPath(""); response.getWriter().print("Web项目的根目录或部署后的绝对物理路径是" + realPath); %>
再次强调,静态和动态是相对于浏览器而言的。浏览器可以直接渲染静态代码,例如浏览器可以识别HTML代码“<br/>”,并将“<br/>”解析为一个换行符。但浏览器不能直接渲染动态代码,动态代码必须被第三方“翻译成”静态代码后,浏览器才能渲染它。
1.2.3 Servlet容器和动态代码之间的关系
虽然Apache、Nginx和Tomcat都是Web服务器软件,但是它们之间存在明显的区别。
Apache和Nginx只能处理静态代码。对于Servlet代码或者JSP代码,Apache和Nginx“无能为力”。Apache和Nginx必须委托第三方,由第三方将Servlet代码或者JSP代码“翻译成”静态代码,这里提到的第三方是Servlet容器。简单地说,Servlet容器是一个能够将Servlet代码或者JSP代码“翻译成”静态代码的软件。
Apache和Nginx并没有提供Servlet容器,但Tomcat提供了Servlet容器,这就是Tomcat与Apache、Nginx最大的区别。
Tomcat与Apache、Nginx的相同之处在于,它们都可以作为Web服务器接收HTTP请求、返回HTTP响应。因此,只需安装Tomcat(无须Apache和Nginx),就可以成功地部署Java Web开发环境(学习环境),只不过该环境仅适用于学习、上机实验等场景。生产环境下,还需要将Apache、Nginx和Tomcat搭配使用,才能获得更好的Web服务器性能。
1.2.4 Web服务器上资源文件的分类
无论是静态代码还是动态代码,最终都需要写在资源文件中。为便于描述,本书将Web服务器上的资源文件分为两类:静态资源文件和动态资源文件。
如果一个资源文件仅包含静态代码,该文件就是一个静态资源文件;只要资源文件中包含Servlet代码或者JSP代码(哪怕只有一行),那么该文件就是一个动态资源文件。
Web服务器处理静态资源文件和动态资源文件的方式并不相同。如何让Web服务器辨别资源文件是静态资源文件,还是动态资源文件呢?最简单的做法是通过扩展名进行辨别,为不同的资源文件分配不同的扩展名,Web服务器就可以分辨出静态资源文件和动态资源文件。
例如,在Java Web开发中,约定扩展名是.jsp或者.java的资源文件是动态资源文件,其他扩展名的资源文件是静态资源文件。Web服务器运行扩展名是.jsp或者.java的资源文件时,会自动委托第三方,将动态资源文件中的动态代码“翻译成”静态代码,最后由Web服务器“拼接出新的静态代码”,再返回给浏览器。
Web服务器中,常见的静态资源文件扩展名有.html、.htm、.css、.js、.jpg等,文件名包含这些扩展名的文件都是静态资源文件,常见的静态资源文件和动态资源文件如图1-1所示。读者要切记:扩展名是.css的CSS文件,或者扩展名是.js的JavaScript文件,都是静态资源文件;静态资源文件是不能包含Servlet代码或者JSP代码的,除非将CSS文件、JavaScript文件的扩展名修改为.jsp。
图1-1 静态资源文件和动态资源文件
说明1:通常情况下,一台Web服务器上可以同时部署多个Web项目;一个Web项目包含了多个资源文件。Web开发人员工作的本质就是开发Web项目所需的各种静态资源文件和动态资源文件,并设法将它们整合起来形成Web项目,然后将Web项目部署在Web服务器上测试、运行。
说明2:Web设计人员和Web开发人员。从技术上讲,Web设计人员通常使用HTML、CSS设计网站页面,更侧重于页面的美工;Web开发人员通常使用服务器端脚本语言编写动态页面,也会参与Web设计。此外,Web开发人员也可能帮助维护动态网站使用的数据库。