zl程序教程

您现在的位置是:首页 >  后端

当前栏目

一文学懂JSP

JSP 文学
2023-09-27 14:19:46 时间

一文学懂JSP

🏠个人主页:不会写代码的满满
🧑个人简介:大家好,我是满满,一个想要与大家共同进步的男人😉😉
目前状况🎉:开学即将大三,目标就是半年内找到一份实习工作👏👏
💕欢迎大家:这里是CSDN,我总结知识的地方,欢迎来到我的博客,我亲爱的大佬😘

正文开始 ----------

在这里插入图片描述

第1章 为什么要学习JSP

1.1 现有技术不足

Servlet可以通过转发或重定向跳转到某个HTML文档。但HTML文档中的内容不受Servlet的控制。比如登录失败时,跳转回登录表单页面无法显示诸如“用户名或密码不正确”的错误消息,所以我们目前采用的办法是跳转到一个错误信息页面。如果通过Servlet逐行输出响应信息则会非常繁琐。

Servlet输入html页面的程序代码:

package com.manman.web;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.io.Writer;

/**
 * @author Gaoziman
 * @version 1.0
 * description:
 * @date 2022/8/23 19:27
 */
@WebServlet("/hello")
public class HelloServlet extends HttpServlet {

    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        // 设置返回的数据内容的数据类型和编码
        response.setContentType("text/html; charset=utf-8");
        // 获取字符输出流
        Writer writer = response.getWriter();
        //输出页面内容!
        writer.write("<!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">");
        writer.write("<html>");
        writer.write("<head>");
        writer.write("<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">");
        writer.write("<title>Insert title here</title>");
        writer.write("</head>");
        writer.write("<body>");
        writer.write("这是由Servlet程序输出的html页面内容!");
        writer.write("</body></html>");
    }
}

接着,在浏览器中输入访问Servlet的访问路径得到以下结果:

image-20220823193538516

上面的代码我们不难发现。通过Servlet输出简单的html页面信息都非常不方便。那我们要输出一个复杂页面的时候,就更加的困难,而且不利于页面的维护和调试。

1.2 Servlet与HTML

ServletHTML
长处接收请求参数,访问域对象,转发页面以友好方式显示数据
短处以友好方式显示数据动态显示数据

1.3 总结

那能否将Servlet和HTML二者的长处结合起来呢?

能!sun公司推出一种叫做JSP的动态页面技术帮助我们实现对页面输出繁锁工作。

第2章 JSP简介

2.1 JSP全称

  • JSP全称Java Server Pages,顾名思义就是运行在java服务器中的页面。由Sun 公司专门为了解决动态生成HTML文档的技术,也就是在我们JavaWeb中的动态页面。
  • JSP能够以HTML页面的方式呈现数据,是一个可以嵌入Java代码的HTML。
  • JSP其本质就是一个Servlet。Servlet能做的事情 JSP 都能做。
  • JSP必须运行在服务器中,不能直接使用浏览器打开。
  • JSP是Web网页的技术标准,主要语法组成包括:指令,html模板元素,脚本片段(小脚本),表达式,声明,注释,后缀是*.JSP。
  • JSP的主要作用是代替Servlet程序回传HTML页面的数据
  • web目录(或其他)右击 --> new --> JSP/JSPX --> 输入文件名 --> 选择JSP file创建

2.2 JSP与HTML的区别

  • JSP是动态页面,html是静态页面。

