(六)Servlet教程——JSP与Servlet的关系

JSP与Servlet的关系

JSP(Java Server Pages)是继Servlet后Sun公司推出的新技术。JSP技术在传统的HTML文件中插入Java程序段和JSP标记,从而形成JSP文件(*.jsp)。用JSP开发的Web应用是跨平台的,既能在Windows系统下运行,也能在其他操作系统下运行。

JSP和Servlet都是动态的Web技术,JSP是以Servlet为基础开发的,它被翻译成Servlet再执行,所以在底层运行机制上和Servlet有共同之处。

Servlet与JSP的区别如下:

  1. 编程方式不同

JSP是为了解决Servlet编程相对困难而开发的技术,因此JSP在程序的编写方面比Servlet要容易,Servlet严格遵循Java语言的编程标准,而JSP则遵循脚本语言的标准。JSP是由Servlet技术发展起来的,具备Servlet的功能,但是将生成的内容与显示分离比Servlet优化,更简单易用。

  1. 编译执行方式不同

JSP并不需要另外进行编译,JSP Container会自动完成这一工作,而Servlet在每次修改代码之后都需要编译完才能执行。

  1. 运行速度不同

由于JSP Container将JSP编译成Servlet需要一些时间,故JSP的运行速度比Servlet要慢一些。不过,如果JSP文件能毫无变化地重复使用,它在第一次以后的调用中运行速度就会和Servlet一样了,这是因为JSP Container接到请求以后会确认传递过来的JSP是否有改动,如果没有改动的话,将直接调用JSP编译过的Servlet类,并提供给客户端解释执行,如果JSP文件有所改变,JSP Container将重新将它编译成Servlet,然后再提交给客户端。

  1. 应用范围不同

JSP可以同时负责Web应用的显示任务和业务逻辑,Servlet主要用于处理后台应用。下面的JSP代码实现了和Servlet相同的显示效果。但在实现功能上JSP的代码比Servlet简洁清晰。

<%@ page import="java.util.*" pageEncoding="ISO-8859-1"%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

<html>

<head>

<title>Hello Servlet</title>

</head>

<body>

<%out.print("Hello Servlet");%>

</body>

</html>

JSP运行机制

  1. Web容器(Tomcat等)接收到用户的第一个JSP页面请求时,JSP引擎将这个JSP页面转换为Java源代码(Servlet类),在转换的过程中,如果发现JSP文件有任何的语法错误,转换过程将终止,并向服务器和客户端输出错误信息。

  2. 然后JSP引擎用javac编译Java源代码生成class文件。

  3. 接着Web容器加载class文件,并从此创建一个新的Servlet对象进行实例化。

  4. 然后jspService()方法被调用来处理客户端的请求。

  5. 容器创建一个响应文档,将文档发送给用户,若干时间后,用户再次访问这个JSP时,容器会再次创建一个响应文档,直到容器卸载了这个class文件。

  6. 当用户卸载了这个class文件后,再次访问时,JSP引擎并不重新转换和编译这个JSP文件,而是对它进行重新初始化,并创建一个响应文档,返回给客户端。

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

对每一个请求,Web容器创建一个新的线程来处理该请求。如果有多个客户端同时请求该JSP文件,则JSP引擎会创建多个线程。当第一次加载JSP页面时,因为要将JSP文件转换为Servlet类,所以响应速度较慢。当再次请求时,JSP容器就会直接执行第一次请求时产生的Servlet,而不必再重新转换JSP文件,所以其执行速度和Servlet执行速度几乎相同。

相关推荐
这孩子叫逆6 分钟前
Spring Boot项目的创建与使用
java·spring boot·后端
星星法术嗲人9 分钟前
【Java】—— 集合框架:Collections工具类的使用
java·开发语言
黑不溜秋的23 分钟前
C++ 语言特性29 - 协程介绍
开发语言·c++
一丝晨光28 分钟前
C++、Ruby和JavaScript
java·开发语言·javascript·c++·python·c·ruby
天上掉下来个程小白30 分钟前
Stream流的中间方法
java·开发语言·windows
xujinwei_gingko41 分钟前
JAVA基础面试题汇总(持续更新)
java·开发语言
liuyang-neu43 分钟前
力扣 简单 110.平衡二叉树
java·算法·leetcode·深度优先
sp_wxf1 小时前
Lambda表达式
开发语言·python
一丝晨光1 小时前
Java、PHP、ASP、JSP、Kotlin、.NET、Go
java·kotlin·go·php·.net·jsp·asp
罗曼蒂克在消亡1 小时前
2.3MyBatis——插件机制
java·mybatis·源码学习