一、引言

一句话:jsp本质就是一个servlet。

程序员在开发过程中,发现Servlet做界面非常不方便,所以产生了jsp技术。JSP其实是对Servlet进行了包装而已。 
jsp + Java类(service、javabean)+ servlet,就会构成mvc的开发模式,mvc模式是目前软件公司中相当通用的开发模式。

二、JSP

JSP工作原理:

当客户端浏览器向服务器请求一个 JSP 页面时,服务器收到该请求后,首先检查所请求的这个JSP 文件内容 ( 代码 ) 是否已经被更新,或者是否是 JSP 文件创建后的第一次被访问:

1. 如果是,那么,这个 JSP 文件就会在服务器端的 JSP 引擎作用下转化为一个 Servlet 类的 Java 源代码文件,这个 Servlet 类会在 Java 编译器的作用下被编译成一个字节码文件,并装载到 jvm 解释执行。剩下的就等同于 Servlet 的处理过程了。

2. 如果被请求的 JSP 文件内容 ( 代码 ) 没有被修改,那么它的处理过程也等同于一个 Servlet 的处理过程。即直接由服务器检索出与之对应的 Servlet 实例来处理。

需要注意的是,JSP 文件不是在服务器启动的时候转换成 Servlet 类的。而是在被客户端访问的时候才可能发生转换的 ( 如 JSP 文件内容没有被更新等,就不再发生 Servlet 转换 )。就 Tomcat 而言,打开目录 %Tomcat%/work/%您的工程文件目录%,然后会看到里面有 3个子目录:org/apache/jsp,若没有这 3 个目录,说明项目的 JSP 文件还没有被访问过,打开进到 jsp 目录下,会看到一些 *_jsp.java 和 *_jsp.class 文件,这就是 JSP 文件被转换成Servlet 类的源文件和字节码文件了。

jsp文件

<%@page import="java.util.Date"%>
<%@page language="java" pageEncoding="UTF-8"%>
<!-- lanuage表示嵌在JSP的的片段语言是什么,pageEncoding表示本页面的编码方式是什么 --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><title>showTime</title><!-- 控制让浏览器不要缓存 --><meta http-equiv="pragma" content="no-cache"><meta http-equiv="cache-control" content="no-cache"><meta http-equiv="expires" content="0">   <!-- keywords是让搜索引擎看的 --> <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"><meta http-equiv="description" content="This is my page"></head><body><% // 在<% 之间可以写我们的Java代码,就和我们在Java文件中写Java代码是一样的// 为什么可以直接使用out对象,因为out是jsp的内置对象// 内置对象就是不需要我们创建就能使用的对象,jsp有9大内置对象out.println("当前时间是:"+new Date().toLocaleString());%></body>
</html>

对应转换的servlet类中_jspService方法

