JSP技术
在动态网页开发中,经常需要动态生成HTML内容,例如,一篇新闻报道的浏览次数需要动态生成。如果使用Servlet实现HTML页面数据的
统计,需要调用大量的Servlet输出语句,使静态内容和动态内容混合在一起,导致程序非常臃肿。为了克服Servlet的这些缺点,Oracle
(Sun)公司推出了JSP技术。本章将围绕JSP技术进行详细讲解。
1. JSP概述
JSP全名是Java Server Pages,即Java服务器页面。它是Servlet更高级别的扩展。在JSP文件中,HTML代码与Java代码共同存在,其中,
HTML代码用来实现网页中静态内容的显示,Java代码用来实现网页中动态内容的显示。最终,JSP文件会通过Web服务器的Web容器编译成一
个Servlet,用来处理各种请求。
由于JSP是基于Java语言的,使用JSP开发的Web应用是跨平台的,可以应用于不同的系统中,如Windows、Linux等。当从一个平台移植到
另一个平台时,JSP和JavaBean的代码并不需要重新编译,这是因为Java的字节码是与平台无关的,这也符合了Java语言“一次编译,到处运行”
的特点。
在使用JSP技术开发Web应用时,可以将界面的开发与应用程序的开发分离开。开发人员使用HTML设计界面,使用JSP标签和脚本动态生成页
面上的内容。在服务器端,JSP容器负责解析JSP标签和脚本程序,生成所请求的内容,并将执行结果以HTML页面的形式返回给浏览器。
JSP中可以使用JavaBean编写业务组件,也就是使用一个JavaBean封装业务处理代码或者作为一个数据存储模型,在JSP页面中,甚至在整
个项目中,都可以重复使用这个JavaBean,同时,JavaBean也可以应用到其他Java应用程序中。
预编译就是在用户第一次通过浏览器访问JSP页面时,服务器将对JSP页面代码进行编译,并且仅执行一次编译。编译好的代码将被保存,
在用户下一次访问时,会直接执行编译好的代码。这样不仅节约了服务器的CPU资源,还大大提升了客户端的访问速度。
创建一个jsp文件
<%--
Created by IntelliJ IDEA.
User: maomao
Date: 2022/3/22
Time: 10:18
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title> </title>
</head>
<body>
Hello JSP
</body>
</html>
注意:新创建的JSP文件与传统的HTML文件几乎没有什么区别,唯一的区别是默认创建时,页面代码最上方多了一条page指令,并且该文件的后缀名是jsp,而不是html。Demo.jsp的标签中添加的内容已被显示出来,这说明HTML元素可以被JSP容器解析。实际上,JSP只是在原有的HTML文件中加入了一些具有Java特点的代码,这些称为JSP的语法元素。
访问:localhost:8080/ServletDemo01_war_exploded/jsp/Demo.jsp
1. JSP运行原理
JSP的工作模式是请求/响应模式,客户端首先发出HTTP请求,JSP程序收到请求后进行处理并返回处理结果。一个JSP文件第一次被请求
时,JSP容器把该JSP文件转换成为一个Servlet,而这个容器本身也是一个Servlet。
第一步: 客户端发出请求,请求访问JSP文件。
第二步:JSP容器先将JSP文件转换成一个Java源文件(Java Servlet源程序),在转换过程中,如果发现JSP文件中存在任何语法错误,
则中断转换过程,并向服务端和客户端返回出错信息。
第三步:如果转换成功,则JSP容器将生成的Java源文件编译成相应的字节码文件*.class。该class文件就是一个Servlet,Servlet容器
会像处理其他Servlet一样来处理它。
第四步:由Servlet容器加载转换后的Servlet类(.class文件)创建一个该Servlet(JSP页面的转换结果)的实例,并执行Servlet的
第五步:jspInit()方法完成初始化。jspInit()方法在Servlet的整个生命周期中只会执行一次。
第六步:JSP容器执行jspService()方法处理客户端的请求。对于每一个请求,JSP容器都会创建一个新的线程来处理它。如果多个客户端
同时请求该JSP文件,则JSP容器会创建多个线程,使得每一个客户端请求都对应一个线程。JSP运行过程中采用的这种多线程的执行方式
可以极大地降低对系统资源的消耗,提高系统的并发量并缩短响应时间。需要注意的是,由于第 4 步生成的Servlet实例是常驻内存的,所以
响应速度非常快。
第七步:如果JSP文件被修改了,则服务器将根据新的设置决定是否对该文件进行重新编译。如果需要重新编译,则使用重新编译后的结果
取代内存中常驻的Servlet实例,并继续上述处理过程。
第八步:虽然JSP效率很高,但在第一次调用的时候往往由于需要转换和编译,会产生一些轻微的延迟。此外,由于系统资源不足等原因,
JSP容器可能会以某种不确定的方式将Servlet实例从内存中移除,发生这种情况时,JSP容器首先会调用jspDestroy()方法,然后Servlet实例
会被加入“垃圾收集”处理。当请求处理完成后,响应对象由JSP容器接收,并将HTML格式的响应信息发送回客户端。
了解了JSP的运行原理后,完全可以利用其中的一些步骤来做一些工作,例如,可以在jspInit()中进行一些初始化工作(建立数据库的连
接、建立网络连接、从配置文件中获取一些参数等),可以在jspDestroy()中释放相应的资源等。
2. JSP基本语法
一个JSP页面可以包括指令标识、HTML代码、JavaScript代码、嵌入的Java代码、注释和JSP动作标识等内容。
JSP的脚本元素
JSP脚本元素是指嵌套在“<%”和“%>”之中的一条或多条Java程序代码。通过JSP脚本元素可以将Java代码嵌入HTML页面中,所有可执行的
Java代码,都可以通过JSP脚本执行。
JSP脚本元素主要包含如下三种类型:
(1)JSP Scriptlets 。
(2)声明标识 。
(3)JSP表达式。
JSP Scriptlets
JSP Scriptlets 是一段代码片段。所谓代码片段,就是在JSP页面中嵌入的Java代码或脚本代码。代码片段将在页面请求的处理期间被执
行,通过Java代码可以定义变量或流程控制语句等;而脚本代码可以应用JSP的内置对象在页面输出内容、处理请求和访问session会话等。JSP
Scriptlets的语法格式如下所示:
<% java 代码(变量、方法、表达式等)%>
声明标识
在JSP Scriptlets中可以进行属性的定义,也可以输出内容,但是它不可以进行方法的定义。如果想在脚本元素中定义方法,可以使用声
明标识。声明标识用于在JSP页面中定义全局变量或方法,它以“<%!”开始,以“%>”结束。通过声明标识定义的变量和方法可以被整个JSP页面访
问,所以通常使用该标识定义整个JSP页面需要引用的变量或方法。声明标识的语法格式如下所示:
<%! 定义变量或方法等 %>
在JSP声明语句中定义的都是成员方法、成员变量、静态方法、静态变量、静态代码块等。
在JSP声明语句中声明的方法在整个JSP页面内有效,但是在方法内定义的变量只在该方法内有效。当声明的方法被调用时,会为方法内定
义的变量分配内存,而调用结束后立刻会释放所占的内存。
注意:在一个JSP页面中可以有多个JSP声明标识,单个声明中的Java语句可以是不完整的,但是多个声明组合后的结果必须是完整的Java
语句。
<%--
Created by IntelliJ IDEA.
User: maomao
Date: 2022/3/22
Time: 10:34
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ page import="java.util.Date" %>
<%@ page import="java.text.SimpleDateFormat" %>
<html>
<head>
<title>JSP--显示时间</title>
</head>
<body>
<%
Date date = new Date();
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String format = simpleDateFormat.format(date);
%>
当前时间:<%=format %>
</body>
</html>
案例:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%
int a = 10;
int b = 30;
%>
a: <%=a %> <br>
b: <%=b %>
</body>
</html>
案例:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title> 撒地方 </title>
</head>
<body>
<%!
public String print(){
System.out.println("打印内容");
return "打印内容";
}
%>
<%=print() %>
</body>
</html>
需要注意的是,“<%!”和“%>”里面定义的属性是成员属性,相当于类的属性,方法相当于是全局的方法,也相当于是类里面的方法,但是在
“<%!”和“%>”里面是不可以进行输出的,只能在里面进行方法的定义和属性的定义。总之,“<%!”和“%>”是用来定义属性和方法的,“<%”和“%>”
主要是用来输出内容的,因此如果涉及到了成员变量的操作,那么就应该使用<%!和%>,而如果是涉及到了输出内容的时候,就使用<%和%>。
注意:通过声明标识创建的变量和方法在当前JSP页面中有效,它的生命周期是从创建开始到服务器结束;代码片段创建的变量或方法,也
是在当前JSP页面有效,但它的生命周期是页面关闭后就会被销毁。
JSP表达式
JSP表达式(expression)用于向页面输出信息,它以“<%=”开始,以“%>”结束,其基本的语法格式如下所示:
<%= expression %>
上述语法格式中,参数expression可以是任何Java语言的完整表达式,该表达式的最终运算结果将被转换成一个字符串。
注意:“<%=”是一个完整的符号,“<%”和“=”之间不能有空格,且JSP表达式中的变量或表达式后面不能有分号(;)。
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%
int a = 1, b = 4;
%>
<%=a+b %>
</body>
</html>
JSP注释
带有JSP表达式的注释—单行注释
在JSP页面中可以嵌入代码片段,在代码片段中也可以加入注释。代码片段中的注释同Java的注释相同,其中单行注释以“//”开头,后面接注释内容,其语法格式如下: //注释内容
带有JSP表达式的注释—多行注释
多行注释以“/*”开头,以“*/”结束。在这个标识中间的内容为注释内容,并且注释内容可以换行。其语法格式如下:
/*
注释内容1
注释内容2
......
*/
带有JSP表达式的注释—提示文档注释
提示文档注释在被Javadoc文档工具生成文档时读取,文档是对代码结构和功能的描述。其语法格式如下:
/**
提示信息1
提示信息2
......
*/
隐藏注释
在文档中添加的HTML注释虽然在浏览器页面中不显示,但是可以通过查看源代码的方式看到这些注释信息。所以严格来说,这些注释是不安
全的。为此,JSP提供了隐藏注释,隐藏注释不仅在浏览器页面中看不到,在查看HTML源代码时也看不到,所以隐藏注释有着较高的安全性。隐
藏注释的语法格式如下:
<%-- 注释内容 --%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<% // 单行注释 %>
<% /*
多行注释
*/
%>
<% /**
文档注释
*/
%>
<!-- html注释 -->
<%-- 隐藏注释 --%>
</body>
</html>
JSP表达式
注意:在上图中,网页源代码只显示出了HTML注释,而没有显示JSP的注释信息。这是因为Tomcat编译JSP文件时,会将HTML注释当成普通
文本发送到客户端,而JSP页面中格式为“<%-- 注释信息 --%>”的内容则会被忽略,不会发送到客户端。
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<!-- <%="// hello " %> -->
</body>
</html>
3.JSP指令
1. page指令的格式
在JSP页面中,经常需要对页面的某些特性进行描述,例如,页面的编码方式,JSP页面采用的语言等,这些特性的描述可以通过page指令
实现。page指令的具体语法格式如下所示:
<%@ page 属性名1= "属性值1" 属性名2= "属性值2" ...%>
page用于声明指令名称,属性用来指定JSP页面的某些特性。page指令还提供了一系列与JSP页面相关的属性。
2. page指令的常用属性
属性名称 | 取值范围 | 描述 |
---|---|---|
language | java | 指定JSP页面所用的脚本语言,默认为Java |
import | 任何包名、类名 | 指定在JSP页面翻译成的Servlet源文件中导入的包或类。import是唯一可以声明多次的page指令属性。一个import属性可以引用多个类,中间用英文逗号隔开 |
session | true、false | 指定该JSP内是否内置Session对象,如果为true,则说明内置Session对象,可以直接使用,否则没有内置Session对象。默认情况下,session属性的值为true。需要注意的是,JSP 容器自动导入以下4个包:java.lang.*javax.servlet.*javax.servlet.jsp.javax.servlet.http. |
isErrorPage | true、false | 指定该页面是否为错误处理页面,如果为true,则该JSP内置有一个Exception对象的exception,可直接使用。默认情况下,isErrorPage的值为false |
errorPage | 某个JSP页面的相对路径 | 指定一个错误页面,如果该JSP程序抛出一个未捕捉的异常,则转到errorPage指定的页面。errorPage指定页面的isErrorPage属性为true,且内置的exception对象为未捕捉的异常 |
contentType | 有效的文档类型 | 指定当前JSP页面的MIME类型和字符编码,例如:HTML格式为text/html纯文本格式为text/plainJPG图像为image/jpegGIF图像为image/gifWord文档为application/msword |
pageEnCoding | 当前页面 | 指定页面编码格式 |
3. page指令的示例
page指令的常见属性中除了import属性外,其他的属性都只能出现一次,否则会编译失败。下面列举两个使用page指令的示例:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ page import="java.awt.*" %>
<%@ page import="java.util.*","java.awt.*"%>
上面代码中使用了page指令的language、contentType、pageEncoding和import属性。需要注意的是,page指令对整个页面都有效,而
与其书写的位置无关,但是习惯上把page指令写在JSP页面的最前面。
4. include指令的格式
在实际开发时,有时需要在JSP页面中包含另一个JSP页面,这时,可以通过include指令实现,include指令的具体语法格式如下所示:
<%@ include file="被包含的文件地址"%>
include指令只有一个file属性,用于指定要包含文件的路径。需要注意的是,插入文件的路径一般不以“/”开头,而是使用相对路径。
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ page import="java.util.Date" %>
<%@ page import="java.text.SimpleDateFormat" %>
<html>
<head>
<title>JSP--显示时间</title>
</head>
<body>
<%
Date date = new Date();
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String format = simpleDateFormat.format(date);
%>
当前时间:<%=format %>
</body>
</html>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%@ include file="timeinfo.jsp"%>
</body>
</html>
5. 使用include指令的常见问题
关于include指令的具体应用,有很多问题需要注意,下面介绍几个常见的问题。
(1)被引入的文件必须遵循JSP语法,其中的内容可以包含静态HTML、JSP脚本元素和JSP指令等普通JSP页面所具有的一切内容。
(2)除了指令元素之外,被引入的文件中的其他元素都被转换成相应的Java源代码,然后插入进当前JSP页面所翻译成的Servlet源文件
中,插入位置与include指令在当前JSP页面中的位置保持一致。
(3)file属性的设置值必须使用相对路径,如果以“/”开头,表示相对于当前Web应用程序的根目录(注意不是站点根目录);否则,表示
相对于当前文件。需要注意的是,这里的file属性指定的相对路径是相对于文件(file),而不是相对于页面(page)。
(4)在应用include指令进行文件包含时,为了使整个页面的层次结构不发生冲突,建议在被包含页面中将<html>,<body>等标签删除,
因为在包含页面的文件中已经指定了这些标签。
6. taglib指令的格式
在JSP文件中,可以通过taglib指令标识该页面中所使用的标签库,同时引用标签库,并指定标签的前缀。在页面中引用标签库后,就可以
通过前缀来引用标签库中的标签。taglib指令的具体语法格式如下:
<%@ taglib prefix="tagPrefix" uri="tagURI" %>
prefix:用于指定标签的前缀,该前缀不能命名为jsp、jspx、java、sun、servlet和sunw。
uri:用于指定标签库文件的存放位置。
·在页面中引用JSTL中的核心标签库,示例代码如下:
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
4. JSP动作元素
1. jsp:include动作元素的格式
在JSP页面中,<jsp:include>动作元素用于向当前页面引入其他的文件,被引入的文件可以是动态文件,也可以是静态文件。<jsp:include>动作元素的具体语法格式如下所示:
<jsp:include page="URL" flush="true|false" />
page:用于指定被引入文件的相对路径。例如,指定属性值为top.jsp,则表示将当前JSP文件相同文件夹下的top.jsp文件引入到当前JSP
页面中。
flush:用于指定是否将当前页面的输出内容刷新到客户端,默认情况下,flush属性的值为false。
<jsp:include>包含的原理是将被包含页面编译处理后的结果包含在当前页面中。例如,在页面1中使用<jsp:include>元素包含了页面
2,当浏览器第一次请求页面1时,Web容器首先会编译页面2,然后将编译处理后的返回结果包含在页面1中,之后编译页面1,最后将两个页面组
合的结果回应给浏览器。为了使读者更好地理解<jsp:include>动作元素,下面通过一个案例演示<jsp:include>动作元素的使用。
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
demo06.jsp内容<br>
<jsp:include page="included.jsp" flush="false" />
</body>
</html>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%Thread.sleep(5000);%>
included.jsp内的中文<br />
</body>
</html>
注意:第二行文本会演示5s再显示
include指令与<jsp:include>动作元素的区别
include指令通过file属性指定被包含的文件,file属性不支持任何表达式; <jsp:include>动作元素通过page属性指定被包含的文件,
page属性支持JSP表达式。
使用include指令时,被包含的文件内容会原封不动地插入到包含页中,然后JSP编译器再将合成后的文件最终编译成一个Java文件;使用
<jsp:include>动作元素包含文件时,当该元素被执行时,程序会将请求转发到被包含的页面,并将执行结果输出到浏览器中,然后返回包含
页,继续执行后面的代码。因为服务器执行的是多个文件,所以如果一个页面包含了多个文件,JSP编译器会分别对被包含的文件进行编译。
在应用include指令包含文件时,由于被包含的文件最终会生成一个文件,所以在被包含文件、包含文件中不能有重复的变量名或方法;而
在应用<jsp:include>动作元素包含文件时,因为每个文件是单独编译的,所以被包含文件和包含文件中的重名变量和方法是不冲突的。
注意:<jsp:include>动作元素对包含的动态文件和静态文件的处理方式是不同的,如果被包含的是静态文件,则包含页面执行后,在使用
了<jsp:include>动作元素的位置将会输出被包含文件的内容。如果<jsp:include>动作元素包含的是一个动态文件,那么JSP编译器将编译并
执行被包含文件。
2. 请求转发元素jsp:forward
<jsp:forward>动作元素可以将当前请求转发到其他Web资源(HTML页面、JSP页面和Servlet等),执行请求转发之后,当前页面将不再
执行,而是执行该元素指定的目标页面。<jsp:forward>具体语法格式如下所示:
<jsp:forward page="relativeURL" />
page属性用于指定请求转发到的资源的相对路径,该路径的目标文件必须是当前应用中的内部资源。
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<jsp:forward page="welcome.jsp" />
</body>
</html>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
Hello !!!!!
</body>
</html>
5. JSP隐式对象
1. 隐式对象
在JSP页面中,有一些对象需要频繁使用,如果每次都重新创建这些对象则会非常麻烦。为了简化Web应用程序的开发,JSP2.0规范中提供了9个隐式(内置)对象,它们是JSP默认创建的,可以直接在JSP页面中使用。
下表中列举了JSP的9个隐式对象及它们各自对应的类型。其中,由于request、response、config、session和application所属的类及其用法在前面的章节都已经讲解过,而page对象在JSP页面中很少被用到。
2. JSP中的9个隐式对象
名称 | 类型 | 描述 |
---|---|---|
out | javax.servlet.jspJspWriter | 用于页面输出 |
request | javax.servlet.http.HttpServletRequest | 得到用户请求信息 |
response | javax.servlet.http.HttpServletResponse | 服务器向客户端的回应信息 |
config | javax.servlet.ServletConfig | 服务器配置,可以取得初始化参数 |
session | javax.servlet.http.HttpSession | 用来保存用户的信息 |
application | javax.servlet.ServletContext | 所有用户的共享信息 |
page | java.lang.Object | 指当前页面转换后的Servlet类的实例 |
pageContext | javax.servlet.jsp.PageContext | JSP的页面容器 |
exception | java.lang.Throwable | 表示JSP页面所发生的异常,在错误页中才起作用 |
3. out对象的作用
在JSP页面中,经常需要向客户端发送文本内容,向客户端发送文本内容可以使用out对象实现。out对象javax.servlet.jsp.JspWriter
类的实例对象,它的作用与ServletResponse.getWriter()方法返回的PrintWriter对象非常相似,都是用来向客户端发送文本形式的实体内
容。不同的是,out对象的类型为JspWriter,它相当于带缓存功能的PrintWriter。
在JSP页面中,通过out隐式对象写入数据相当于将数据插入到JspWriter对象的缓冲区中,只有调用了ServletResponse.getWriter()方
法,缓冲区中的数据才能真正写入到Servlet引擎所提供的缓冲区中。
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%
out.print("第一行");
response.getWriter().write("第二行");
%>
</body>
</html>
由上图可知,程序先输出了第二行,后输出了第一行。这是因为out对象通过print语句写入数据后,直到整个JSP页面结束,out对象中输
入缓冲区的数据(即:第一行)才真正写入到Serlvet引擎提供的缓冲区中,而response.getWriter().println()语句则是直接把内容(即:
第二行)写入Servlet引擎提供的缓冲区中,Servlet引擎按照缓冲区中的数据存放顺序输出内容。
4. 使用page指令设置out对象的缓冲区大小
有时候,开发人员希望out对象可以直接将数据写入Servlet引擎提供的缓冲区中,这时,可以通过page指令中操作缓冲区的buffer属性来实现。接下来对文件out.jsp进行修改,修改后的代码如下所示。
<%@ page contentType=“text/html;charset=UTF-8” language=“java” buffer=“0kb” %>
<%@ page contentType="text/html;charset=UTF-8" language="java" buffer="0kb" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%
out.print("第一行");
response.getWriter().write("第二行");
%>
</body>
</html>
由上图可知,out对象输出的内容在response.getWriter().println()语句输出的内容之前,由此可见,out对象中的数据直接写入了Servlet引擎提供的缓冲区中。此外,当写入到out对象中的内容充满了out对象的缓冲区时,out对象中输入缓冲区的数据也会真正写入到Servlet引擎提供的缓冲区中。
5. pageContext对象
在JSP页面中,使用pageContext对象可以获取JSP的其他8个隐式对象。pageContext对象是javax.servlet.jsp.PageContext类的实例对象,它代表当前JSP页面的运行环境,并提供了一系列用于获取其他隐式对象的方法。
方法名 | 功能描述 |
---|---|
JspWriter getOut() | 用于获取out隐式对象 |
Object getPage() | 用于获取page隐式对象 |
ServletRequest getRequest() | 用于获取request隐式对象 |
ServletResponse getResponse() | 用于获取response隐式对象 |
HttpSession getSession() | 用于获取session隐式对象 |
Exception getException() | 用于获取exception隐式对象 |
ServletConfig getServletConfig() | 用于获取config隐式对象 |
ServletContext getServletContext() | 用于获取application隐式对象 |
void setAttribute(String name,Object value,int scope) | 用于设置pageContext对象的属性 |
Object getAttribute(String name,int scope) | 用于获取pageContext对象的属性 |
void removeAttribute(String name,int scope) | 用于删除指定范围内名称为name的属性 |
void removeAttribute(String name) | 用于删除所有范围内名称为name的属性 |
Object findAttribute(String name) | 用于从4个域对象中查找名称为name的属性 |
pageContext对象的作用范围
pageContext操作属性的相关方法中参数name指定的是属性名称,参数scope指定的是属性的作用范围。pageContext对象的作用范围有4
个值,具体如下:
pageContext.PAGE_SCOPE:表示页面范围。
pageContext.REQUEST_SCOPE:表示请求范围。
pageContext.SESSION_SCOPE:表示会话范围。
pageContext.APPLICATION_SCOPE:表示Web应用程序范围。
需要注意的是,当调用findAttribute()方法查找名称为name的属性时,会按照page、request、session和application的顺序依次进
行查找,如果找到,则返回属性的名称,否则返回null。
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%
//获取request对象
HttpServletRequest req = (HttpServletRequest) pageContext.getRequest();
//设置page范围内属性
pageContext.setAttribute("str", "Java",pageContext.PAGE_SCOPE);
//设置request范围内属性
req.setAttribute("str", "Java Web");
//获得的page范围属性
String str1 = (String)pageContext.getAttribute("str", pageContext.PAGE_SCOPE);
//获得的request范围属性
String str2 = (String)pageContext.getAttribute("str", pageContext.REQUEST_SCOPE);
%>
<%="page范围:"+str1 %><br />
<%="request范围:"+str2 %><br />
</body>
</html>
6. exception对象
在JSP页面中,经常需要处理一些异常信息,处理异常信息可以通过exception对象实现。exception对象是java.lang.Exception类的实例对象,它用于封装JSP中抛出的异常信息。需要注意的是,exception对象只有在错误处理页面才可以使用,即page指令中指定了属性<%@ page isErrorPage="true"%>的页面。
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%
int a = 3;
int b = 0;
%>
输出结果为:<%=(a / b)%><!--此处会产生异常 -->
</body>
</html>
修改:
<%@ page contentType="text/html;charset=UTF-8" language="java" isErrorPage="true" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<!-- 显示异常信息 -->
<%=exception.getMessage()%><br />
</body>
</html>
<%@ page contentType="text/html;charset=UTF-8" language="java" errorPage="err.jsp" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%
int a = 3;
int b = 0;
%>
输出结果为:<%=(a / b)%><!--此处会产生异常 -->
</body>
</html>