JavaWeb学习-JSP系列-1-JSP概述和JSP原理
前面算是把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
效果截图如下
![20190525160249295.png][]
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对象。其他没学,后面来介绍。
还没有评论,来说两句吧...