public void _jspService(final javax.servlet.http.HttpServletRequest request, final javax.servlet.http.HttpServletResponse response)throws java.io.IOException, javax.servlet.ServletException {final java.lang.String _jspx_method = request.getMethod();
if (!"GET".equals(_jspx_method) && !"POST".equals(_jspx_method) && !"HEAD".equals(_jspx_method) && !javax.servlet.DispatcherType.ERROR.equals(request.getDispatcherType())) {
response.sendError(HttpServletResponse.SC_METHOD_NOT_ALLOWED, "JSPs only permit GET POST or HEAD");
return;
}final javax.servlet.jsp.PageContext pageContext;javax.servlet.http.HttpSession session = null;final javax.servlet.ServletContext application;final javax.servlet.ServletConfig config;javax.servlet.jsp.JspWriter out = null;final java.lang.Object page = this;javax.servlet.jsp.JspWriter _jspx_out = null;javax.servlet.jsp.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;out.write("\r\n");out.write("\r\n");out.write("<!-- lanuage表示嵌在JSP的的片段语言是什么,pageEncoding表示本页面的编码方式是什么 -->\r\n");out.write("\r\n");out.write("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">\r\n");out.write("<html>\r\n");out.write("  <head>\r\n");out.write("    <title>showTime</title>\r\n");out.write("    <!-- 控制让浏览器不要缓存 -->\r\n");out.write("\t<meta http-equiv=\"pragma\" content=\"no-cache\">\r\n");out.write("\t<meta http-equiv=\"cache-control\" content=\"no-cache\">\r\n");out.write("\t<meta http-equiv=\"expires\" content=\"0\">   \r\n");out.write("\t<!-- keywords是让搜索引擎看的 --> \r\n");out.write("\t<meta http-equiv=\"keywords\" content=\"keyword1,keyword2,keyword3\">\r\n");out.write("\t<meta http-equiv=\"description\" content=\"This is my page\">\r\n");out.write("  </head>\r\n");out.write("  <body>\r\n");out.write("    ");// 在<% 之间可以写我们的Java代码,就和我们在Java文件中写Java代码是一样的// 为什么可以直接使用out对象,因为out是jsp的内置对象// 内置对象就是不需要我们创建就能使用的对象,jsp有9大内置对象out.println("当前时间是:"+new Date().toLocaleString());out.write("\r\n");out.write("  </body>\r\n");out.write("</html>\r\n");} catch (java.lang.Throwable t) {if (!(t instanceof javax.servlet.jsp.SkipPageException)){out = _jspx_out;if (out != null && out.getBufferSize() != 0)try {if (response.isCommitted()) {out.flush();} else {out.clearBuffer();}} catch (java.io.IOException e) {}if (_jspx_page_context != null) _jspx_page_context.handlePageException(t);else throw new ServletException(t);}} finally {_jspxFactory.releasePageContext(_jspx_page_context);}}

三、总结

  • JSP历史与作用
  • JSP工作原理
  • JSP与对应servlet类分析

JavaWeb——jsp原理相关推荐

  1. javaweb学习总结(十四)——JSP原理

    一.什么是JSP? JSP全称是Java Server Pages,它和servle技术一样,都是SUN公司定义的一种用于开发动态web资源的技术. JSP这门技术的最大的特点在于,写jsp就像在写h ...

  2. javaweb学习总结(十四):JSP原理

    一.什么是JSP? JSP全称是Java Server Pages,它和servle技术一样,都是SUN公司定义的一种用于开发动态web资源的技术. JSP这门技术的最大的特点在于,写jsp就像在写h ...

  3. javaweb实训第三天下午——Web基础-Servlet交互JSP原理及运用

    1.课程介绍 Servlet三大职责: (掌握) Servlet重定向和请求转发: (掌握) JSP介绍: (了解) JSP语法: (掌握) JSP三大指令: (掌握)) JSP九大内置对象: (了解 ...

  4. JavaWeb的JSP原理,详细解析(建议收藏)

    JSP 什么时jsp Java Servlet Pages:Java服务器页面,也和Servlet一样,用于动态Web技术! 最大的特点: 写JSP就像在写HTML 区别 HTML只给用户提供静态的数 ...

  5. JavaWeb之JSP原理

    1.为什么需要JSP? 在很多动态网页中,绝大部分内容都是固定不变的,只有局部内容需要动态产生和改变.如果使用Servlet程序来输出只有局部内容需要改动的网页,其中所有的静态内容也需要程序员用jav ...

  6. Java-Web JSP、Cookie和Session域对象

    一.JSP入门 1.什么是JSP JSP(Java Server Pages)是JavaWeb服务器端的动态资源.它与html页面的作用是相同的,显示数据和获取数据. 2.JSP的组成 JSP = h ...

  7. web.xml、JSP原理、指令

    web应用和web.xml JSP(java server page)本质是servlet,因为JSP最终要编译成servlet才能运行. Tomcat的webapps路径下的web项目中的WEB-I ...

  8. 基于javaweb+jsp的医院住院管理系统(JavaWeb JSP MySQL Servlet SSM SpringBoot Bootstrap)

    基于javaweb+jsp的医院住院管理系统(JavaWeb JSP MySQL Servlet SSM SpringBoot Bootstrap) JavaWeb JavaBean JSP MVC ...

  9. 基于javaweb+jsp的设备维修管理系统(JavaWeb MySQL JSP Bootstrap Servlet SSM SpringBoot)

    基于javaweb+jsp的设备维修管理系统(JavaWeb MySQL JSP Bootstrap Servlet SSM SpringBoot) JavaWeb JavaBean JSP MVC ...

最新文章

  1. Lync server 2013 之office web apps server 搭建步骤
  2. Java 8 开发的 4 大顶级技巧,你都知道吗 ?
  3. Visual Basic 2005 - 如何将色彩字符串转换成 Color 结构
  4. ibm服务器imm管理方式简介
  5. 【Python】青少年蓝桥杯_每日一题_8.27_因数个数
  6. JavaScriptWindow使用对象
  7. jzoj6451-[2020.01.19NOIP提高组]不幸运数字【记忆化搜索,数位dp,高精度】
  8. mysql 连续签到天数_签到功能实现,没有你想的那么复杂(一)
  9. 常见的股票技术因子学习以及计算
  10. 不同网段的PC与交换机的原理
  11. IOS开发网络篇之──ASIHTTPRequest详解
  12. python爬虫淘宝评论图片_淘宝上的图片是怎么被爬取的
  13. 【福利】论机房如何关闭方正软件保护卡
  14. 周爱民:详解架构的核心原则
  15. 自从我使用HiFlow场景连接器后,在也不用担心成为“落汤鸡”了
  16. 安装ps时无法验证订阅状态_如何解决:Office 无法验证此应用程序的许可证
  17. 语言-汉语-官话-中原官话-兖菏片:兖菏片
  18. android 1.5 app,萌新编程app
  19. html实现下拉跳转
  20. overflow的用法(auto)

热门文章

  1. java中有哪几种访问修饰符_Java语言中有4种访问修饰符
  2. java方法中与参数怎么调用,java中怎么从一个方法中调用另一个方法中的参数?(以及如何提取数字)...
  3. 盒子阴影(HTML、CSS)
  4. 表单标签 input
  5. input file 上传图片判断图片的宽高尺寸
  6. mfc之CPtrArray数组
  7. ubuntu解决安装Scrapy库时报x86_64-linux-gnu-gcc错误
  8. python如何运行一个python程序_python如何运行?第一个python小程序示范
  9. 为springboot项目添加springboot-admin监控
  10. FreeRTOS之Tracealyzer for FreeRTOS(FreeRTOS+Trace) 详解(源码解析+移植)