JSP九大内置对象和四种属性范围解读

时间:2021-06-19 20:04:20

林炳文Evankaka原创作品。转载请注明出处http://blog.csdn.net/evankaka

摘要:本文首先主要解说了JSP中四种属性范围的概念、用法与实例。

然后在这个基础之上又引入了九大内置对象,并对这几大内置对象一个一个的进行分析的解读。内容非常具体,例子都附有代码和执行的结果截图。

本文project下载

一、四种属性范围

1.1、在JSP中提供了四种属性保存范围

page:在一个页面内保存属性。跳转之后无效
request:在一次服务请求范围内。server跳转后依旧有效
session:-在一次会话范围内,不管何种跳转都能够使用,可是新开浏览器无法使用
application:在整个server上保存,全部用户都能够使用

1.2、4种属性范围都支持的操作

public void setAttribute(String name,Object value)
public Object getAttribute(String name)
public Object removeAttribute(String name)

以下。我们来对四种范围来分别进行具体的介绍

1.3、page范围

在JSP中设置一个页的属性范围,必须通过pageContext完毕,PageContext属性范围是最重要的JSP属性之中的一个。可是假设使用纯粹的JSP代码开发,此属性显示不出用处。其发挥作用在 Struts ,WebWork 中

例如以下:

<%@page import="java.util.*"%>
<%@ 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>
<%
//设置page属性范围,此属性仅仅在当前JSP页面内起作用
pageContext.setAttribute("name", "linbingwen");
pageContext.setAttribute("time", new Date());
%>
姓名:${pageScope.name}<br>
时间:${pageScope.time}<br>
</body>
</html>

${pageScope.name}这里用了EL表达式来取得值,输出结果例如以下。

JSP九大内置对象和四种属性范围解读

这里要注意发果在其它页面使用:

例如以下:

<%@page import="java.util.*"%>
<%@ 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>
姓名:${pageScope.name}<br>
时间:${pageScope.time}<br>
</body>
</html>

输出结果:

JSP九大内置对象和四种属性范围解读

这说明page范围的值仅仅能在本页使用。

1.4、request属性范围

request将属性保存在一次请求范围之内:

前提:必须使用server端跳转:<jsp:forward/> 应用点:MVC设计模式、Struts、 Webwork

应用实例

首先是设置request:

request.jsp

<%@page import="java.util.*"%>
<%@ 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>
<%
//设置request属性范围
request.setAttribute("name", "linbingwen");
request.setAttribute("time", new Date());
%>
<jsp:forward page="requestResult.jsp"/>
</body>
</html>

然后是显示requestResult.jsp

<%@page import="java.util.*"%>
<%@ 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>
获取request姓名:${requestScope.name}<br>
获取request时间:${requestScope.time}<br>
</body>
</html>

訪问结果:

JSP九大内置对象和四种属性范围解读

这时比方requestResult1.jsp也想来訪问这两个属性

内容和requestResult.jsp一样:

<%@page import="java.util.*"%>
<%@ 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>
获取request姓名:${requestScope.name}<br>
获取request时间:${requestScope.time}<br>
</body>
</html>

结果例如以下。说明request仅仅针对server跳转有效,在两次跳转之间保存。

JSP九大内置对象和四种属性范围解读

1.5、session属性范围

session:仅仅要设置上去,则不管是什么跳转,都能够取得属性。主要用于验证用户是否登陆。

EMAIL--->用户须要先进行登陆,登陆成功后再编辑邮件。与session有关的不论什么打开的页面都能够取得session

比方session.jsp设置例如以下:

<%@page import="java.util.*"%>
<%@ 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>
<%
//设置session属性范围
session.setAttribute("name", "linbingwen");
session.setAttribute("time", new Date());
%>
<a href="sessionResult.jsp">获取session内容</a>
</body>
</html>

然后是取出sesson的值sessionResult.jsp

