什么是jsp?

jsp的全称为 java service pages .是服务器的页面

为什么会有jsp?

jsp的主要作用是代替 Servlet 程序回传 html 页面数据的。因为 Servlet 程序回传 HTML 页面数据是一件非常繁琐的事情,并且开发成本和维护成本极高。

如何创建jsp页面?
在工程的 web 目录下 new 一个 jsp 页面即可

jsp 页面的访问和 html 页面的访问一样。jsp 也是存放在工程的 web 目录下的

jsp的本质是什么?

jsp 页面的本质其实是一个Servlet 程序。

当我们第一次访问 jsp 页面时,Tomcat 服务器会把该 jsp 页面翻译成一个 java 源文件,并将它编译成一个 .class 字节码文件。当我们打开 java 源文件,发现其中的内容竟然是:

HttpJspBase这个类它继承于 HttpJspBase。而我们进入 HttpJspBase 这个类时,发现它继承于 HttpServlet。
所有 通过 jsp文件翻译成的 java 源文件中的类,间接的继承于HttpServlet。因此服务器对 jsp 页面进行翻译出来的 java 源码其实是一个 Servlet 程序。

并且通过查看此源码,发现 jsp 页面回传 html 页面数据也是通过输出流的方法回传的:

jsp的三种语法

jsp 头部的page指令

jsp 头部的page指令可以修改jsp页面中一些重要的属性,或者行为。

以下是jsp 页面中一些常见的属性:

language 属性                设置jsp页面翻译成的文件的类型(目前只支持java)
contextType 属性            设置jsp返回的数据类型。与response.setContextType()的参数值一样
pageEncoding 属性            设置当前jsp 页面文件本身的字符集
import 属性                    用于jsp 文件的导包、导类
autoFlush 属性                设置当jsp的out输出流缓冲区满了之后是否自动刷新缓冲区,默认为true
buffer 属性                    设置jsp的out输出流缓冲区大小,默认8kb
errorPage 属性                设置当jsp页面运行出错,自动跳转去的页面路径
isErrorPage 属性            设置当前jsp页面是否是错误信息页面。默认为false。如果是true,可以获取异常信息
session 属性                设置访问当前jsp页面,是否会创建HttpSession对象。默认为true
extends 属性                设置当jsp文件翻译出来的java类默认继承自谁

jsp 中的常用脚本

声明脚本(不常用)

声明脚本的格式为:<%! 声明java代码 %>
作用:声明脚本可以声明类的属性、静态代码块、方法以及内部类。
声明脚本会出现在jsp页面翻译出来的 java源代码中

表达式脚本(常用)

表达式脚本的格式是:<%= 表达式 %>
作用:在jsp页面上输出数据。一般用于输出对象
特点:

  • 所有的表达式脚本都会被翻译到_jspService() 方法中。
  • 表达式脚本都会被翻译成out.print()输出到页面上
  • 因为表达式脚本会被翻译到 _jspService() 方法中,所以 _jspService() 方法中的对象都可以直接使用
  • 表达式脚本中的表达式不能以分号结束

代码脚本(常用)

代码脚本的格式为:<% 代码 %>
作用:可以在jsp页面中,编写我们自己需要的功能

特点:
1、代码脚本被翻译后都在_jspService() 方法中
2、因为特点1,所以在_jspService() 方法中的现有对象都可以直接使用
3、代码脚本非常强大,可以由多个代码脚本块组合完成一个完整的java语句
4、代码脚本还可以和表达式脚本组合使用,在jsp页面上输出数据,非常灵活

jsp九大内置对象

当jsp页面被服务器翻译成Servlet源文件时,内部会提供九个对象,称为内置对象

request                 请求对象
response                响应对象
pageContext            jsp上下文对象
session                会话对象
application            ServletContext对象
config                 ServletConfig对象
out                    jsp输出流对象
page                   指向当前jsp的对象
exception              异常对象

四大域对象

这九个内置对象中有四个域对象。域对象是可以像Map一样存储数据的,四个域对象的功能一样,不同的是它们对数据的存取范围。这四个域对象对应的类以及有效范围分别是:

pageContext                PageContextImpl类                当前jsp页面有效
request                    HttpServletRequest类            一次请求内有效
session                    HttpSession类                    一个会话范围有效(打开浏览器访问服务器,知道浏览器关闭)
application                ServletContext类                整个web工程内都有效(只要web工程不停止,数据都在)

虽然四个域对象都可以存取数据,但是在使用上它们是有优先顺序的,它们的优先顺序就是它们从小到大范围的顺序:pageContext>request>session>application

jsp中的out输出流与resopnse.getWriter()输出的区别

众所周知,response表示响应,用于回传给客户端数据(输出),out也是给客户端做输出使用的。
但是它们也有一些区别。
当jsp页面同时有resopnse.getWriter()输出以及out.write()输出时,我们会发现:out流输出的内容总是会排在resopnse.getWriter()输出的内容的后面,无论它们的先后执行顺序。

其实这是因为:当jsp页面中所有的代码执行完成后会做以下两个操作:
1、先执行out流的flash()操作,但是注意,out流的flash()刷新操作,是把out缓冲区里的内容追加写入到resopnse.getWriter()流的缓冲区末尾
2、再执行response.getWriter()的刷新操作,将自己缓冲区的数据写给客户端

那我们在jsp页面中使用哪个输出流进行输出呢?
由于 jsp 翻译之后,底层源码都是使用out输出流输出数据,所以,一般情况下,我们统一使用out来进行输出。避免打乱页面输出内容的顺序

这里再顺带说一句,out输出数据有两种方法:writer()和print()
这两种方法在使用上也有一些需要注意的地方:
1、writer()方法只适合用来输出字符串
2、print()方法可以输出任意数据类型。
(这里的原因涉及源码底层的实现,这里不在一一阐述)

jsp的常用标签

jsp静态包含
格式:<%@include file="" %>
其中的file属性指定你要包含的jsp页面的路径
作用:它可以使当前jsp页面将指定路径的jsp页面引入显示进来

特点:

  • 静态包含不会翻译被包含的jsp页面
  • 静态包含其实是把被包含的jsp页面代码拷贝到包含的位置执行输出

jsp动态包含

格式:<jsp:include page=""></jsp:include>
其中的page和静态包含的file属性作用一样,用于将指定路径的jsp页面引入显示进来。

特点:

  • 动态包含会将包含的jsp页面也翻译成java文件
  • 动态包含底层代码使用如下代码去实现被包含的jsp页面的输出:

              JspRuntimeLIbrary.include(request,response,"指定的jsp页面的路径",out,false);
  • 动态包含还可以传递参数:

               例:<jsp:include page="">
                  <jsp:parm name="username" value="jack" />
                  <jsp:parm name="password" value="root" />
                  </jsp:include>
    

jsp标签-转发

格式:<jsp:forward page="" /></jsp:forward>
其中page属性指定你要跳转的页面

最后修改:2021 年 07 月 18 日 04 : 33 PM
如果觉得我的文章对你有用,请随意赞赏