什么是JSP?
JSP全名为Java Server Pages,用一种简单易懂的等式表示为:HTML+Java=JSP。它是由SUN公司在1996年6月发布的用于开发动态Web应用的技术.JSP是基于Java Servlet的Web开发技术。其根本是一个简化的Servlet设计,它是在传统的网页HTML(标准通用标记语言的子集)文件(.htm,.html)中插入Java程序段(Scriptlet)和JSP标记(tag),从而形成JSP文件,后缀名为(*.jsp)。 用JSP开发的Web应用是跨平台的,既能在Linux下运行,也能在其他操作系统上运行。 使用Java编程语言编写类XML的tags和scriptlets,来封装产生动态网页的处理逻辑。网页还能通过tags和scriptlets访问存在于服务端的资源的应用逻辑。将网页逻辑与网页设计和显示分离,支持可重用的基于组件的设计,使基于Web的应用程序的开发变得迅速和容易。
JSP的工作原理
其实JSP在第一次被访问的时候会被编译为HttpJspPage类(该类是HttpServlet的一个子类)
编译过程是这样子的:浏览器第一次请求1.jsp时,Tomcat会将1.jsp转化成1_jsp.java这么一个类,并将该文件编译成class文件。编译完毕后再运行class文件来响应浏览器的请求。
以后访问1.jsp就不再重新编译jsp文件了,直接调用class文件来响应浏览器。当然了,如果Tomcat检测到JSP页面改动了的话,会重新编译的。
- JSP页面由HTML代码和嵌入其中的Java代码所组成。服务器在页面被客户端请求以后对这些Java代码进行处理,然后将生成的HTML页面返回给客户端的浏览器。Java Servlet 是JSP的技术基础,而且大型的Web应用程序的开发需要Java Servlet和JSP配合才能完成。JSP具备了Java技术的简单易用,完全的面向对象,具有平台无关性且安全可靠,主要面向因特网的所有特点。
- JSP页面的代码服务器是怎么执行的?再看回1_jsp.java文件,java代码就直接在类中的service()中。
-
Web服务器在遇到访问JSP网页的请求时,首先执行其中的程序段,然后将执行结果连同JSP文件中的HTML代码一起返回给客户。插入的Java程序段可以操作数据库、重新定向网页等,以实现建立动态网页所需要的功能。JSP与Java Servlet一样,是在服务器端执行的,通常返回该客户端的就是一个HTML文本,因此客户端只要有浏览器就能浏览。
- JSP比Servlet更方便更简单的一个重要原因就是:内置了9个对象!内置对象有:out、session、response、request、config、page、application、pageContext、exception
JSP生命周期
JSP也是Servlet,运行时只有一个实例,JSP初始化和销毁时也会调用Servlet的init()和destroy()方法。另外,JSP还有自己初始化和销毁的方法
JSP的语法
JSP代码可以分为两部分:
模板数据:就是HTML代码
元素:JSP页面中的java代码、JSP指令、JSP标签
JSP脚本
JSP的脚本就是JSP页面中的java代码,也叫做scriptlet。JSP的脚本必须使用<%%>括起来,不然会被当成是模板数据的!
JSP脚本有三种方式
<%%>【定义局部变量,编写语句】---------------<jsp:scriptlet>行为代替
<%!%>【定义类或方法,但是没人这样用!】
<%=%>(也称之为表达式输出)【输出各种类型的变量,int、double、String、Object等】
JSP的技术特点
1. 能够在任何web或应用程序服务器上运行.
2. 将程序逻辑与页面显示分开.
3. 采用标签简化开发.
4. 组件可重用.
JSP运行机制
首相要明确的是:当一个JSP文件第一次被请求时,JSP容器会先把JSP文件转换成一个Servlet。
JSP的运行过程如下:
1. JSP容器现将该JSP文件转化成一个Java源文件(Java Servlet源程序),在转换过程中如果发现JSP文件中存在任何语法错误,则中断转换过程,并向服务端和客户端返回错误信息。
2. 如果转换成功,则JSP容器使用javac将生成的Java源文件编译成相应的字节码文件*.class 。 该*.class就是一个Servlet,Servlet容器就会想处理其它Servlet一样来处理它。
3. 由Servlet容器加载转换后的Servlet类(.class文件),创建一个该Servlet的实例,并执行Servlet的jspInit()方法,jspInit()方法在Servlet的整个生命周期中只会执行一次。
4. 执行_jspService方法来处理客户端请求。对每一个请求,JSP容器都会创建一个新的线程来处理它。如果有多个客户端同时请求该JSP文件,则JSP容器也会创建多个线程,使得每个客户端请求都有一个线程。JSP运行过程中采用的这种多线程的执行方式可以极大的降低对系统资源的需求,提高系统的并发量和相应时间。要注意的是(3)不中生成的Servlet是常驻内存的,所以响应速度也是非常快的。
5. 如果JSP文件被修改了,则服务器将根据设置决定是否对该问价进行重新编译,如果需要重新编译,则使用重新编译后的结果来取代内存中常驻的Servlet,并继续上诉的处理过程。
6. 虽然JSP效率很高,但是在第一次调用时往往由于需要转换和编译过程而产生一些轻微的延迟。此外,由于系统资源不足等原因,JSP容器会以某种不确定的方式将Servlet从内存中移除。当这种发生时会首先调用jspDestory()方法。
7. 接着Servlet实例便被加入“”垃圾收集“”处理。
8. 当请求处理完成后,响应对象由JSP容器接收,并将HTML格式的响应信息发送回客户端。
JSP技术的弱势
(1)与ASP一样,Java的一些优势正是它致命的问题所在。正是由于为了跨平台的功能,为了极度的伸缩能力,所以极大的增加了产品的复杂性。
(2) Java的运行速度是用class常驻内存来完成的,所以它在一些情况下所使用的内存比起用户数量来说确实是“最低性能价格比”了。从另一方面,它还需要硬盘空间来储存一系列的.java文件和.class文件,以及对应的版本文件。
(3)在调试JSP代码时,如果程序出错,JSP服务器会返回出错信息,并在浏览器中显示。这时,由于JSP是先被转换成Servlet后再运行的,所以,浏览器中所显示的代码出错的行数并不是JSP源代码的行数,而是指转换后的Servlet程序代码的行数。这给调试代码带来一定困难。所以,在排除错误时,可以采取分段排除的方法(在可能出错的代码前后输出一些字符串,用字符串是否被输出来确定代码段从哪里开始出错),逐步缩小出错代码段的范围,最终确定错误代码的位置。