<%@page import="java.util.*"%>
<%@ 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>
获取session姓名:${sessionScope.name}<br>
获取session时间:${sessionScope.time}<br>
</body>
</html>

输出结果:

JSP九大内置对象和四种属性范围解读

假设另一个sessionResult1.jsp和sessionResult.jsp一例子如以下

<%@page import="java.util.*"%>
<%@ 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>
<%
//设置request属性范围
session.setAttribute("name", "linbingwen");
session.setAttribute("time", new Date());
%>
<a href="sessionResult.jsp">获取session内容</a>
</body>
</html> 然后是取出sesson的值sessionResult.jsp <%@page import="java.util.*"%>
<%@ 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>
获取session姓名:${sessionScope.name}<br>
获取session时间:${sessionScope.time}<br>
</body>
</html>

JSP九大内置对象和四种属性范围解读

注意看上面的GIF动画和这里的获取到的时间是一样的,这也说明了这两个jsp页面取得了同一个值

1.6、application属性范围

仅仅要设置一次。则全部的页面窗体都能够取得数据。这里的值将会保存在server上,所以每一个用户都能够看见。

如以下application.jsp:

<%@page import="java.util.*"%>
<%@ 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>
<%
//设置request属性范围
application.setAttribute("name", "linbingwen");
application.setAttribute("time", new Date());
%>
<a href="applicationResult.jsp">获取application内容</a>
</body>
</html>

然后是applicationResult.jsp

<%@page import="java.util.*"%>
<%@ 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>
获取application姓名:${applicationScope.name}<br>
获取application时间:${applicationScope.time}<br>
</body>
</html>

输出结果:

JSP九大内置对象和四种属性范围解读

假设这时在新建一个网页或新建一个新的web项目。可是它们两个要执行在同一个Tomcat中,那么它相同也能訪问到这个值。

注意:

pplication、session、request--==--》都与要跨多个页,属性保存是有内存开销的。设置过多的application或每一个session保存过多的对象,性能就减少了。

原则:能用request就不要用session。能用session就不要用application

application应用:在线人员统计、在线人员名单列表,要释放application资源,仅仅能又一次启动server.

使用application缓存数据库的连接,每次使用时。从缓冲中取出,用完就返回。

二、JSP九大内置对象具体解释

内置对象(又叫隐含对象。有9个内置对象):不须要预先声明就能够在脚本代码和表达式中任意使用

JSP内置对象映射表

JSP九大内置对象和四种属性范围解读

request              请求对象                 类型 javax.servlet.ServletRequest        作用域 Request
response           响应对象                   类型 javax.servlet.SrvletResponse       作用域  Page
pageContext      页面上下文对象         类型 javax.servlet.jsp.PageContext      作用域    Page
session             会话对象                   类型 javax.servlet.http.HttpSession       作用域    Session
application        应用程序对象            类型 javax.servlet.ServletContext          作用域    Application
out                    输出对象                   类型 javax.servlet.jsp.JspWriter             作用域    Page
config               配置对象                   类型 javax.servlet.ServletConfig            作用域    Page
page                页面对象                   类型 javax.lang.Object                            作用域    Page
exception         例外对象                   类型 javax.lang.Throwable                     作用域    page

JSP中一共预先定义了9个这种对象,分别为:request、response、session、application、out、pagecontext、config、page、exception

2.1、request对象

request 对象是 javax.servlet.httpServletRequest类型的对象。 该对象代表了client的请求信息。主要用于接受通过HTTP协议传送到server的数据。

(包括头信息、系统信息、请求方式以及请求參数等)。request对象的作用域为一次请求。

实现常有的方法

1、获取数据

getParameter;;接收请求參数的,

2、对全部数据进行再编码

public byte[] getBytes(“encoding”)

例如以下实例将byte数组编码转换

