JavaWeb学习-JSP系列-1-JSP概述和JSP原理

你的名字 2022-01-27 05:47 409阅读 0赞

前面算是把Servlet学习完了,接下来学习一个JSP,JSP比较简单。不止看到一次有人说过,学习JavaWeb,其实重点就是学习Servlet和JSP,什么SSH SSM框架都是在基础只要的工具学习,加快开发速度的。

1.1 什么是JSP
JSP全称是Java Server Pages, 它和servlet技术一样,都是SUN公司定义的一种用于开发动态web资源的技术。JSP实际上就是Servlet.

  1. JSP这门技术的最大特点在于,写jsp就像在写html,但它相比html而言,html只能为用户提供静态数据,而jsp技术允许在页面中嵌套java代码,为用户提供动态数据。
  2. 可以这门理解,jsp = html + java
  3. servlet:服务端的小应用程序,适合编写Java逻辑代码,如果想在servlet里编写html网页内容,会很苦逼的感觉。
  4. jsp:适合编写输出动态内容,但不适合编写java逻辑。

1.2 JSP快速入门demo
Eclipse上新建一个动态web项目,例如名称叫JSP01,然后在WebContent目录下新建一个叫index.jsp的文件。这个文件如果在myEclipse是自动创建,Eclipse需要自己手动去创建,而且创建过程中选择html 4.01这个模板。

  1. index.jsp根据模板创建好的代码如下
  2. <%@ page language="java" contentType="text/html; charset=ISO-8859-1"
  3. pageEncoding="ISO-8859-1"%>
  4. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
  5. <html>
  6. <head>
  7. <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
  8. <title>Insert title here</title>
  9. </head>
  10. <body>
  11. </body>
  12. </html>

我们这里写有一个在网页显示当前系统时间的简单入门例子,修改代码后index.jsp内容如下

  1. <%@ page language="java" import="java.util.*" contentType="text/html; charset=ISO-8859-1"
  2. pageEncoding="ISO-8859-1"%>
  3. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
  4. <html>
  5. <head>
  6. <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
  7. <title>Insert title here</title>
  8. </head>
  9. <body>
  10. <%
  11. Date date = new Date();
  12. out.print(date);
  13. %>
  14. </body>
  15. </html>

Eclipse上启动tomcat服务器,重新部署代码,打开浏览器 ,访问地址http://localhost:8080/JSP01/index.jsp

  1. 效果截图如下
  2. ![20190525160249295.png][]

1.3 JSP原理

我们通过回答下面几个问题来掌握JSP原理

问题1:浏览器访问JSP页面时,Web服务器是如何调用并执行一个jsp页面的?

先画一个图,然后来解释

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTE1NDE5NDY_size_16_color_FFFFFF_t_70

上面红色表示最开始的请求,蓝线箭头表示下一次请求。首先,浏览器请求了一个地址,服务器找到请求的应用程序,找到index.jsp,这里服务器不是直接执行jsp,而是先把jsp翻译成java文件,然后java编译成class字节码文件,最后执行字节码文件内容去响应浏览器,这个就是一个最开始过程。

有了第一次请求之后,接下来的请求,就直接去找class文件,除非index.jsp代码有改动,否则不会再转义成新的java文件。如果jsp文件代码发生改动,会转译成java文件,然后编译class,再执行。

我们可以打开tomcat服务器文件路径 F:\apache-tomcat-8.5.40\work\Catalina\localhost\JSP01\org\apache\jsp

20190525171902607.png

这个java文件和class文件证明上面图的原理。你可以删除这两个文件,然后浏览器重新访问index.jsp,这个时候继续生成这两个文件。如果你只删除index_jsp.java,然后访问index.jsp,那么是不会再生成index_jsp.java,除非你index.jsp代码发生变化,哪怕一个空格变化,也会新生成index_jsp.java文件,然后编译产生新的index_jsp.class文件。

我们来用notepad++打开index_jsp.java,看到以下

20190525172321570.png

上面不是说了嘛,JSP本质上就是一个servlet,应该是继承了HttpServlet类的,别急,你拿着HttpJspBase去tomcat的src源码文件去找到这个类,发现确实是继承了HttpServlet.

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTE1NDE5NDY_size_16_color_FFFFFF_t_70 1

打开这个代码

2019052517265857.png

到这里,解释清楚了JSP执行原理过程和JSP为什么是Servlet类。其实我们还可以继续读源码找下去,既然继承了HttpServlet,那么这个类肯定有init,service方法,子类应该重写父类的这几个servlet生命周期方法。

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTE1NDE5NDY_size_16_color_FFFFFF_t_70 2

问题2:web服务器在执行jsp页面时,是如何把jsp中标签发送到客户端的?

我们在写显示系统时间的index.jsp文件里有html标签,那么服务器是如何把这些标签发送到客户端,其实就是通过out.write(), 写入字符流的方式,发送到客户端,我们可以看看index_jsp.java代码来证明这个。

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTE1NDE5NDY_size_16_color_FFFFFF_t_70 3

问题3:JSP页面中的java代码,服务器是如何执行的?

这里来讨论下服务器是如何执行jsp中<% %>中间的java代码。

上面我们看到会转译成index_jsp.java文件,jvm执行java代码,这里肯定没问题,然后还是使用out.wirte把结果发送到浏览器端,让浏览器自己去解析。注意,我们看到jsp文件中有一个导入包的注释,在第一行,执行java代码中,遇到java类会根据导入包去找jdk中java类对象,从而执行对应java代码。

  1. <%@ page language="java" import="java.util.*" contentType="text/html; charset=ISO-8859-1"
  2. pageEncoding="ISO-8859-1"%>

就是这个作用,上面告诉在<% %>中语言是java,提前导入了java.util下全部包,编码方式是美国那边默认的iso-8859-1,你完全可以修改成UTF-8。

问题4:Web服务器在调用jsp时候,会给jsp提供一些什么样的java对象?

还是来看index_jsp.java代码,找出以下我们之前学习过的对象

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTE1NDE5NDY_size_16_color_FFFFFF_t_70 4

我们学习过的对象有request,response, session, servletContext, ServletConfig, out其实就是我们前面学习的PrintWriter对象。其他没学,后面来介绍。

发表评论

表情:
评论列表 (有 0 条评论,409人围观)

还没有评论,来说两句吧...

相关阅读