JSP(全称: Java server pages)笔记

一、认识 jsp

1. jsp 的作用

jsp 的全称为 java server pages ,即 Java 的服务器页面,它的主要作用是替代 Servlet 程序回传 html 页面的数据。

因为 Servlet 程序回传 html 页面数据是一件非常繁琐的事情,开发成本和维护成本极高,所以使用 jsp 来替代 Servlet 回传数据。

2. jsp 的本质

jsp 本质就是一个 Servlet 程序。

当我们第一次访问 jsp 页面的时候,Tomcat 服务器会帮我们把 jsp 页面翻译为一个 java 源文件。并且对它进行编译为 .class 字节码程序。查看由 jsp 页面翻译楚的 java 源文件可以看出它继承了 HttpJspBase 类,而 HttpJspBase 类直接继承了 HttpServlet 类。也就是说,jsp 翻译出来的 java 类,它间接的继承了 Httpservlet 类,所以 jsp 的本质就是 Servlet 程序。

1
2
3
4
5
6
/*
HttpJspBase 类源代码
*/
public abstract class HttpJspBase extends HttpServlet implements HttpJspPage {
......
}

另外从 jsp 页面 翻译出的 Servlet 程序的源代码,不难发现。其底层实现,也是通过输出流将 html 页面回传给客户端。

二、jsp 的基础语法

头部 page 指令

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

1
<%@ page contentType="text/html;charset=UTF-8" language="java" %>

头部指令属性

language 属性

​表示 jsp 翻译后是什么语言文件,暂时只支持 java

contentType 属性

​表示 jsp 返回的数据类型是什么。也是源码中 response.setContentType() 参数值

pageEncoding 属性

​表示当前 jsp 页面文件本身的字符集

import 属性

​跟 java 源代码中一样,用于导包,导类

autoFlush 属性

​设置 out 输出流缓冲区满了之后,是否自动刷新冲级区。默认值是 true

buffer 属性

​设置 out 缓冲区的大小,默认为 8kb

errorPage 属性

​设置当前 jsp 运行时出错后自动跳转到资源位置

isErrorPage 属性

​设置当前 jsp 页面是否是错误信息页面,默认是 false,如果是 true 则可以获取异常信息

session 属性

​设置访问当前 jsp 页面,是否会创建 HttpSession 对象,默认值为 ture

extends 属性

​设置 jsp 翻译的 java 类默认继承的类

常用脚本

声明脚本(极少使用)

格式:<%! 声明 java 代码 %>

作用:可以给 jsp 翻译出来的 java 类定义属性和方法、代码块、内部类等。

表达式脚本(常用)

格式: <%= 表达式 %>

作用:可以在 jsp 页面上输出数据

特点:

  1. 所有的表达式脚本都会被翻译到 _jspService() 方法中
  2. 表达式脚本都会被翻译称 out.print() 输出到页面上
  3. 由于表达式脚本的翻译的内容都在 _jspService() 方法中,所以 _jspService() 方法中所有对象都可以使用
  4. 表达式脚本中的表达式不能以分号结束

代码脚本

格式:

1
2
3
<%
java 语句
%>

作用:可以在 jsp 页面中,编写我们自己需要的功能(编写 java 语句)。

特点:

  1. 代码脚本翻译之后都在 _jspService() 方法中
  2. 代码脚本由于翻译到 _jspservice() 方法中,所以在 _jspService() 方法中的所有对象都可以直接使用
  3. 代码脚本可以多个组合一起完成一个完整的 java 语句
  4. 代码脚本还可以和表达式脚本一起组合使用,在 jsp 页面上输出数据

练习:

① 代码脚本 if 语句

② 代码脚本 for 循环语句

③ 翻译后的 Java 文件中 _jspService() 方法内部代码都可以写

三种注释方法

HTML 注释

1
<!-- HTML 注释 -->

html 注释会被翻译到 java 源代码中,在 _javaService 方法里,以 out.write 输出到客户端。

Java 注释

1
2
3
4
5
//  单行 Java 注释

/*
多行 Java 注释
*/

java 注释会被翻译到 java 源代码当中

jsp 注释

1
<%-- JSP 注释 --%>

jsp 注释可以注释掉 jsp 中所有代码,是 jsp 中真正的注释

jsp 内置对象

jsp 中的内置对象,是指 Tomcat 在翻译 jsp 页面成为 Servlet 源代码后,内部提供的九大对象,叫内置对象。

五非域对象

response

​ 响应对象

config

​ServletConfig 对象

out

​jsp 输出流对象

page

​ 指向当前 jsp 的对象

exception

​ 异常对象

四大域对象

域对象是可以像 Map 一样存取数据的对象,四个域对象功能一样,不同的是数据的存取范围

pageContext

​jsp 上下文对象 (PageContextImpl 类),当前 jsp 页面范围内有效

request

​请求对象 (HttpServletRequest 类),一次请求有效

session

​会话对象(HttpSession 类),一个会话范围内有效,即打开浏览器访问服务器,直到关闭浏览器

application

​Servlet 上下文对象(ServletContext 类),整个 Web 工程范围内都有效,即 Web 工程不停止,数据一直存在

out 和 .getWriter 输出的区别

response 中表示响应,我们经常用于设置返回给客户端的内容(输出),而 out 也是给客户端输出使用的。

由于 jsp 翻译后,底层源码都是使用 out 输出,所以一般情况下,我们在 jsp 页面中也统一使用 out 来进行输出,避免打乱页面输出顺序。

out.write() 输出字符串没问题

out.print() 输出任意输出都没问题(本质上都是将对象转化为字符串后调用 write() 进行输出)

所以建议在 jsp 页面中,我们统一使用 out.print() 来进行输出

jsp 中常用的标签

静态包含

标签格式

1
<%@ include file="/include/xxx.jsp" %>

file 属性指定你需要包含的 jsp 页面资源的路径

地址中的 “/“ 第一个单斜杆表示为 http://ip:port/工程路径 ,映射到工程的 web 文件夹

特点

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

动态包含

标签格式

1
<jsp:include page="/include/xxx.jsp"></jsp:include>

page 属性指定你需要包含的 jsp 页面资源的路径

动态包含也可以像静态包含一样,将包含的内容执行输出到包含位置

特点

  1. 动态包含会把包含的 jsp 页面也翻译成 java 代码

  2. 动态包含底层代码使用如下去调用被包含的 jsp 页面进行执行输出:

    JspRuntimeLibrary.include(request, response, "/include/xxx.jsp", out, false);

  3. 动态包含内容,可以传递参数:

    1
    2
    3
    4
    <jsp:include page="/include/xxx.jsp">
    <jsp:param name="username" value="admin" />
    <jsp:param name="password" value="9527" />
    </jsp:include>

    通过 request.getParameter("key") 来获取 key 对应的 value 值

请求转发

标签格式

1
<jsp:forward page="/include/xxx.jsp"></jsp:forward>

在 jsp 中可以通过上标签替换 java 源代码中的:

1
request.getRequestDispatcher("/include/xxx.jsp").forward(request, response);