<%@ page contentType="text/html";charset=gbk"%>
<html>
<body>
<%
//接收内容
String name=request.getParameter("uname");
byte[] b=name.getBytes("ISO8859-1");
name=new String(b);
String name= new String(request.getParameter("uname").getBytes("ISO8859-1"));
%>
<h1>输入内容为:<%=name%></h1>
</body>
</html>

3、设置统一的请求编码

public void setCharacterEncoding(String env) throws UnsunpportedEncodingException

例如以下设置

<%@ page contentType="text/html";charset=gbk"%>
<html>
<body>
<%
//接收内容
request.setCharacterEncoding("GBK");
String name= request.getParameter("uname");
%>
<h1>输入内容为:<%=name%></h1>
</body>
</html>

4、获取requst信息:

<%@ 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 bgcolor="#FFFFF0">
<form action="" method="post">
<input type="text" name="name">
<input type="submit" value="提交">
</form>
请求方式:<%=request.getMethod()%><br>
请求的资源:<%=request.getRequestURI()%><br>
请求用的协议:<%=request.getProtocol()%><br>
请求的文件名称:<%=request.getServletPath()%><br>
请求的server的IP:<%=request.getServerName()%><br>
请求server的端口:<%=request.getServerPort()%><br>
clientIP地址:<%=request.getRemoteAddr()%><br>
client主机名:<%=request.getRemoteHost()%><br>
表单提交来的值:<%=request.getParameter("name")%><br>
</body>
</html>

我们第一次訪问是默认用GET方法,表单提交后使用POST方式。

JSP九大内置对象和四种属性范围解读

2.2、response对象

response 代表的是对client的响应,主要是将JSP容器处理过的对象传回到client。

response对象也具有作用域。它仅仅在JSP页面内有效。response对象的主要使用1.设置HTTP头信息、重定向、设置COOKie
(1).Webserver收到一个http请求,会针对每一个请求创建一个HttpServletRequest和HttpServletResponse对象,向client发送数据找HttpServletResponse,从client取数据找HttpServletRequest;

(2).HttpServletResponse对象能够向client发送三种类型的数据:a.响应头b.状态码c.数据

2.2.1、response对象所提供的方法。
(1)设定表头的方法

void addCookie(Cookie cookie) 新增cookie
void addDateHeader(String name, long date) 新增long类型的值到name标头
void addHeader(String name, String value) 新增String类型的值到name标头
void addIntHeader(String name, int value) 新增int类型的值到name标头
void setDateHeader(String name, long date) 指定long类型的值到name标头
void setHeader(String name, String value) 指定String类型的值到name标头
void setIntHeader(String name, int value) 指定int类型的值到name标头
containsHeader( String name )推断指定名字的HTTP文件头是否已经存在。然后返回真假布尔值

(2)设定响应状态码的方法

void sendError(int sc) 传送状态码(status code)
void sendError(int sc, String msg) 传送状态码和错误信息
void setStatus(int sc) 设定状态码

(3)用来URL 重写(rewriting)的方法

String encodeRedirectURL(String url) 对使用sendRedirect( )方法的URL予以编码

(4)设置重定向

sendRedirect():设置重定向页面.

2.2.2、使用范例
(1)使用response对象能够设置HTTP的头信息。

格式response.setHeader(“头信息名称”,”參数”),当中一个重要的头信息:refresh(刷新)。比如。每秒刷新一次也没。显示刷新次数:

<%@page import="java.util.*"%>
<%@ 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>
<%!int i=0; %>
<%
//每秒刷新一次
response.setHeader("refresh","1");
%>
<%=i++ %>
</body>
</html>

输出结果例如以下:

JSP九大内置对象和四种属性范围解读

(2)重定向

<%@page import="java.util.*"%>
<%@ 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>
<%
response.setHeader("refresh","3;URL=index.jsp") ;
%>
三秒后跳转! ! ! <br>
假设没有跳转。请按<a href="index.jsp">这里</a>!! !
</body>
</html>

来输出结果看看:

