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

    xiaoxiao2023-10-28  29

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

     

    1.1 什么是JSP     JSP全称是Java Server Pages, 它和servlet技术一样,都是SUN公司定义的一种用于开发动态web资源的技术。JSP实际上就是Servlet.     JSP这门技术的最大特点在于,写jsp就像在写html,但它相比html而言,html只能为用户提供静态数据,而jsp技术允许在页面中嵌套java代码,为用户提供动态数据。          可以这门理解,jsp = html + java     servlet:服务端的小应用程序,适合编写Java逻辑代码,如果想在servlet里编写html网页内容,会很苦逼的感觉。     jsp:适合编写输出动态内容,但不适合编写java逻辑。1.2 JSP快速入门demo     Eclipse上新建一个动态web项目,例如名称叫JSP01,然后在WebContent目录下新建一个叫index.jsp的文件。这个文件如果在myEclipse是自动创建,Eclipse需要自己手动去创建,而且创建过程中选择html 4.01这个模板。     index.jsp根据模板创建好的代码如下

    <%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> <title>Insert title here</title> </head> <body> </body> </html>

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

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

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

       

    1.3 JSP原理

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

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

    先画一个图,然后来解释

    上面红色表示最开始的请求,蓝线箭头表示下一次请求。首先,浏览器请求了一个地址,服务器找到请求的应用程序,找到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

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

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

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

    打开这个代码

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

     

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

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

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

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

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

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

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

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

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

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

     

    最新回复(0)