一. JSP入门

1.1 JSP技术介绍

(1)为什么会出现JSP(Java Server Pages)技术?

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

(2)JSP是什么?
1.jsp运行在服务器
2.jsp的基础是Servlet(相当于对Servlet进行了一个包装而已)
3.jsp是一个综合技术,如下公式:

jsp = html + java片段 + JSP标签(语法) + javascript(css)

(3)JSP的特点:

JSP的全称是Java Server Pages,它和Servlet技术一样,都是SUN公司定义的一种用于开发动态web资源的技术。

jsp这门技术的最大的特点在于,写jsp就像在写HTML,但:

  • 它相对于html而言,html只能为用户提供静态数据,而jsp技术允许在页面中嵌套java代码,为用户提供动态数据。
  • 相比Servlet而言,Servlet很难对数据进行排版,而jsp除了可以用java代码产生动态数据的同时,也很容易对数据进行排版。

1.2 快速入门

假设我们要用jsp技术显示当前的时间。
我们在MyEclipse中新建Web项目,名字为JSP1,然后在WebRoot文件夹下,也就是Web应用的根目录下新建jsp文件,命名为showTime.jsp,这个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>

可以看到我们在html的代码中,使用了<% %>符号嵌入了java代码,并且使用了jsp中的out这个内置对象,在jsp中,内置对象就是不需要我们创建就能使用的对象,后面会介绍到jsp有9大内置对象。

【要注意的是】

  • JSP无需配置,直接使用。如果你修改了JSP文件,或者在Web应用新添加了JSP文件,都不需要重新reload该Web应用。
  • 访问方法:http://ip:8080/Web应用名/JSP文件路径

我们访问该jsp页面,可以看到运行结果:

1.3 原理细节分析

1.3.1 Web服务器是如何调用并执行一个jsp页面的?

我们要知道jsp只是对Servlet的一层封装。所以它肯定和Servlet的关系密切。而实际上,Jsp页面也正是先翻译成Servlet,然后再编译加载进内存的。看如下jsp的运行过程:

如果是第一次访问该jsp文件,web服务器就会把showTime.jsp翻译成一个Servlet:showTime_jsp.java,再将其编译成一个showTime_jsp.class,然后把class加载到内存。
如果是第二次或是以后访问,它就会直接访问内存中的实例了。

我们可以在Tomcat的安装目录下找到这个被服务器翻译成的Servlet:showTime_jsp.java。在Tomcat根目录下的work文件夹中,我们一层一层向下找,可以找到如下:

从这个文件夹中,我们可以看到showTime_jsp.java,并且也能看到它编译成的class文件。我们可以打开看一下这个文件的代码,比较复杂但是其实和我们之前写的Servlet差不多,它导入的包也都是servlet的包,然后加上我们用到的java.util.Date包,如下:

import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.jsp.*;
import java.util.Date;

我们可以找到最关键的代码,也就是_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);}}

可以看到代码中的许多out.write()正是我们所写的jsp页面的内容。这也就印证了我们上面所述的结论:jsp页面是先被服务器翻译成Servlet代码,之后再编译加载进内存运行的。

所以第一次访问一个JSP页面速度比较慢,之后就会变快了。
假设某个JSP文件被修改了,那么之后的再次访问就相当于第一次访问

【注意点】
这里要特别注意的是,因为我们的服务器真正运行的是这个showTime_jsp.java文件,所以如果在测试的时候报错了,是报的这个文件的错,报错指出的错误行也指的是showTime_jsp.java这个文件的错误行,而并不是showTime.jsp这个文件的错误行。这对于我们调试代码很重要!


1.3.2 Jsp页面中的Java代码服务器是如何执行的?

假设我们在一个jsp的文件中写如下代码:

<body><% int i = 90;int j = i + 100;%><h1>测试</h1><%out.println("i="+i+"<br>");out.println("j="+j);%></body>

可以看到,我们使用了两个<% %>符号嵌入了两段java代码,并且第二段java代码使用了第一段java代码中定义的变量,这样会报错吗?

【答案】:不会的,我们可以查看服务器翻译的对应于这个jsp文件的Servlet文件,找到那个最重要的_jspService方法,就可以看到,这几句代码都在该方法中,而定义的 i 和 j 变量不过是该方法的两个局部变量,当然可以被之后的语句使用了。

【结论】:如果有多个<% %>这样包含的java片段,其实是相当于一个大的java片段,在这中间定义的变量会成为_jspService函数的局部变量。


1.3.3 Web服务器在调用Jsp时,会给Jsp提供一些什么Java对象?

9个内置对象,后面会介绍到。我们现在已经使用了out这个对象,它其实就是相当于Servlet中的PrintWriter对象。