输入http://localhost:8080/JspLearning/responseObject1.jsp,三秒后自己主动跳转到http://localhost:8080/JspLearning/index.jsp

JSP九大内置对象和四种属性范围解读

当然还能够使用response.sendRedirect("**.jsp");命令

例如以下:

<%@page import="java.util.*"%>
<%@ 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>
<%
response.sendRedirect("index.jsp");
%>
</body>
</html>

输出结果,直接重定向返回到首页了,

JSP九大内置对象和四种属性范围解读

(3)设置cookie

<%@pagecontentType="text/html;charset=gb2312"%>
<HTML>
<HEAD>
<TITLE>Cookie的使用</TITLE>
</HEAD>
<BODY>
<%
Cookie c1 = newCookie("name","aaa") ;
Cookie c2 = newCookie("password","111") ;
// 最大保存时间为60秒
c1.setMaxAge(60) ;
c2.setMaxAge(60) ;
// 通过response对象将Cookie设置到client
response.addCookie(c1) ;
response.addCookie(c2) ;
%>
</BODY>
</HTML>

(4)读取cookie

<%@page contentType="text/html;charset=gb2312"%>
<HTML>
<HEAD>
<TITLE>Cookie的使用</TITLE>
</HEAD>
<BODY>
<%
// 通过request对象,取得client设置的全部Cookie
// 实际上client的Cookie是通过HTTP头信息发送到server端上的
Cookie c[] = request.getCookies() ;
%>
<%
for(int i=0;i<c.length;i++){
Cookie temp = c[i] ;
%>
<h1><%=temp.getName()%> --> <%=temp.getValue()%></h1>
<%
}
%>
</BODY>
</HTML>

2.3、session对象

session 对象是由server自己主动创建的与用户请求相关的对象。server为每一个用户都生成一个session对象,用于保存该用户的信息,跟踪用户的操作状态。session对象内部使用Map类来保存数据,因此保存数据的格式为 “Key/value”。 session对象的value能够使复杂的对象类型。而不仅仅局限于字符串类型。

(1)session(会话)对象是类javax.servlet.Httpsession的一个对象。session是从client连接server開始。到与server断开为止。
(2)session对象用于保存每一个与server建立连接的client的信息,session的ID保存于client的Cookie中,这个session ID标识唯一和用户,与其它用户的session ID不同。
(3)session对象的ID:
当一个client訪问server的一个JSP页面时,JSP引擎产生一个session对象,同一时候分配一个String类型的ID号,并发给client。

client将其存储于Cookie.a其标志了一个唯一的ID。採用getID()方法返回session对象在server端的编号。server端通过此ID,唯一地识别一个用户,并提供特殊的服务。

(4)session对象的有效期:
存在以下几个情况时,session对象和其存储的数据会消失。情况有:
当用户关闭当前正在使用的浏览器时。
关闭网页server。
用户未向server提出请求超预设时,Tomcatserver预设为30分钟;
执行程序结束session.
出现以上四种情况时。session对象会消失。

以下是一个简单的session登陆实例:

JSP九大内置对象和四种属性范围解读

login.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>
<form action="login.jsp" method="post">
username:<input type="text" name="uname"><br>
密 码:<input type="password" name="upass"><br>
<input type="submit" value="登录">
<input type="reset" value="重置">
</form>
<%
String name = (String)request.getParameter("uname");
String password = (String)request.getParameter("upass");
if(!(name == null || "".equals(name) || password == null || "".equals(password))){
if("linlin".equals(name) && "123456".equals(password)){
//假设登录成功,则设置session的属性范围
session.setAttribute("userid", name);
response.setHeader("refresh","3;URL= welcome.jsp");
%>
<h3>用户登录成功!三秒后跳转到欢迎页……</h3>
<h3>假设没有跳转。请按<a href="welcome.jsp">这里</a></h3>
<%
}else{
%>
<h3>错误的username或密码。</h3>
<%
}
}
%>
</body>
</html>

welcome.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>
<% //假设已经设置过了session属性,则肯定不为空
if(session.getAttribute("userid") != null){
%>
<h3>欢迎<%=session.getAttribute("userid")%>登陆~~~~~~~~~~<a href="logout.jsp">注销</a></h3>
<%
}else{
%>
<h3>请先进行本系统的<a href="login.jsp">登录</a></h3>
<%
}
%>
</body>
</html>

logout.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>
<%
response.setHeader("refresh", "2;URL=login.jsp");
session.invalidate(); //注销表示当前的session失效
%>
<h3>你已成功退出本系统,两秒后返回到首页。</h3>
<h3>假设没有跳转,请按<a href="login.jsp">这里</a></h3> 首页
</body>
</html>

结果例如以下:输入正确username与password后,等三秒,自己主动跳转到欢迎界面welcome.jsp。欢迎界面里点注销,重定向的注销界面login.jsp,等2秒后自己主动跳转到login.jsp

JSP九大内置对象和四种属性范围解读

2.4、application对象

application 对象可将信息保存在server中,直到server关闭。否则application对象中保存的信息会在整个应用中都有效。

与session对象相比,application对象生命周期更长。相似于系统的“全局变量”。

运用实例:网页訪问计数器。

<%@page import="java.util.*"%>
<%@ 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>
<body>
<%
if(application.getAttribute("counter") == null)
{
application.setAttribute("counter", "1");
}
else
{
String strnum = null;
strnum = application.getAttribute("counter").toString();
int icount = 0;
icount = Integer.valueOf(strnum).intValue();
icount++;
application.setAttribute("counter", Integer.toString(icount)); } %> 您是第<%=application.getAttribute("counter") %>位訪问者!
</body>
</html>

输出结果:

JSP九大内置对象和四种属性范围解读

执行结果就是訪问到该页面之后显示你是第几位訪客,刷新之后数目会添加,更换浏览器或者更换client地址都会使其訪问值正常递增。

    application的存活范围比request和session都要大。仅仅要server没有关闭,application对象中的数据就会一直存在,在整个server的执行过程当中,application对象仅仅有一个。它会被全部的用户共享。当中getRealPath这种方法能够获取资源在server上的物理路径(绝对路径),经常使用来获取上传文件时要存储文件的路径。

2.5、out 对象

out 对象用于在Web浏览器内输出信息,而且管理应用server上的输出缓冲区。

在使用 out 对象输出数据时,能够对数据缓冲区进行操作,及时清除缓冲区中的残余数据,为其它的输出让出缓冲空间。待数据输出完毕后,要及时关闭输出流。

out对象的方法

clear()清除网页上输出的内容
clearBuffer()清除缓冲去的内容
close()关闭缓冲区,清除全部的内容
getBufferSize()取得缓冲区的大小
getRemaining()取得缓冲区剩余大小
isAutoFlush()获取缓冲是否进行自己主动清除的信息
print()进行页面输出
println()进行页面输出并换行

使用out对象进行页面的输出

<%@ page language="java" contentType="text/html;charset=gb2312" %>
<!DOCTYPE html>
<html>
<head>
<title>使用out对象输出内容</title>
</head>
<body>
<%
out.print("hello world");
out.println("hello world");
%>
</body>
</html>

这里在页面上输出是没有什么差别的,假设想换行要使用html元素<br />
使用out对象获得缓冲区使用大小

<%@ page language="java" contentType="text/html;charset=gb2312" %>
<!DOCTYPE html>
<html>
<head>
<title>使用out对象求的缓冲区使用的大小</title>
</head>
<body>
<%
int all = out.getBufferSize();
int remain = out.getRemaining();
int use = all - remain;
out.println("总的缓冲区大小为:"+all+"<br />");
out.println("正在使用的缓冲区的大小为:"+remain+"<br />");
out.println("剩余的缓冲区的大小为:"+use+"<br />"); %>
</body>
</html>

