一. 什么是JSP?
JSP,即 Java Server Pages,Java 服务器页面,即运行在服务器端的页面。
它是由 Sun 公司倡导,许多国际性大公司参与,一起建立的一种动态网页技术。
JSP 技术是在传统的静态网页 HTML文件中插入 Java 代码片断和 JSP 标签后形成的一种文件,其后缀名为.jsp。
使用 JSP 开发的 Web应用是跨平台的,既能在 Linux 上运行,也能在其他操作系统上运行。
二.怎么理解JSP 本质就是一个Servlet程序?
1.新建立一个 动态项目,在WebContent目录下 新建一个 index.jsp文件,并写上 "Hello World Jsp !!!"
2. I:\SourcePackages\subject_jsp\.metadata\.plugins\org.eclipse.wst.server.core
访问 jsp页面:
3.此时再观察 I:\SourcePackages\subject_jsp\.metadata\.plugins\org.eclipse.wst.server.core
4. I:\SourcePackages\subject_jsp\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\work\Catalina\localhost\01-jsp-primary\org\apache\jsp
源码文件 index_jsp.java 就是由刚才的 Web 项目中的 Index.jsp 文件转变成的 Java 文件。
而 index_jsp.class 文件为 index_jsp.java 文件编译后的字节码文件
45 打开 index_jsp.java 文件 (查看关键信息)
打开 Tomcat 的源码目录中的 java 子目录,在其中查看 HttpJspBase 的源码,发现其继承自 HttpServlet。
index_jsp.java 继承了 HttpJspBase,而HttpJspBase又是一个Servlet。
因此,index_jsp.java 就是一个Servlet!!!
总结:
也就是说,JSP 文件的本质是 Servlet。
只不过,JSP 与 Servlet 不同的是,JSP 是专门用于进行数据展示的 Servlet,其有特殊的写法。
而普通的 Servlet 是用于完成业务逻辑处理的。
由于 Servlet 是运行在单例多线程环境下的,所以 JSP 同样也是运行在单例多线程环境下的
三、JSP 规范
将 JSP 页面翻译为 Servlet 的过程,是由 Tomcat 完成。
在 Tomcat 中内置了一个 JSP 翻译引擎,当第一次访问该 JSP 页面时,翻译引擎会将 JSP 页面翻译为 Servlet 的.java 文件,再将其编译为.class 文件进行运行。
SUN 公司制定的 JavaEE 规范中包含两个很重要的子规范:Servlet 规范,及 JSP 规范。
其中JSP规范中就包含了如何将JSP页面翻译为Servlet。例如,JSP页面中的HTML、CSS、JavaScript,及普通文本部分,均会被翻译到 out. write ()中。
Tomcat 中的 JSP 翻译引擎,就遵循了这个 JSP 规范。
四、 JSP注释
在 JSP 页面中使用注释,可以将要注释的内容使用<%-- --%>括起来。
当然,在 JSP 页面中也可以使用 HTML 的注释。 但它们的使用效果是不同的。
(1)HTML 注释会被 JSP 翻译引擎翻译到 Servlet 的 out.write()中;而 JSP 注释则会被 JSP 翻译引擎忽略,在 Servlet 中是看不到的。
(2)在客户端浏览器查看源码时,HTML 注释是可以查看到的;但 JSP 注释在客户端是查看不到的。
重新访问jsp后,再打开
使用HttpWatch查看,在响应体中:可以看见HTML的注释
原因: jsp文件中的HTML注释 会被jsp翻译引擎 翻译成到 _jspService方法中的 out.write()中,也就是 HTML被放到了标准输出流里面。发送给了客户端浏览器。客户端浏览器会截取到它。
而jsp注释 会被jsp翻译引擎忽略掉。
使用原则:重要的注释写jsp注释,不让客户端看见。
五、 JSP的代码块 (java代码片段 之一)
JSP 的 Java 代码块也称为 JSP 小脚本,是以<% %>括起来的部分,其中可以编写 Java代码。
编写在 Java 代码块中的代码,会被 JSP 翻译引擎将其置入到 Servlet 的_jspService()方法中作为方法中的 Java 语句出现。所以,其中存放的必须是以分号结尾的 Java 语句。
需要注意的是,JSP 代码块可以放置在 JSP 页面的任意位置,可以放置任意数量。但它们都会被按照顺序放置到 Servlet 的_jspService()方法中。
也就是说,其执行顺序是与其在 JSP页面中的出现顺序是一致的。
例如,
被翻译到 Servlet 的_jspService()方法中为:
由于 JSP 小脚本是被翻译到了 Servlet 的_jspService()方法中,所以 JSP 小脚本中是不能
出现如下内容的:
(1)声明的变量是不能添加权限访问控制符的. (方法中声明的变量不能使用权限控制符)
(2)不能定义方法. (Java中不允许方法的嵌套定义)
(3)不能定义静态语句块 (静态语句块定义在类中,不能定义在方法中。)
六、 JSP的声明语句块 (java代码片段 之二)
在 JSP 页面中使用<%! %>括起来的部分,称为声明语句块。
声明语句块中的内容,将被 JSP 引擎翻译到 Servlet 的类体中,没有包含到哪个方法体中。
这样的话,在 JSP 的声明语句块就可声明实例变量、实例方法、静态方法、静态代码块等内容。
并且,这些内容均可被 JSP 的 Java 代码块中代码访问。因为它们原本就是一个Servlet 类中的代码。
不过,还是不建议在 JSP的声明语句块中声明实例变量。因为 JSP 是运行在单例多线程环境下的,实例变量将会引起线程安全问题。
需要注意的是,在 JSP 的声明语句块中,是不能编写普通的 Java 语句的。否则的话,这些语句将会直接出现在 Servlet 的类体中。
声明语句块也可以定义在 JSP 页面的任意位置,且可以定义任意多个。
被翻译到 Servlet 的index_jsp类中
结果:
在 JSP 的 Java 代码块与声明语句块中,均可使用 Java 的单行注释与多行注释。该注释将会出现在 Servlet 中的相应位置。
七、 JSP 的表达式块 (java代码片段 之三)
在 JSP 页面中使用<%= %>括起来的部分,称为表达式块。其可在 JSP 页面中输出变量、常量,及它们组成的各种表达式的值。
注意,是表达式,而不是语句,是没有分号的。该表达式将被 JSP 引擎翻译到_jspService()方法的 out.write()方法中输出。
例如,
翻译之后:
运行: