JSP概述
JSP(Java Server Page)和Servlet是Java EE 规范的两个基本成员,他们是Java Web 开发的重点知识,也是Java EE的基础。JSP和Servlet本质是一样的,因此JSP最终必须编译成Servlet才能运行,或者说JSP只是生产Servlet的“草稿”文件。JSP比较简单,它的特点是在HTML页面中其嵌入Java代码,或者使用各种JSP标签,包括使用用户自定义标签,从而可以动态的提供页面内容。从目前的使用来看JSP被当做一种表现层技术来使用。随着Java EE技术的发展,又出现了FreeMarker、Velocity、Tapestry等表现层技术,虽然这些技术本可以取代JSP技术,但实际上JSP依然是应用最广泛的表现层技术。
JSP基本原理
JSP的本质是Servlet,当用户向指定的Servlet发送请求时,Servlet利用输出流动态的生成HTML页面,包括每一个静态的HTML标签和JSP标签中需要出现的内容。由于在Servlet中包含大量的HTML标签、大量的静态文本及格式等,导致Servlet的开发效率极为低下,所有的表现逻辑,包括布局,色彩及图像等都必须耦合在Java代码中,让人不胜其烦。
JSP的出现弥补了Servlet的这部分的不足,JSP通过在标准的HTML页面嵌入Java代码,其静态部分无需Java程序控制,只需要从数据库读取或需要动态生成的内容才使用Java脚本控制。
因此JSP也就被划分为两部分
- 静态部分:标准的HTML标签。静态的页面内容,这些内容与静态的HTML相同。
- 动态部分:受Java程序控制的内容,这些内容由Java程序来动态生成。
从表面上看,JSP已经不是Java类了,似乎已经脱离了Java面向对象的基本特征了,但是JSP的本质是Servlet,而Servlet又是一种特殊的Java类,每个JSP界面就是一个Servlet实例-----JSP页面由Servlet容器(Tomcat)编译成Servlet,Servlet再负责响应用户请求。例如一个test.jsp的文件经过Tomcat生成会在work路径下找到对应的test_jsp.java和 test_jsp.class两个文件。
这里需要知道一点Servlet容器的主要任务是管理Servlet的生命周期的,Web服务器用来管理和部署Web应用,一个典型的产品就是Tomcat,Tomcat是Web服务器不假,但同时也是Servlet容器。
test.java文件中包含三个方法:
- init():初始化JSP/Servlet的方法。
- destroy():销毁JSP/Servlet之前的方法。
- service():对用户请求生成响应的方法。
通过上面我们可以知道每个JSP文件必须通过Servlet容器(Tomcat)生成对应的Servlet才能执行,每个JSP的第一个访问者速度很慢的原因是需要等待JSP编译成Servlet。
JSP注释
JSP注释只有一种,HTML注释也只有一种但是对比而言JSP注释不会在最终生成的HTML文件的源码中显示。
JSP注释格式:<%--JSP注释的内容--%>
HTML注释格式:<!—HTML注释的内容-->
JSP声明
JSP声明用于声明变量和方法。在JSP声明中声明方法看起来很特别,似乎不需要定义类就可以直接定义方法,方法似乎可以脱离类独立存在。实际上,JSP声明会转换成对应的Servlet的成员变量和成员方法,因此JSP依然符合Java语法。
JSP声明的语法格式:<%!声明部分%>
输出JSP表达式
JSP提供了一种输出表达式值的简单方法,输出表达式值的语法格式如下:
<%=表达式%>
例如<%=”hello!”%>也可为<%out.println(“hello!”)%>后者为JSP脚本。
JSP脚本
个人觉得JSP脚本和输出JSP表达式使用的频率要比JSP声明高的多,JSP脚本里可以包含任何可执行的Java代码。通常所有的可执行性Java代码都可以通过Jsp脚本嵌入HTML页面。值得注意的是在JSP脚本中声明的变量在Servlet中是局部变量,但是不能使用private、public等访问控制符来修饰,更不可以使用static修饰!