梦入琼楼寒有月,行过石树冻无烟

JSP 内置对象

内置对象是值这些对象在Java Server Pages页面中不需要声明和实例化,可以直接在Java程序片和Java表达式中部分使用,通常这种对象被称之为“Jsp内置对象”。

常用的JSP内置对象主要分为request、responese、out、session、application、pageContent、page、config、exception等内置对象的使用方法。

四大类,九大对象

JSP内置对象由WEB服务器负责实现和股哪里,JSP九个功能强大的内置对象,主要分为四大类

ID DA FA
input / output request 、response、out 作为客户端和服务器之间的通信桥梁
request 表示客户端对服务器端发送请求
response 表示服务器对客户端的响应
out 负责吧处理结果输出到客户端
context session、application、pageContext 与上下文(Context)有关的内置对象
session 表示浏览器与服务器会话的上下文环境
application 表示应用程序的上下文环境
pageContext 表示当前JSP页面上的上下文环境
servlet page、config
page 表示JSP文件转换为Java文件后的Servlet对象
config 表示JSP 文件转换JAVA文件后的服务连接器(Servlet)
error exception 当JSP页面发生错误时将产生异常,而该对象就是用于处理这个异常的

request

request 内置对象常用方法

ID DA
Object getAttribute(String name) 返回制定属性的属性值
Enumeration getAttributeNames() 返回所有可用的属性名枚举
String getCharacterEncoding() 返回字符编码格式
int getContentLength() 返回请求体字节数
String getContentType() 返回请求体的MIME类型
ServletInputStream getInputStream() 返回请求提中一行的二进制流
String getParameter(String name) 获取提交数据
Enumeration getParameterNames() 可用参数名的枚举
String[] getParameterValues(String name) 返回包含参数Name所有值的数组
String getProtocol() 返回请求用的协议类型及版本号
String getServerName() 返回接受请求 服务器主机名
int getServerPort() 返回服务器接受此请求所用的端口号
String getRemoteAddr() 返回发送此请求的客户端IP地址
String getRemoteHost() 返回发送此请求的客户端主机名
void setAttribute (String key,Object obj) 设置属性的属性值
String getRealPatch(String path) 返回一个虚拟路径的真实路径
request.getParameter(String name) 获取提交数据
NewFile.jsp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<form action="NewFile1.jsp">
<input type="text" name="data">
<input type="submit" value="up">
</form>
</body>
</html>
NewFile1.jsp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
String requestdata = request.getParameter("data"); // 返回data输入的信息
out.println(requestdata); // 输出返回时的信息
%>
</body>
</html>
String[] getParameterValues(String args) 返回参数名称的所有参数名
NewFile.jsp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<form action="NewFile1.jsp">
城市:<br/>
<input type="checkbox" name="data" value="Beijing"/>Beijing
<input type="checkbox" name="data" value="Shenzhen"/>Shenzhen
<input type="checkbox" name="data" value="Jilin"/>Jilin
<input type="submit" value="up">
</form>
</body>
</html>
NewFile1.jsp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
城市:<br>
<%
String Cities[] = request.getParameterValues("data");
for (int one =0; one < Cities.length; one++) {
out.println(Cities[one] + "<br>");
}
%>
</body>
</html>

response

当客户端请求服务器的一个页面时会提交一个HTTP请求,服务器收到请求后返回一个HTTP响应。之后request进行封装,与request对象相互映照的是response对象。

动态改变 contentType值 (setContentType)

JSP页面使用Page指令标记了设置页面的contentType属性值,response对象按照此属性值的方式对客户端作出相应,page指令中只能为contentType属性指定一个值,如果改变值可以通过response对象调用一个setContentTyoe(String s)方法来重新设置contentType的属性值。
客户端通过单击页面上的不同按钮可以改变页面响应的MIME类习惯,当点击word按钮时,jsp页面动态改变contentType的属性值为application/msword,从而启动本地Word软件来显示当前页面内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<form action="" method="post">
<p>Hello,response</p>
<input type="submit" value="word" name="submit">
<%
String str = request.getParameter("submit");
if ("word".equals(str)) {
// 修改response响应为msword
response.setContentType("application/msword");
}
%>
</form>
</body>
</html>

setHeader(String name,String value) 响应表头

