想掌握JSP基本原理?那就进来看一看吧


今天说说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文件部分内容如下:

图一:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zY4Lz5Yx-1575202375907)(尚硅谷_张春胜_JSP.resource\jsp翻译servlet后部分源码1.png)]
  打开index_jsp.java文件查看里面的内容:发现,生成的类继承于HttpJspBase类。这是一个jsp文件生成Servlet程序要继承的基类!于是,我们关联源代码。去查看一下HttpJspBase类的内容。从源码的类注释说明中,我们发现。HttpJspBase这个类就是所有JSP文件生成Servlet程序需要去继承的基类。并且这个HttpJspBase类继承于HttpServlet类。我们访问JSP时服务器就是调用了该Servlet来响应请求。所以JSP也是一个Servlet小程序。

   然后分别在工程的WebContent目录下创建多个jsp文件。然后依次访问。它们都被翻译为.java文件并编译成为.class字节码文件。
  继续顺着代码向下看,会发现_jspService()方法。会发现有九个对象(实际上默认会看到八个),这是后面一篇的内容,在这里就不多说了。

图二:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AaQSXrqd-1575202375913)(尚硅谷_张春胜_JSP.resource\jsp翻译servlet后部分源码2.png)]

小结:

从生成的文件我们不难发现一个规则:

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方法中原样输出。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1AVdpTC9-1575202375915)(尚硅谷_张春胜_JSP.resource\1558023396492.png)]

下一个问题: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的运行原理了,那么来稍微总结一下
  1. 第一次访问jsp页面时,服务器会将xxx.jsp文件翻译成xxx_jsp.java文件,再编译成xxx_jsp.class文件。
  2. 以后在访问同一个jsp文件。
    • 如果文件未改变,不会被翻译和编译。
    • 如果文件改变,会翻译和编译。

Jsp的运行原理关于这部分的到这里就结束了,有什么问题及时讨论交流。

发布了166 篇原创文章 · 获赞 585 · 访问量 6万+

猜你喜欢

转载自blog.csdn.net/zxdspaopao/article/details/103338775