输出结果

JSP九大内置对象和四种属性范围解读

2.6、pageContext 对象

pageContext 对象的作用是取得不论什么范围的參数,通过它能够获取 JSP页面的out、request、reponse、session、application 等对象。

pageContext对象的创建和初始化都是由容器来完毕的。在JSP页面中能够直接使用 pageContext对象。

这个对象代表页面上下文,该对象主要用于訪问JSP之间的共享数据。

pageContext是PageContext类的实例。使用pageContext能够訪问page、request、session、application范围的变量。

getAttribute(String name):取得page范围内的name属性。

getAttribute(String name,int scope):取得指定范围内的name属性,当中scope能够是例如以下4个值:

PageContext.PAGE_SCOPE:相应于page范围。

PageContext.REQUEST_SCOPE:相应于request范围。

PageContext.SESSION_SCOPE:相应于session范围。

PageContext.APPLICATION_SCOPE:相应于application范围。

实例:

<%@page import="java.util.*"%>
<%@ 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>
<% //使用pageContext设置属性。该属性默认在page范围内
pageContext.setAttribute("name","lin-pageContext");
request.setAttribute("name","lin-request");
session.setAttribute("name","lin-session");
application.setAttribute("name","lin-application"); %>
page设定的值:<%=pageContext.getAttribute("name")%><br>
request设定的值:<%=pageContext.getRequest().getAttribute("name")%><br>
session设定的值:<%=pageContext.getSession().getAttribute("name")%><br>
application设定的值:<%=pageContext.getServletContext().getAttribute("name")%><br>
范围1内的值:<%=pageContext.getAttribute("name",1)%><br>
范围2内的值:<%=pageContext.getAttribute("name",2)%><br>
范围3内的值:<%=pageContext.getAttribute("name",3)%><br>
范围4内的值:<%=pageContext.getAttribute("name",4)%><br>
<!--从最小的范围page開始。然后是reques、session以及application-->
<%pageContext.removeAttribute("name",3);%>
pageContext改动后的session设定的值:<%=session.getValue("name")%><br>
<%pageContext.setAttribute("name","lin-modify",4);%>
pageContext改动后的application设定的值:<%=pageContext.getServletContext().getAttribute("name")%><br>
值的查找:<%=pageContext.findAttribute("name")%><br>
属性name的范围:<%=pageContext.getAttributesScope("name")%><br>
</body>
</html>

输出结果:

JSP九大内置对象和四种属性范围解读

2.7、config 对象

config 对象的主要作用是取得server的配置信息。通过 pageConext对象的 getServletConfig() 方法能够获取一个config对象。当一个Servlet 初始化时。容器把某些信息通过 config对象传递给这个 Servlet。 开发人员能够在web.xml 文件里为应用程序环境中的Servlet程序和JSP页面提供初始化參数。

config 对象代表当前JSP 配置信息,但JSP 页面通常无须配置。因此也就不存在配置信息。

该对象在JSP 页面中非常少用,但在Servlet 则用处相对较大。由于Servlet 须要配置在web.xml 文件里,能够指定配置參数。

<%@page import="java.util.*"%>
<%@ 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>
<!-- 直接输出config的getServletName的值 -->
<%=config.getServletName()%>
<!-- 输出该JSP中名为name的參数配置信息 -->
name配置參数的值:<%=config.getInitParameter("name")%><br/>
<!-- 输出该JSP中名为age的參数配置信息 -->
age配置參数的值:<%=config.getInitParameter("age")%>
</body>
</html>

web.xml配置里加上:

    <servlet>