response可以通过setHeader(String name,String value)来设置指定名字的HTML文件头值,以用于操作HTTP文件头。如实现每页三秒刷新一次,那么可以使用```setHeader(“refesh”,”3”)即可。

每三秒刷新一次 (setHeader)
1
2
3
4
<%
out.println("Hello,world");
response.setHeader("refresh","3");
%>
三秒跳转
1
2
3
4
<%
out.println("3m ->NewFile.jsp");
response.setHeader("refresh","3;url=NewFile.jsp");
%>

利用response对象的setHeader方法来实现3秒后跳转至“NewFile.jsp”文件之中。

重定向 (sendRedirect)

需要将当前页面跳转至另外一个页面时,即实现HTML中的<a>效果,可以使用reponse对象的sendRedirect(String url)方法进行重定向。

NewFile.jsp
1
2
3
4
5
6
<form action="NewFile1.jsp" method="post" name=form>
<p>password</p>
<br>
<input type="password" name="pass">
<input type="submit" value="up">
</form>
NewFile1.jsp
1
2
3
4
5
6
7
8
<%
String str = request.getParameter("pass");
if (!"12345".equals(str)) {
response.sendRedirect("NewFile.jsp");
} else {
out.println("Hello,world!");
}
%>
forward

forward和上述response对象的区别在于,forward可以不用跳转单纯的在本页显示另一个页面的信息,而response必须以跳转的形式才可以显示另一个解界面信息。

NewFile.jsp
1
2
3
<jsp:forward page="NewFile1.jsp">
<jsp:param value="hello" name="user"/>
</jsp:forward>
NewFile1.jsp
1
2
3
4
<p>NewFile1.jsp</p>
<%=
request.getParameter("user")
%>
ID DA FA
setContentType 修改response响应
setHeader 操作页面消息头 刷新、跳转
sendRedirect 实现页面跳转 重定向
forward 服务器端跳转、但URL保持不变

out

在input/output类别之中,out主要功能就是负责把处理结果输出到客户端主要共五个方法如下:

ID DA DF
void clear() 清除缓存区内容
void clearBuffer() 清除缓存区当前内容
void flush() 清空流
void close() 关闭输出流
void println() 输出各种数据类型
void newLine() 输出一个换行符号
int getBufferSize() 返回缓存区字节数 如不设缓存数则为0
int getRemaining() 返回缓存区剩余大小
boolean isAutoFlush() 返回缓存区满时是自动清空还是输出异常

缓存区剩余大小 (out.Remaining)

1
2
3
4
5
6
7
8
9
10
11
12
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<%=out.getRemaining()%> byte<br><%--返回缓存区剩余大小 --%>
</body>
</html>

输出各种类型(println)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
out.println("<p>Hello,world!</p>");
%>
</body>
</html>

session

浏览器会与Web服务器之间使用HTTP协议进行通信,客户端向服务器发出Request(请求)服务器返回response(响应),之后链接就会被关闭了。而这时,在服务端不必保留链接的相关信息,所以当时的开发人员就想法设想采取某种手段来记录每个客户端的连接信息。通常我们可以使用session来存放有关的链接信息

session对象ID

当访问一个Web服务器的时候,Web服务器会给每个访问的用户分配和自动创建一个session对象,每个session标识都是一个在当时期间内都具有唯一性的

获取session ID (getId)
1
2
3
4
5
<%
// Sessiong ID
String string = session.getId();
out.println(string);
%>

1
2
3
4
5
<%
// Sessiong ID
String string = session.getId();
%>
<%=string %>

需要注意的是,session Id在当前服务内是具有唯一性的,比如在“http://zsdk.org.cn/”下的session ID是```7170F444E491358B191187B0400291C6``,则在另一个服务器下(http://jiangxue.org.cn/)又是另一个session ID了

session 获取与存储数据

提交数据 (NewFile.jsp)
1
2
3
4
<form action="NewFile1.jsp" method="post">
<input type="text" name="tame">
<input type="submit" name="submit" value="up">
</form>
存储数据 (NewFile1.jsp)
1
2
3
4
<%
// 存储tame名称标签内数据
String tame = request.getParameter("tame");
%>
输出session 数据 (NewFile.jsp)
1
<%=tame %>

session 生命周期

session的生命周期主要依赖于以下几个方式:

  1. session对象是否调用invalidata()方法使session ID 失效;
  2. session 对象是否达到session ID的最长等待时间;
  3. 用户是否关闭浏览器
    在session中,也为开发者提供了很多关于session生命周期的对象于方法,分别为:
ID DA FA
long getCreation Time() 返回session创建的时间
long getLastAccessedTime() 返回session用户最后一次请求的时间
void invalidate() 使session ID失效
void setMaxInactiveInterval() 设置两次请求的间隔时间 默认为秒
boolean isNew() 判断用户是否已经进入服务器创建的session
session 创建时间 (long getCreation Time)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<%@ page import="java.util.*" %>
<%@ page import="java.text.*" %>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
// 获取session的创建时间
Date createTime = new Date(session.getCreationTime());

// 输出session的创建时间
out.println(createTime);
%>
</body>
</html>

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<%@ page import="java.util.*" %>
<%@ page import="java.text.*" %>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
// 获取session的创建时间
long sessiontime = session.getCreationTime();
Date timeout = new Date(sessiontime);
out.println(timeout);
%>
</body>
</html>

需要注意,在此段代码块之中我们引入了<%@ page import="java.util.*"%>包和<%@ page import="java.text.*">。主要用于将获取的session id创建时间转换为Date可读且标准的时间形式。

application

application主要表示应用程序的上下文环境,而application也提供了一个存储数据的支持,而application可以提供一个共享的对象,这弥补了session的存储对象不足的问题。application用于任何用户访问同一个application对象,而生存周期直到服务器关闭这个application才会被取消:

ID DA FA
public void setAttribute(String key, Object obj) 将参数obj保指定保存在key中 key 为所保存对象的一个关键字
public void getAttribute(String key) 获取application中关键字是key 的对象
public void removeAttibute(String key) 从application关键字中删除key所对应的对象
public Enumeration getAttributeNames() 产生一个枚举对象 该对象可以使用nextElements()遍历
getMajorVersion() 获取服务器支持Servlet主版本号
getMinorVersion() 获取服务器支持 Servlet版本号
getServerInfo() Java Server pages Tomcat 版本号

Java Server pages Tomcat 版本号 (getServerInfo)

1
2
<p>Java Server pages Tomcat 版本号</p>
<%=application.getServerInfo()%>

获取当前访问数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
int n = 0;
if (application.getAttribute("num")==null)
n=1;
else {
// 获取application中关键字是num 的对象
String string = application.getAttribute("num").toString();
//
n=Integer.valueOf(string).intValue()+1;
}
application.setAttribute("num",n); // 设置属性的属性值为“num”
out.println("您是:" + application.getAttribute("num") + "位用户");
%>
</body>
</html>

pageContext

pageContext主要表示当前JSP页面上的上下文对象,也表示当前页面运行环境,也就是说,PageContext可以访问本页面所有的session,也可以获取本页面所在的application的某一些属性值,虽然是这样,但是在实际的开发过程之中,很少使用pageContexrt调用对象。。

ID DA
ServletRequest getRequest() 获取当前JSP页面的请求(request)对象
ServletResponse getResponse() 获取当前JSP页面的响应(response)对象
ServletContext getServleContext() 返回当前页面的application对象
HttpSession getSession() 返回当前页的session对象
Object getpPage() 返回当前页的page对象
Exception getException() 返回当前页的Exception对象

获取 session 数据 (getSession)

1
2
3
4
5
6
<%    
// 设定 session 值
session.setAttribute("one","pageContext");
%>
// 输出session值
<%=pageContext.getSession().getAttribute("one") %>

page

page主要表示JSP文件转换为Java文件后的Servlet对象,代表JSP页面本身(即this),因此他可以调用Servlet(服务器连接端)类所定义的方法,在实际的开发过程中,基本上很少使用page对象。

ID DA
getServletInfo() 使用this获取本页面说明信息
((HttpsJspPage)page)getServletInfo() 使用page获取本页的说明信息
getClass() 返回当前Object类
int hashCode 返回Object的hash代码

获取本页面说明信息 (this)

1
2
3
4
5
6
7
8
9
10
11
12
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<%=this.getServletInfo() %>
</body>
</html>

返回当前Object类 (getClass)

1
2
3
4
5
6
7
8
9
10
11
12
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<%=page.getClass() %>
</body>
</html>

config

config即页面配置对象,表示JSP 文件转换JAVA文件后的服务连接器(Servlet)的ServletConfig对象,主要存储一些初始数据。config和page对象一样,相比之前的九大对象很少被用到。

ID DA
getServletName() 获得JSP页面转义后Servlet服务器连接端的对象名
getInitParameter() 返回指定名字的初始参数值

获得JSP页面转义后Servlet服务器连接端的对象名 (getServletName)

1
2
3
4
5
6
7
8
9
10
11
12
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<%=config.getServletName() %>
</body>
</html>

exception

exception主要用于当JSP页面发生错误时将产生异常,而该对象就是用于处理这个异常的,如果JSP页面需要使用该对象,必须将该页面的page指令的inErrorPage属性设置为true,否则无法编译。

ID DA
getMessage() 返回描述异常的消息
toString() 返回关于异常的简短描述消息
printStackTrace() 显示异常及栈轨迹
FillInStackTrace() 重写异常的执行栈轨迹

返回描述异常的消息

NewFile.jsp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<%@ page language="java" contentType="text/html; charset=UTF-8" errorPage="NewFile1.jsp"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
int one = 10;
int two = 0;
%>
<%=
(one/two) // 制造一场错误
%>
</body>
</html>
NewFile1.jsp
1
2
3
4
5
6
7
8
9
10
11
12
13
<%@ page language="java" contentType="text/html; charset=UTF-8" isErrorPage="true"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<p>获取错误</p>
<%=exception.getMessage() %>
</body>
</html>
⬅️ Go back