    动态页面静态页面
    运行原理通过服务器解析后,将数据在浏览器中显示直接在浏览器中解析运行
    维护成本较低,可以修改后台数据,进而影响页面中的数据较高,必须将修改后的页面覆盖原页面
    数据库可以连接数据库不可连接数据库
    访问速度较慢较快
    书写代码可以书写java代码不能书写java代码

2.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 负责显示。

2.4 JSP基本格式

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>JSP页面</title>
</head>
<body>
	这是我的第一个JSP页面。
</body>
</html>

2.5 JSP的本质

JSP页面本质上是一个Servlet程序,第一次访问JSP页面时(运行Tomcat服务器后在浏览器地址栏输入路径),Tomcat服务器会将此JSP页面翻译成为一个Java源文件,并对其进行编译成为.class字节码文件(一个.java,一个.class),当打开.java文件时发现其中的内容是:

而HttpJspBase类直接继承于HttpServlet类,即JSP翻译出来的Java类间接继承于HttpServlet类,证明JSP页面是一个Servlet程序

第3章 JSP初体验

3.1 创建一个JSP动态页面程序:HelloWorld

① 选中Web目录,右键创建一个jsp文件

image-20220823194648212

②在body标签中添加你想要显示的文本内容

image-20220823195139844

③然后在浏览器中输入jsp页面的访问地址

  • jsp页面的访问地址和html页面的访问路径一样http://ip:端口号/工程名/文件名。也就是https://localhost:8080/day07/demo.jsp

image-20220823193538516

注意事项:

1、jsp 页面是一个类似于 html 的一个页面。 jsp直接存放到 web目录下,和html一样访问 jsp 的时候,也和访问html一样

2、jsp 的默认编码集是 ISO-8859-1,修改 jsp 的默认编码为UTF-8

3.2 JSP运行原理

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

    • 实际上Tomcat在运行JSP时,并不是直接显示的我们所编写的JSP页面,而是将JSP页面转换成了一个Java类,这个Java类是什么,我想大家也能猜到了,它实际上就是一个Servlet。
  • 这个Servlet在哪呢?在Tomcat目录中work目录中,在那个目录下保存着 Tomcat自动生成的一些内容,下面让我们来找到那个目录。

  • 在work目录下的…work\Catalina\localhost\day07_jsp\org\apache\jsp文件夹中我们可以发现两个文件index_jsp.java和index_jsp.class,前者就是Tomcat自动生成的Servlet的源码,后者是编译后的.class文件。

    1558366745836

打开index_jsp.java文件部分内容如下:

  • 图一:

    image-20220823200206048

    我们打开index_jsp.java文件查看里面的内容:发现,生成的类继承于HttpJspBase类。这是一个jsp文件生成Servlet程序要继承的基类!于是,我们关联源代码。去查看一下HttpJspBase类的内容。从源码的类注释说明中,我们发现。HttpJspBase这个类就是所有JSP文件生成Servlet程序需要去继承的基类。并且这个HttpJspBase类继承于HttpServlet类。我们访问JSP时服务器就是调用了该Servlet来响应请求。所以JSP也是一个Servlet小程序。

    1558367072400