<!--指定servlet的名字-->
<servlet-name>config</servlet-name>
<!--指定哪一个JSP页面配置成Servlet-->
<jsp-file>/configObject.jsp</jsp-file>
<!--配置名为name的參数,值为linbingwen-->
<init-param>
<param-name>name</param-name>
<param-value>linbingwen</param-value>
</init-param>
<!--配置名为age的參数。值为30-->
<init-param>
<param-name>age</param-name>
<param-value>100</param-value>
</init-param>
</servlet>
<servlet-mapping>
<!--指定将config Servlet配置到/config路径-->
<servlet-name>config</servlet-name>
<url-pattern>/config</url-pattern>
</servlet-mapping>

输出结果:

JSP九大内置对象和四种属性范围解读

2.8、page 对象

page 对象代表JSP本身。仅仅有在JSP页面内才是合法的。

page隐含对象本质上包括当前 Servlet接口引用的变量,相似于Java编程中的 this 指针。

1 什么是page对象 ?
(1) page对象代表JSP页面本身
page对象是当前JSP页面本身的一个实例,page对象在当前JSP页面中能够用thiskeyword来替代。

(2) 在JSP页面哪些地方能够使用page对象
在JSP页面的Java程序片中能够使用page对象
在JSP页面的JSP表达式中能够使用page对象

(3) page对象的基类是:java.lang.Object类。
注意:假设直接通过page对象来调用方法,就仅仅能调用Object类中的那些方法。

(4) javax,servlet.jsp.JspPage接口
JspPage接口继承于javax.servlet.Servlet接口。

我们能够使用JspPage接口对page对象进行强制类型转换,再调用JspPage接口中的各种方法。

(5) javax,servlet.jsp.HttpJspPage接口
HttpJspPage接口继承于:
javax.servlet.jsp.JspPage接口和javax.servlet.Servlet接口。

我们能够使用HttpJspPage接口对page对象进行强制类型转换,再调用HttpJspPage接口中的各种方法。

(6) 在JSP页面中使用thiskeyword。可调用哪些方法?
在JSP页面中,thiskeyword表示当前JSP页面这个对象,能够调用的常见方法,例如以下所看到的:

JSP九大内置对象和四种属性范围解读

例如以下实例:

<%@page import="java.util.*"%>
<%@ 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>
取page的值:<%=this.getServletInfo() %>
</body>
</html>

输出结果:

JSP九大内置对象和四种属性范围解读

2.9、exception 对象

Exception对象是用来处理Jsp页面文件在执行时全部发生的错误和异常;Jsp页面文件必须在isErrorPage=true的情况下才干够使用该对象。该对象一般配合Page指令一起使用。通过指定某个页面为错误处理页面,把全部的错误都集中到那个页面进行处理,能够使整个系统的性能得到加强;经常用法例如以下
getMessage():返回错误信息
toString:以字符串的形式返回一个对异常的描写叙述
printStackTrace():以标准错误的形式输出一个错误和错误的堆栈

(1) 可能出错的页面:
在有可能产生异常或错误的JSP页面中。使用page指令设置errorPage属性。属性值为能够进行异常处理的某个JSP页面。
简单来说,仅仅要在当前JSP页面中产生了异常,就交给另外一个专门处理异常的JSP页面。

(2) 专门处理错误的页面:
在专门负责处理异常的JSP页面中,使用page指令设置isErrorPage属性为true,并使用exception对象来获取出错信息。

error.jsp

<%@ page language="java" contentType="text/html;charset=UTF-8" import="java.util.*" isErrorPage="true"%>
<%@ page import="java.io.PrintStream" %>
<!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>
<%=exception %><br />
<%=exception.getMessage() %><br />
<%=exception.getLocalizedMessage() %><br /> <%
exception.printStackTrace(new java.io.PrintWriter(out));
%>
</body>
</html>

出错的页面

<%@page import="java.util.*"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" errorPage="error.jsp"%>
<!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>
<%
int[] arr = {1,2,4};
out.println(arr[3]);
%>
</body>
</html>

输出的结果:

JSP九大内置对象和四种属性范围解读

不加errorPage="error.jsp"这句的话:代码就会暴出来了

JSP九大内置对象和四种属性范围解读

本文project下载