(六)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执行速度几乎相同。

相关推荐
怕孤单的草丛20 分钟前
缓存管理面临的主要问题
java·数据库·缓存
F202269748634 分钟前
西门子 PLC 与 C# 通信
开发语言·c#
gugucoding1 小时前
31. 【C语言】堆栈与队列的实现
c语言·开发语言·数据结构·链表
万联WANFLOW2 小时前
多分支企业组网,IP 网段到底该怎么规划
开发语言·php
阿里嘎多学长2 小时前
2026-07-07 GitHub 热点项目精选
开发语言·程序员·github·代码托管
犀利豆3 小时前
AI in Harness(二)
java·人工智能·后端
cookies_s_s4 小时前
C++ 字符串动态创建对象 -- 工厂模式、自动注册、模板递归动态调用
服务器·开发语言·c++
沉静的小伙4 小时前
在微服务中使用领域事件
java·运维·微服务
程序员在囧途4 小时前
likeadmin-api API 算力超市怎么做供应商切换?统一鉴权、task_id 和 callback_url 才能稳交付
java·服务器·数据库·开放api·likeadmin-api·api算力超市
盐焗鹌鹑蛋5 小时前
【C++】继承
开发语言·c++