jsp转换成servlet的详解

server/2024/9/24 10:20:39/

此知识点实在手写tomcat的时候衍生出来的东西,想要真正搞懂这个东西,就有此博客。

jsp与servlet 的关系:

首先jsp(javaServer Pages)与servlet都是用在JavaEE环境中创建动态web内容的技术,他们有着紧密的关系和不同的用途。

1.servlet

  a. 是一个Java类,用于处理http请求并生成响应内容,当然开发者可以通过Java代码完全控制响应的内容。

  b.通常处理复杂的业务逻辑控制流和处理表单数据。

2.JSP

a.是一种基于HTML的模板技术。但是在他的里面可以编写Java代码(用<% %>括起来)这样也是更加容易创建动态的web的页面。

b.JSP本质上是Servlet 的简化形式,他的目的是是页面开发更加直观高效。

关系:jsp在第一次被请求的时候,会被转化成Servlet,然后编译执行,在某种意义上说,jsp是servlet 的高级抽象,专注于视图层,而Servlet猪猪与控制和逻辑处理层。

在JavaEE中jsp与servlet的跳转的流程:

工作流程:

 1.请求URL:客户端浏览器发出/hello请求。
2.Servlet映射:根据web.xml中的<servlet-mapping>配置,将该请求映射到helloJsp Servlet。
3.处理请求:helloJsp Servlet将请求转发到指定的/hello.jsp文件。
4.生成响应:JSP文件被编译为Servlet并执行,生成动态的HTML响应返回给客户端。
  这种配置方式通过web.xml文件,可以灵活地管理和组织Web应用中的JSP页面和Servlet,有助于实现清晰的URL映射和组件配置。

除了配置xml文件之外,还有注解:@WebServlet ("/s1")

jsp与servlet转换的代码事例:

   示例JSP文件 (hello.jsp)

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head><title>Hello JSP</title>
</head>
<body><h1>Hello, JSP World!</h1><%String user = request.getParameter("user");if (user == null) {user = "Guest";}out.println("Hello, " + user + "!");%>
</body>
</html>

   转换后的Servlet (hello_jsp.java)

java">package org.apache.jsp;import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.jsp.*;public final class hello_jsp extends org.apache.jasper.runtime.HttpJspBaseimplements org.apache.jasper.runtime.JspSourceDependent {private static final JspFactory _jspxFactory = JspFactory.getDefaultFactory();private static java.util.List<String> _jspx_dependants;private org.glassfish.jsp.api.ResourceInjector _jspx_resourceInjector;public java.util.List<String> getDependants() {return _jspx_dependants;}public void _jspInit() {}public void _jspDestroy() {}public void _jspService(HttpServletRequest request, HttpServletResponse response)throws java.io.IOException, ServletException {PageContext pageContext = null;HttpSession session = null;ServletContext application = null;ServletConfig config = null;JspWriter out = null;Object page = this;JspWriter _jspx_out = null;PageContext _jspx_page_context = null;try {response.setContentType("text/html; charset=UTF-8");pageContext = _jspxFactory.getPageContext(this, request, response,null, true, 8192, true);_jspx_page_context = pageContext;application = pageContext.getServletContext();config = pageContext.getServletConfig();session = pageContext.getSession();out = pageContext.getOut();_jspx_out = out;_jspx_resourceInjector = (org.glassfish.jsp.api.ResourceInjector) application.getAttribute("com.sun.appserv.jsp.resource.injector");out.write("\n");out.write("<!DOCTYPE html>\n");out.write("<html>\n");out.write("<head>\n");out.write("    <title>Hello JSP</title>\n");out.write("</head>\n");out.write("<body>\n");out.write("    <h1>Hello, JSP World!</h1>\n");out.write("    ");String user = request.getParameter("user");if (user == null) {user = "Guest";}out.println("Hello, " + user + "!");out.write("\n");out.write("</body>\n");out.write("</html>\n");} catch (Throwable t) {if (!(t instanceof SkipPageException)){out = _jspx_out;if (out != null && out.getBufferSize() != 0)out.clearBuffer();if (_jspx_page_context != null) _jspx_page_context.handlePageException(t);else throw new ServletException(t);}} finally {_jspxFactory.releasePageContext(_jspx_page_context);}}
}

解释

 Servlet:通过纯Java代码来实现业务逻辑和响应内容的生成。它适合处理复杂的逻辑和控制层操作。