JSP——JSP介绍以及运行原理相关推荐

  1. APP自动化测试系列之Appium介绍及运行原理

    VOL 161 23 2020-09 今天距2021年99天 这是ITester软件测试小栈第161次推文 点击上方蓝字"ITester软件测试小栈"关注我,每周一.三.五早上 0 ...

  2. 【Servlet】JSP学习-概念和运行原理

    为什么需要JSP? 与HTML相比:根据后台的业务,可以动态输出HTML,网页内容是可以改变的. 与原生Servlet相比:不需要自己写输出语句resp.getWriter().write(" ...

  3. JSP起源、JSP的运行原理、JSP的执行过程

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

  4. jsp是什么以及jsp运行原理

    jsp是什么以及jsp运行原理 一.JSP的简单介绍 1. JSP(Java Server Pages)是由Sun Microsystems公司倡导.许多公司参与一起建立的一种动态网页技术标准.JSP ...

  5. 9.JSP运行原理与JSP页面的基本结构

    JSP运行原理与JSP页面的基本结构 HTML页面的基本构成 .代码中出现的几种标签 •单标签     某些标签只需单独使用就能完整地表达意思,控制网页 效果,这类标签的语法是: <标签> ...

  6. 【JSP】JSP的运行原理

    初次访问JSP页面 JSP同Servlet一样,都运行在Servlet容器中.当用户第一次访问JSP页面时,JSP页面的执行过程可分为五个步骤,各步骤含义如下: 客户向服务器发送JSP页面请求(req ...

  7. 什么是JSP,JSP的运行原理是什么?

    在动态Web项目的开发中,经常需要动态生成HTML.内容(如系统中的当前在线人数需要动态生成).如果使用Servlet实现HTML页面数据的统计,则需要使用大量的输出语句.同时,如果静态内容和动态内容 ...

  8. JSP运行原理 九大内置对象 四大作用域

    Jsp的简介 jsp的全称是java server pages 意思为java的服务页面 jsp必须运行在服务器,不能脱离服务器单独运行 jsp是可以写java代码的html jsp的本质就是一个se ...

  9. JSP运行原理及运行过程

    学习J2EE时,初步了解了JSP,写过一篇小的总结:J2EE-JSP,当时还不是很了解它的运行机制. 学习DRP时,再次接触了JSP,在原来基础上有了更深的了解,了解了它的执行原理 1,JSP的运行原 ...

  10. web开发总结-Servlet与JSP(运行原理)

    文章结构:(1)剖析Servlet:(2)剖析JSP: 一.剖析Servlet: (1)概述: Servlet是一种独立于平台和协议的服务器端的Java应用程序,可以生成动态的web页面.它担当Web ...

最新文章

  1. ArcGIS Server 内存占用相关
  2. WPF 和 windows Form Application的区别
  3. CYQ.Data 数据框架 V4.0 开源版本发布(源码提供下载,秋色园V2.5版本标配框架)
  4. 2019.8.13 sdfzoier
  5. 通过ssh方式clone项目_参与开源项目流程
  6. 论软件定义GPU对AI数据中心优化的必要性
  7. 20190904:(leetcode习题)合并两个有序数组
  8. Scala 类型、数值类型及类型转换
  9. ajax跨域,json,jsonp
  10. python 文件行数_python—文件和数据(文件行数 文件字符分布)
  11. python读取excel绘图y轴设置_python读取并定位excel数据坐标系详解
  12. 如果一台通用计算机的,一台计算机,之所以有相当的灵活性和通用性,能解决许多.doc...
  13. iso 绝对pe_通用PE工具箱 V5.0(WIN7PE内核)U盘ISO硬盘完美三合一版
  14. 考研复试常见问题(数据库系统概论篇)
  15. 腾达u2无线网卡驱动Linux,腾达U2无线网卡驱动
  16. 用DownSub 导出TED和youtube字幕
  17. pmap gdb 分析堆外内存泄露情况
  18. (三)RabbitMQ集群(Ⅰ)
  19. 一秒录音转文字,一键同声翻译,这两款软件简直无敌!
  20. 好雨知时节 不甚欢喜

热门文章

  1. Recyclerview-BRVAH使用
  2. 明解c语言第7章答案,明解C语言 入门篇 第六章答案
  3. excel中如何对比两个表格的重复数据
  4. 常见的SQL优化面试题
  5. 【手把手】教你MySQL调优
  6. Halo博客搭建及配套小程序使用教程
  7. 基于Python的指数基金量化投资 - 正三角和倒三角投资模型
  8. 华为系统固件服务器,华为手机固件
  9. matlab之统计和机器学习工具箱
  10. 小米青春版路由器解锁root与SSH方法