今天说说jsp的基本原理,是javaWeb的重要组件。
那么说jsp之前,首先说一下Servlet与HTML的优缺点,
Servlet | HTML | |
---|---|---|
长处 | 接收请求参数,访问域对象,转发页面 | 以友好方式显示数据 |
短处 | 以友好方式显示数据 | 动态显示数据 |
为什么要说Servlet与HTML的优缺点呢?
因为jsp作用就是将Servlet和HTML二者的长处结合起来。
那么来简单介绍一下jsp吧
1.Jsp全称
- Jsp全称Java Server Pages,顾名思义就是运行在java服务器中的页面。由Sun 公司专门为了解决动态生成HTML文档的技术,也就是在我们JavaWeb中的动态页面。
- Jsp能够以HTML页面的方式呈现数据,是一个可以嵌入Java代码的HTML。
- Jsp其本质就是一个Servlet。Servlet能做的事情JSP都能做。
- Jsp必须运行在服务器中,不能直接使用浏览器打开。
- Jsp是Web网页的技术标准,主要语法组成包括:指令,html模板元素,脚本片段(小脚本),表达式,声明,注释,后缀是*.jsp。
2.说一下Jsp与Html的区别
Jsp是动态页面,html是静态页面。
动态页面 | 静态页面 | |
---|---|---|
运行原理 | 通过服务器解析后,将数据在浏览器中显示 | 直接在浏览器中解析运行 |
维护成本 | 较低,可以修改后台数据,进而影响页面中的数据 | 较高,必须将修改后的页面覆盖原页面 |
数据库 | 可以连接数据库 | 不可连接数据库 |
访问速度 | 较慢 | 较快 |
书写代码 | 可以书写java代码 | 不能书写java代码 |
3.Jsp与Servlet分工
Jsp本质是一个Servlet ,翻译后的文件结构为:class helloworld_jsp : HttpJspBase : HttpServlet。
Jsp主要负责显示及获取数据,从表面上看,Jsp相对于在html中嵌入java代码:jsp=html+java。而Servlet主要负责处理业务,从表面上看,Servlet相当于在java中嵌入html代码:Servlet=java+html。
总结:
相比于Servlet,Jsp更加善于处理显示页面,而Servlet更善于处理业务逻辑,两种技术各有专长,所以一般我们会将Servlet和Jsp结合使用,Servlet负责业务,Jsp负责显示。
4.Jsp基本格式
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
这是我的第一个jsp页面。
</body>
</html>
5.那么知道jsp是干什么的了继续了解一下JSP运行原理吧
jsp的本质其实是一个Servlet程序。
- 实际上Tomcat在运行JSP时,并不是直接显示的我们所编写的JSP页面,而是将JSP页面转换成了一个Java类,这个Java类是什么,我想大家也能猜到了,它实际上就是一个Servlet。
这个Servlet在哪呢?记得Tomcat的work目录吗?在那个目录下保存着Tomcat自动生成的一些内容,下面让我们来找到那个目录。
-
对于Eclipse来说是在:工作空间下的.metadata.plugins\org.eclipse.wst.server.core\tmp0
-
对于MyEclipse来说就可以直接去Tomcat的安装目录去查找
-
在work目录下的…work\Catalina\localhost\day07_jsp\org\apache\jsp文件夹中我们可以发现两个文件index_jsp.java和index_jsp.class,前者就是Tomcat自动生成的Servlet的源码,后者是编译后的.class文件。
打开index_jsp.java文件部分内容如下:
图一:
打开index_jsp.java文件查看里面的内容:发现,生成的类继承于HttpJspBase类。这是一个jsp文件生成Servlet程序要继承的基类!于是,我们关联源代码。去查看一下HttpJspBase类的内容。从源码的类注释说明中,我们发现。HttpJspBase这个类就是所有JSP文件生成Servlet程序需要去继承的基类。并且这个HttpJspBase类继承于HttpServlet类。我们访问JSP时服务器就是调用了该Servlet来响应请求。所以JSP也是一个Servlet小程序。
然后分别在工程的WebContent目录下创建多个jsp文件。然后依次访问。它们都被翻译为.java文件并编译成为.class字节码文件。
继续顺着代码向下看,会发现_jspService()方法。会发现有九个对象(实际上默认会看到八个),这是后面一篇的内容,在这里就不多说了。
图二:
小结:
从生成的文件我们不难发现一个规则:
a.jsp 翻译成 java文件后的全名是 a_jsp.java文件
b.jsp 翻译成 java文件后的全名是 b_jsp.java文件
那么当我们访问 一个xxx.jsp文件后翻译成java文件的全名是 xxx_jsp.java文件。
xxx_jsp.java文件是一个Servlet程序。原来jsp中的html内容都被翻译到Servlet类的service方法中原样输出。
下一个问题:Servlet是需要在web.xml中配置的,而我们并没有配置JSP的serlvet映射,那他是如何访问的呢?实际在tomcat下的conf目录中的web.xml早已配置好了JSP的映射信息,具体内容如下:
<servlet>
<servlet-name>jsp</servlet-name>
<servlet-class>org.apache.jasper.servlet.JspServlet</servlet-class>
<init-param>
<param-name>fork</param-name>
<param-value>false</param-value>
</init-param>
<init-param>
<param-name>xpoweredBy</param-name>
<param-value>false</param-value>
</init-param>
<load-on-startup>3</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>jsp</servlet-name>
<url-pattern>*.jsp</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>jsp</servlet-name>
<url-pattern>*.jspx</url-pattern>
</servlet-mapping>
这就是Jsp的运行原理了,那么来稍微总结一下
- 第一次访问jsp页面时,服务器会将xxx.jsp文件翻译成xxx_jsp.java文件,再编译成xxx_jsp.class文件。
- 以后在访问同一个jsp文件。
- 如果文件未改变,不会被翻译和编译。
- 如果文件改变,会翻译和编译。
Jsp的运行原理关于这部分的到这里就结束了,有什么问题及时讨论交流。