JSP:通过嵌入Java代码到HTML中,更方便地创建动态Web页面。它适合用于视图层,呈现数据。
  通过JSP和Servlet的配合,开发者可以实现清晰的MVC(Model-View-Controller)模式,使得Web应用的开发更加结构化和可维护。

在Apache Tomcat中:

将JSP页面转换为Servlet是通过Jasper引擎完成的。Jasper是Tomcat的JSP编译器,它将JSP文件编译成Java源文件(Servlet),然后再编译成字节码,最终运行在Tomcat中。

结合使用:

  在实际应用中,JSP和Servlet通常结合使用。Servlet负责处理请求和业务逻辑,JSP负责生成动态网页内容。Servlet可以将处理后的数据传递给JSP,JSP负责将数据展示给用户。


转换过程:

Tomcat在运行时会将JSP页面转换为Servlet进行处理。这意味着每个JSP页面实际上都是一个Servlet,Tomcat在第一次请求时会自动进行转换并编译。转换后的Servlet与普通Servlet一样运行,生成动态内容。


http://www.ppmy.cn/server/62244.html

相关文章

【算法】单调队列

一、什么是单调队列 单调队列是一种数据结构&#xff0c;其特点是队列中的元素始终保持单调递增或递减&#xff0c;主要用于维护队列中的最小值或最大值。 不同于普通队列只能从队头出队、队尾入队&#xff0c;单调队列为了维护其特征&#xff0c;还允许从队尾出队 不管怎么…

Android 14 开机时间优化措施

Android 14 开机时间优化措施 在Android 14中&#xff0c;优化开机时间涉及多个层级的性能优化&#xff0c;从系统启动到应用加载的每一个阶段都可能影响最终的开机时间。以下是详细的措施和策略&#xff0c;可以帮助我们在Android 14设备上进行开机时间优化。 1. 优化引导过…

Python打开Excel文档并读取数据

Python 版本 目前 Python 3 版本为主流版本&#xff0c;这里测试的版本是&#xff1a;Python 3.10.5。 常用库说明 Python 操作 Excel 的常用库有&#xff1a;xlrd、xlwt、xlutils、openpyxl、pandas。这里主要说明下 Excel 文档 .xls 格式和 .xlsx 格式的文档打开和读取。 …

JavaSE 面向对象程序设计进阶 IO 压缩流 解压缩流

目录 解压缩流 压缩流 解压缩流 压缩包 压缩包里面的每一个文件在java中都是一个ZipEntry对象 把每一个ZipEntry按照层级拷贝到另一个文件夹当中 import java.io.*; import java.util.Date; import java.util.zip.ZipEntry; import java.util.zip.ZipInputStream;public cl…

ArcGIS Pro SDK (八)地理数据库 8 拓扑

ArcGIS Pro SDK &#xff08;八&#xff09;地理数据库 8 拓扑 文章目录 ArcGIS Pro SDK &#xff08;八&#xff09;地理数据库 8 拓扑1 开放拓扑和进程定义2 获取拓扑规则3 验证拓扑4 获取拓扑错误5 标记和不标记为错误6 探索拓扑图7 找到最近的元素 环境&#xff1a;Visual …

Spring Boot 3.3 【二】Spring Boot自动配置机制深度解析

简单动作&#xff0c;深刻联结。在这技术海洋&#xff0c;我备好舟&#xff0c;等你扬帆。启航吧&#xff01; &#x1f31f;点击【关注】&#xff0c;解锁定期的技术惊喜&#xff0c;让灵感与知识的源泉不断涌动。 &#x1f44d;一个【点赞】&#xff0c;如同心照不宣的默契&a…

PostgreSQL安装/卸载(CentOS、Windows)

说明&#xff1a;PostgreSQL与MySQL一样&#xff0c;是一款开源免费的数据库技术&#xff0c;官方口号&#xff1a;The World’s Most Advanced Open Source Relational Database.&#xff08;世界上最先进的开源关系数据库&#xff09;&#xff0c;本文介绍如何在Windows、Cen…

打造你的智能家居指挥中心:基于STM32的多协议(zigbee、http)网关(附代码示例)

1. 项目概述 随着物联网技术的蓬勃发展&#xff0c;智能家居正逐步融入人们的日常生活。然而&#xff0c;市面上琳琅满目的智能家居设备通常采用不同的通信协议&#xff0c;导致不同品牌设备之间难以实现互联互通。为了解决这一难题&#xff0c;本文设计了一种基于STM32的多协…