(一)什么是JSP

是JSPJSP全名是Java Server Pages,它是建立在Servlet规范之上的动态网页开发技术。在JSP文件中,HTML代码与Java代码共同存在,其中,HTML代码用来实现网页中静态内容的显示, Java 代码用来实现网页中动态内容的显示。为了与传统 HTML 有所区别,JSP 文件的扩展名为.jsp。

JSP技术所开发的Web应用程序是基于Java的,它可以用一种简捷而快速的方法从Java程序生成Web页面,其使用上具有如下几点特征。

• 跨平台:由于JSP是基于Java语言的,它可以使用Java API,所以它也是跨平台的,可以应用于不同的系统中,如Windows、Linux等。当从一个平台移植到另一个平台时,JSP和JavaBean的代码并不需要重新编译,这是因为Java的字节码是与平台无关的,这也应验了Java语言“一次编译,到处运行”的特点。

• 业务代码相分离:在使用 JSP 技术开发 Web 应用时,可以将界面的开发与应用程序的开发分离开。开发人员使用HTML来设计界面,使用JSP标签和脚本来动态生成页面上的内容。在服务器端,JSP引擎(或容器,本书中指Tomcat)负责解析JSP标签和脚本程序,生成所请求的内容,并将执行结果以HTML页面的形式返回到浏览器

• 组件重用:JSP中可以使用JavaBean编写业务组件,也就是使用一个JavaBean类封装业务处理代码或者作为一个数据存储模型,在 JSP 页面中,甚至在整个项目中,都可以重复使用这个JavaBean。同时,JavaBean也可以应用到其他Java应用程序中。

• 预编译预编译就是在用户第1次通过浏览器访问JSP页面时,服务器将对JSP页面代码进行编译,并且仅执行一次编译。编译好的代码将被保存,在用户下一次访问时,会直接执行编译好的代码。这样不仅节约了服务器的CPU资源,还大大地提升了客户端的访问速度。

JSP文件与传统的HTML文件几乎没有什么区别,唯一的区别是默认创建时,页面代码最上方多了一条page指令,并且该文件的后缀名是jsp,而不是html。HTML中的元素可以被JSP容器所解析。实际上,JSP只是在原有的HTML文件中加入了一些具有Java特点的代码,这些代码具有其独有的特点,称为JSP的语法元素。

(二)JSP运行原理

JSP的工作模式是请求/响应模式,客户端首先发出HTTP请求,JSP程序收到请求后进行处理并返回处理结果。在一个JSP文件第1次被请求时,JSP引擎(容器)把该JSP文件转换成为一个Servlet,而这个引擎本身也是一个Servlet。JSP的运行过程如图6所示。

jsp jquery使用 jsp js_Java

JSP的运行过程具体如下。

(1)客户端发出请求,请求访问JSP文件。

(2)JSP容器先将JSP文件转换成一个Java源文件(Java Servlet源程序),在转换过程中,如果发现JSP文件中存在任何语法错误,则中断转换过程,并向服务端和客户端返回出错信息。

(3)如果转换成功,则JSP容器将生成的Java源文件编译成相应的字节码文件*.class。该class文件就是一个Servlet,Servlet容器会像处理其他Servlet一样来处理它

(4)由Servlet容器加载转换后的Servlet类(.class文件)创建一个该Servlet(JSP页面的转换结果)实例,并执行Servlet的jspInit()方法(jsp的内部方法)。jspInit()方法在Servlet的整个生命周期中只会执行一次。

(5)执行jspService()方法来处理客户端的请求。对于每一个请求,JSP容器都会创建一个新的线程来处理它。如果多个客户端同时请求该JSP文件,则JSP容器也会创建多个线程,使得每一个客户端请求都对应一个线程。JSP运行过程中采用的这种多线程的执行方式可以极大地降低对系统资源的需求,提高系统的并发量并缩短响应时间。需要注意的是,由于第(4)步生成的Servlet是常驻内存的,所以响应速度非常快。

(6)如果 JSP 文件被修改了,则服务器将根据设置决定是否对该文件重新编译。如果需要重新编译,则使用重新编译后的结果取代内存中常驻的Servlet,并继续上述处理过程。

(7)虽然JSP效率很高,但在第1次调用的时候往往由于需要转换和编译,所以会产生一些轻微的延迟。此外,由于系统资源不足等原因,JSP容器可能会以某种不确定的方式将Servlet从内存中移除,发生这种情况时首先会调用 jspDestroy()方法,然后 Servlet 实例会被加入“垃圾收集”处理。

(8)当请求处理完成后,响应对象由JSP容器接收,并将HTML格式的响应信息发送回客户端。了解了JSP的运行原理后,完全可以利用其中的一些步骤来做一些工作,如:可以在jspInit()中进行一些初始化工作(建立数据库的连接、建立网络连接、从配置文件中获取一些参数等),可以在jspDestroy()中释放相应的资源等。

(三)HttpJspBase类

创建一个HelloWord.jsp,并查看编译后的源文件和.class文件(一个Servlet类)

(1)HttpJspBase类是HttpServlet的一个子类。其中:

定义了init()方法,该方法使用final进行修饰,并且其内部调用了jspInit()和_jspInit()方法。因此,在JSP页面所生成的Servlet不能覆盖这两个方法。但是,如果要在JSP页面完成Servlet的init()方法的功能,只能覆盖jspInit()和_jspInit()这两个方法中的任何一个。同样,如果要在JSP页面中完成Servlet的destroy()方法,则只能覆盖jspDestroy()和_jspDestroy()两个方法中的任何一个。

(2)在 service()方法中调用了_jspService()方法,也就是说在用户访问 JSP 文件时,会调用HttpJspBase类中的service()方法来响应用户的请求。根据Java的多态性的特征,在service()方法中,会调用HelloWorld_jsp类中实现_jspService()的方法,用来响应用户的请求。
 

(四)一点总结:

Servlet和Html

Servlet:

优点:动态资源,可编程

缺点:不适合设置html响应体需要大量response.getWrite()

Html:

优点:不用为输出html标签发愁

缺点:静态页面,不包含动态信息

JSP:

在原有Html中添加Java脚本构成

JSP和Servlet分工

Jsp作为请求发起页面和请求结束页面

Servlet一般用于请求中处理数据环节