    我们分别在工程的WebContent目录下创建多个jsp文件。然后依次访问。它们都被翻译为.java文件并编译成为.class字节码文件。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-A9HeCUmf-1661441820762)(https://gaoziman.oss-cn-hangzhou.aliyuncs.com/img/JSP%E5%8E%9F%E7%90%86.png)]

  • 我们顺着代码向下看,会发现_jspService()方法。会发现有九个对象(实际上默认会看到八个),这是后面要讲到的重点。

    • 图二:

      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sG1Eo9Ro-1661441820763)(https://gaoziman.oss-cn-hangzhou.aliyuncs.com/img/jsp%E7%BF%BB%E8%AF%91servlet%E5%90%8E%E9%83%A8%E5%88%86%E6%BA%90%E7%A0%812.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方法中原样输出。

1558023396492

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文件
    • 如果文件未改变,不会被翻译和编译
    • 如果文件改变,会翻译和编译

第4章 JSP基本语法

JSP头部的page指令:

JSP头部的page指令可以修改JSP页面中的一些重要属性或行为
(以下属性均写在page指令中,默认page指令中没有出现的属性都采用默认值):

(1) contentType属性:表示JSP返回的数据类型是什么,即response.setContentType()的参数值
(2) language属性:表示JSP翻译之后是什么语言文件(目前只支持Java)
(3) pageEncoding属性:表示当前JSP文件本身的字符集(可在IDEA右下角看到)
(4) import属性:表示导包(导类),与Java一致
(5) autoFlush属性:设置当out输出流缓冲区满了之后是否自动刷新缓冲区,默认值是true
(6) buffer属性:设置out缓冲区的大小,默认是8kb
注意:out缓冲区满了之后不能自动刷新的话会报错
(7) errorPage属性:设置当JSP页面运行出错时自动跳转到的页面(错误信息页面)的路径,这个 路径一般都是以斜杠打头,表示请求的地址是http://ip:port/工程路径/,对应代码web目录
(8) isErrorPage属性:设置当前JSP页面是否是错误信息页面,默认是false,如果是true可以 获取错误信息
(9) session属性:设置访问当前JSP页面时是否会创建HttpSession对象,默认值是true
(10) extends属性:设置JSP页面翻译出来的Java类默认继承谁

注意:以上默认值除非有特殊需要,否则不建议修改

4.1指令

  • 语法格式:<%@ %>

  • 实例

    <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    
  • 三大指令:

    <%@ page %> ,<%@ include %> ,| <%@ taglib %> 
    

4.2模板元素

  • html&css& js &jQuery 等…

4.3代码脚本片段(重点)

  • 格式 :<%%>

  • 作用:在_jspService()方法中,书写java代码。

  • 实例

    <% int i = 0;%>
    <%-- <% 第一种方式声明%> --%>
    <%
      for (int i = 1; i <= 10; i++) {
        System.out.println(i);
      }
      String name = "张三";
    %>
    

4.4表达式(重点)

  • 格式:<%=表达式 %>
  • 作用:在浏览器的JSP页面上输出数据(只有此脚本可以在浏览器的页面上输出数据)
  • 特点:
    (1) 所有的表达式脚本都会被翻译到对应的Java类的 _ jspService()方法中,故表达式脚本可以 直接使用 _jspService() 方法参数中的对象
    (2) 表达式脚本都会被编译后的Java类中的 out.print() 方法输出到浏览器页面上
    (3) 表达式脚本中的表达式不能以分号结束

代码演示:表达式脚本的使用(此JSP文件在web目录下,名为First.jsp)

<%=22 %> <br/>
<%="可以输出字符串" %> <br/>
<%=map %> <br/>
<%--使用_jspService方法中的对象--%>
<%=request.getParameter("username") %>

4.5声明(了解)

  • 格式:<%! 声明Java代码 %>

  • 作用:可以给JSP翻译出来的Java类定义属性、方法、静态代码块、内部类等

  • 特点:不会在浏览器的页面上显示出来,仅存在于翻译后的Java类中

    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <%@ page import="java.util.HashMap" %>
    <%@ page import="java.util.Map" %>
    <html>
    <head>
        <title>Title</title>
    </head>
    <body>
        <%--1.声明类属性--%>
        <%!
            private String name;
            private static Map<String, Object> map;
        %>
        <%--2.声明类方法--%>
        <%!
            public int sum() {
                return 12;
            }
        %>
        <%--3.声明静态代码块--%>
        <%!
            static {
                map = new HashMap<String, Object>();
                map.put("key1", "value1");
            }
        %>
    </body>
    </html>
    

4.6注释:Jsp支持三种注释

  • java:单行注释://,多行注释:/**/
  • html:
  • jsp:<%-- --%>
  • jsp中三种注释的比较,如下所示:
JSP注释Java注释HTML注释
JSP页面可见可见可见
Java代码不可见可见可见
浏览器不可见不可见可见

第5章 JSP常用指令

5.1 语法格式

<%@ 指令名 属性=属性值 属性2=属性值2 … %>

5.2 Jsp常用指令

5.2.1 page指令

  • 语法

    <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    
  • 属性

    • language:语言,值为 java 且仅 java
    • contentType:与response.setContentType()作用一致,设置浏览器字符集。
    • pageEncoding:设置Jsp页面的编码字符集。
    • import:导包
    • isErrorPage:设置当前页面是否为错误页面,默认值"false"。
      • ​ true:设置当前页面为错误页面,可以使用exception内置对象,捕获异常 。
      • ​ false:设置当前页面不是错误页面,不可以使用exception内置对象,捕获异常 。
    • errorPage:设置当前页面错误时的跳转目标页面。错误需要在_jspService()中才可以捕获。

5.2.2 include指令:静态包含

  • 语法

    <%@include file="被包含文件的路径" %> 	
    
  • 作用:将目标文件包含到当前文件中。

  • 特点:被包含的文件不会被翻译&编译。(先包含,再翻译)

5.2.3 静态包含和动态包含

静态包含

(1)使用场景:

(2)使用方法:
<%@include file=“”%>
其中file属性设置要包含的JSP页面,以/打头,代表http://ip:port/工程路径/,对应web目录

代码演示1:在web目录下创建body.jsp

<body>
    头部信息 <br>
    主体信息 <br>
    <%@include file="/foot.jsp"%>
</body>

代码演示2:在web目录下创建foot.jsp

<body>
    页脚信息 <br>
</body>

(3)静态包含的特点:

① 静态包含不会将被包含的JSP页面翻译成.java.class文件
② 静态包含是把被包含的页面的代码拷贝到body.jsp对应的Java文件的对应位置执行输出

动态包含

(1)使用方法:

<jsp:include page=””></jsp:include>
其中page属性设置要包含的JSP页面,与静态包含一致

(2)动态包含的特点:
①动态包含将被包含的JSP页面翻译成.java.class文件
②动态包含还可以传递参数
③动态包含底层使用如下代码调用被包含的JSP页面执行输出:
org.apache.jasper.runtime.JspRuntimeLibrary.include(request, response, “/foot.jsp”, out, false);

代码演示1:在web目录下创建body.jsp

<body>
    头部信息 <br>
    主体信息 <br>
    <jsp:include page="/foot.jsp">
        <jsp:param name="username" value="Jaychou"/>
        <jsp:param name="password" value="root"/>
    </jsp:include>
</body>

注意:

设置参数的标签要写在动态包含之中
出现Expecting “jsp:param” standard action with “name” and “value” attributes异常,两个原因:
①动态包含中未设置参数但没有把<jsp:include page=””></jsp:include>放在一行上
②动态包含中加了注释

代码演示2:在web目录下创建 foot.jsp

<body>
    页脚信息 <br>
    <%=request.getParameter("username")%>
</body>

运行结果:

image-20220823203947439

(3)动态包含的底层原理:

image-20220823204008104

5.2.4 taglib指令(略)

  • 语法

    <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> 
    
  • 属性

    • prefix用来指定前缀名,我们通过该名来使用JSTL。
    • uri相当于库的唯一标识,因为JSTL由多个不同的库组成,使用该属性指定要导入哪个库。
  • 作用:引入标签库。

第六章 Jsp常用动作标签

6.1 概述

  • JSP动作标签与HTML标签不同,HTML标签由浏览器来解析,而JSP动作标签需要服务器(Tomcat)来运行。

6.2 常用的JSP动作标签

6.2.1 转发动作标签

  • 语法:<jsp:forward></jsp:forward>

  • 作用:在页面中用于转发操作

  • 实例

    <jsp:forward page="target.jsp"></jsp:forward>
    
  • 转发子标签

    • 语法:<jsp:param value=“paramValue” name=“paramName”/>

    • 作用:在转发时设置请求参数,通过request.getParameter()在目标页面获取请求参数。

    • 实例

      <jsp:forward page="target.jsp">
      	<jsp:param value="paramValue" name="paramName"/>
      </jsp:forward>
      
    • 注意:如果转发动作标签不需要设置请求参数,该标签开始与结束标签内部,不允许书写任何内容,(包括空格)

6.2.2 动态包含动作标签

  • 语法:<jsp:include page=“target.jsp”>

  • 作用:动态包含,将其他页面包含到当前页面中。

  • 实例

    <jsp:include page="target.jsp"></jsp:include>
    
  • 特点:被包含的文件同时会被翻译&编译。(先翻译,再包含)

    • 本质原理:当使用动态包含时,Tomcat会在生成的Servlet中加入如下代码:

      org.apache.jasper.runtime.JspRuntimeLibrary.include(request, response, "target.jsp", out, false);
      

6.3 动态包含与静态包含的区别

@include指令jsp:include标签
特点静态包含动态包含
语法的基本形式<%@ include file=”…”%><jsp:include page=”…”/>
包含动作发生的时机翻译期间请求期间
是否生成java文件不生成生成
合并方式代码复制合并运行结果
包含的内容文件实际内容页面输出结果
代码冲突有可能不可能
编译次数1包含的文件 + 1
适用范围适用包含纯静态内容(CSS,HTML,JS),或没有非常耗时操作。或少量java代码的jsp包含需要传递参数。含有大量java代码,运算,耗时很长的操作。

第6章 JSP常用动作标签

6.1 概述

  • JSP动作标签与HTML标签不同,HTML标签由浏览器来解析,而JSP动作标签需要服务器(Tomcat)来运行。

6.2 常用的JSP动作标签

6.2.1 转发动作标签

  • 语法:<jsp:forward></jsp:forward>

  • 作用:在页面中用于转发操作

  • 实例

    <jsp:forward page="target.jsp"></jsp:forward>
    
  • 转发子标签

    • 语法:<jsp:param value=“paramValue” name=“paramName”/>

    • 作用:在转发时设置请求参数,通过request.getParameter()在目标页面获取请求参数。

    • 实例

      <jsp:forward page="target.jsp">
      	<jsp:param value="paramValue" name="paramName"/>
      </jsp:forward>
      
    • 注意:如果转发动作标签不需要设置请求参数,该标签开始与结束标签内部,不允许书写任何内容,(包括空格)

6.2.2 动态包含动作标签

  • 语法:<jsp:include page=“target.jsp”>

  • 作用:动态包含,将其他页面包含到当前页面中。

  • 实例

    <jsp:include page="target.jsp"></jsp:include>
    
  • 特点:被包含的文件同时会被翻译&编译。(先翻译,再包含)

    • 本质原理:当使用动态包含时,Tomcat会在生成的Servlet中加入如下代码:

      org.apache.jasper.runtime.JspRuntimeLibrary.include(request, response, "target.jsp", out, false);
      

6.3 动态包含与静态包含的区别

@include指令jsp:include标签
特点静态包含动态包含
语法的基本形式<%@ include file=”…”%><jsp:include page=”…”/>
包含动作发生的时机翻译期间请求期间
是否生成java文件不生成生成
合并方式代码复制合并运行结果
包含的内容文件实际内容页面输出结果
代码冲突有可能不可能
编译次数1包含的文件 + 1
适用范围适用包含纯静态内容(CSS,HTML,JS),或没有非常耗时操作。或少量java代码的jsp包含需要传递参数。含有大量java代码,运算,耗时很长的操作。

第7章 JSP九大隐式对象

7.1 概述

Jsp共有九大隐式对象,也叫隐含对象或内置对象。JSP隐式对象是JSP容器为每个页面提供的Java对象,开发者可以直接使用它们而不用显式声明。JSP隐式对象也被称为预定义变量。

7.2 对象详情

7.2.1 pageContext

  • 类型:PageContext
  • 定义:代表页面域对象,用来代表整个JSP页面。
  • 作用:
    1. 页面域对象,具体详见:下方四大域对象。
    2. 九大隐式对象的“大哥”,可以直接调用其他八大隐式对象。
  • 在Servlet中获取方式:无。

7.2.2 request

  • 类型:HttpServletRequest

  • 定义:代表浏览器向服务器发送的请求报文,该对象由服务器创建,最终以参数的形式发送到doGet()和doPost()方法中。

    每当客户端请求一个JSP页面时,JSP引擎就会制造一个新的request对象来代表这个请求。request对象提供了一系列方法来获取HTTP头信息,cookies,HTTP方法等等。

  • 作用(详见Servlet中request对象)

    1. 获取请求参数
    2. 获取url地址参数
    3. 请求转发
    4. 向请求域中保存数据(获取数据&移除数据)
    5. 获取请求头信息
  • 在Servlet中获取方式:doGet()或doPost()中直接使用。

7.2.3 session

  • 类型:HttpSession

  • 定义:代表浏览器与服务器之间的会话。

  • 作用

    • 会话域对象,具体详见:下方四大域对象。

    session对象用来跟踪在各个客户端请求间的会话。

  • 在Servlet中获取方式 :request.getSession();

7.2.4 application

  • 类型:ServletContext

  • 定义:Servlet上下文,代表当前web应用。

    Web容器在启动时,它会为每个Web应用程序都创建一个唯一对应的ServletContext对象,意思是Servlet上下文,代表当前Web应用。

  • 作用

    1. 获取项目的上下文路径(带/的项目名):getContextPath()

    2. 获取虚拟路径所映射的本地真实路径:getRealPath(String path)

    3. 获取WEB应用程序的全局初始化参数(基本不用)

      • 设置Web应用初始化参数的方式是在web.xml的根标签下加入如下代码

        <web-app>
        	<!-- Web应用初始化参数 -->
        	<context-param>
        		<param-name>ParamName</param-name>
        		<param-value>ParamValue</param-value>
        	</context-param>
        </web-app>
        
      • 获取Web应用初始化参数

        @Override
        public void init(ServletConfig config) throws ServletException {
        	//1.获取ServletContext对象
        	ServletContext application = config.getServletContext();
        	//2.获取Web应用初始化参数
        	String paramValue = application.getInitParameter("ParamName");
        	System.out.println("全局初始化参数paramValue="+paramValue);
        }
        
    4. 作为域对象共享数据:具体详见:下方四大域对象。

  • 在Servlet中获取方式:使用this.getServletContext()方法获取。

7.2.5 page

  • 类型:Object
  • 作用:this,当前类对象。

7.2.6 response

  • 类型:HttpServletResponse
  • 定义:代表服务器向浏览器发送的响应报文,该对象由服务器创建,最终以参数的形式发送到doGet()和doPost()方法中。
  • 作用:
    1. 向页面(响应体)中响应数据,数据包括文本、Html等。
    2. 重定向
    3. 设置响应头信息
  • 在Servlet中获取方式:doGet()或doPost()中直接使用

7.2.7 config

  • 类型:ServletConfig
  • 定义:代表当前Servlet的配置信息,每一个Servlet都有一个唯一对应的ServletConfig对象。
  • 作用:
    1. 获取Servlet名称:getServletName()
    2. 获取全局上下文ServletContext对象:getServletContext()
    3. 获取Servlet初始化参数:getInitParameter(String) / getInitParameterNames()。
  • 在Servlet中获取方式:this.getServletConfig()

7.2.8 out

  • 类型:JspWriter
  • 定义:代表当前页面的输出流。
  • 作用:与Servlet中的PrintWriter功能类似,将数据响应到页面,响应的数据可以是页面、页面片段、字符串等。
  • 在Servlet中获取方式:无

7.2.9 exception

  • 类型:Throwable
  • 定义:代表当前页面的异常对象。
  • 作用:代表当前页面的异常对象。
  • 在Servlet中获取方式:new Throwable()

九大内置对象,都是我们可以在【代码脚本】中或【表达式脚本】中直接使用的对象。

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

第8章 JSP四大域对象

8.1 域对象概述

​ 生活中使用“域对象”比较经典的行业,是快递行业。现如今快递行业大体分为,全球快递,全国快递,同城快递和同区快递。需求不同,使用不同“域对象”。

​ 如:外卖一般使用同区快递,给北京朝阳区的朋友邮寄贺卡,一般使用同城快递。在某宝某东上购买外地商品,一般使用全国快递或全球快递。

8.2 程序中的域对象

8.2.1 域对象概述

程序中的域对象,主要负责在不同web资源之间进行数据交换,(如:servlet和jsp之间的数据交换)。由于不同的web资源之间需要共享数据,所以就有了域对象。

在Jsp中一共有四个域对象,分别是pageContext 、request、session、application。主要作用是能够在一定范围内共享数据。

8.2.2 域对象分析

每个域对象内部都维护了一个Map<String , Object>,域对象的共同方法。

  • 设置属性到域中:void setAttribute(String key , Object value);
  • 从域中获取指定的属性:Object getAttribute(String key);
  • 移除域中指定属性:void removeAttribute(String key);

8.2.3 域对象有效性

  • pageContext: 当前页面中共享数据有效,离开当前页面失效。
    • 每个页面都有自己唯一的一个pageContext对象。
    • 注意servlet中没有该对象。
  • request: 当前请求中共享数据有效。
    • 当前请求:转发、直接访问一个页面为当前请求。
    • 不在当前请求:重定向、 打开页面再点击页面中的超链接不在当前请求 。
  • session: 一次会话范围中共享数据有效。
    • 当前会话:当前浏览器不关闭&不更换浏览器即为当前会话。
    • 只关心浏览器是否关闭,不关心服务器关闭重启。
    • 不同浏览器不共享会话。
  • application: 在服务器运行的一次过程中共享数据有效。
    • 服务器关闭销毁

小结

域对象作用范围起始时间结束时间
pageContext当前JSP页面页面加载离开页面
request同一个请求收到请求响应
session同一个会话开始会话结束会话
application当前Web应用Web应用加载Web应用卸载

8.2.4 四个作用域的测试代码:

  • 新建两个jsp页面。分别取名叫:context1.jsp,context2.jsp

    • context1.jsp的页面代码如下:

      <%@ page language="java" contentType="text/html; charset=UTF-8"
          pageEncoding="UTF-8"%>
      <!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=UTF-8">
      <title>Insert title here</title>
      </head>
      <body>
      	这是context1页面<br/>
      	<%
      		//设置page域的数据
      		pageContext.setAttribute("key", "pageContext-value");
      		//设置request域的数据
      		request.setAttribute("key", "request-value");
      		//设置session域的数据
      		session.setAttribute("key", "session-value");
      		//设置application域的数据
      		application.setAttribute("key", "application-value");
      	%>
      	<%-- 测试当前页面作用域 --%>
      	<%=pageContext.getAttribute("key") %><br/>
      	<%=request.getAttribute("key") %><br/>
      	<%=session.getAttribute("key") %><br/>
      	<%=application.getAttribute("key") %><br/>
      	<%	
      		// 测试request作用域
      // 		request.getRequestDispatcher("/context2.jsp").forward(request, response);
      	%>
      </body>
      </html>
      
    • context2.jsp的页面代码如下:

      <%@ page language="java" contentType="text/html; charset=UTF-8"
          pageEncoding="UTF-8"%>
      <!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=UTF-8">
      <title>Insert title here</title>
      </head>
      <body>
      	这是context2页面 <br/>
      	<%=pageContext.getAttribute("key") %><br/>
      	<%=request.getAttribute("key") %><br/>
      	<%=session.getAttribute("key") %><br/>
      	<%=application.getAttribute("key") %><br/>
      </body>
      </html>
      
    • 测试操作:

      测试pageContext作用域步骤:
      直接访问context1.jsp文件
      
      
      测试request作用域步骤:
      1.在context1.jsp文件中添加转发到context2.jsp(有数据)
      2.直接访问context2.jsp文件 (没有数据)
      
      
      测试session作用域步骤:
      1.访问完context1.jsp文件
      2.关闭浏览器。但是要保持服务器一直开着
      3.打开浏览器,直接访问context2.jsp文件
      
      
      测试application作用域步骤:
      1.访问完context1.jsp文件,然后关闭浏览器
      2.停止服务器。再启动服务器。
      3.打开浏览器访问context2.jsp文件