1.内置对象简介
JSP内置对象也称隐含对象,是指在JSP页面中,不用声明就可以在脚本和表达式中直接使用的对象。
JSP内置对象也称隐含对象,它提供了Web开发常用的功能,为了提高开发效率,JSP 规范预定义了内置对象。
JSP内置对象有如下特点:
JSP 规范定义了9种内置对象
对象名称 | 类型 | 功能说明 |
---|---|---|
request | javax.servlet.http.HttpServletRequest | 请求对象,提供客户端HTTP请求数据的访问 |
response | javax.servlet.http.HttpServletResponse | 响应对象,用来向客户端输出响应 |
out | javax.servlet.jsp.JspWriter | 输出对象,提供对输出流的访问 |
session | javax.servlet.http.HttpSession | 会话对象,用来保存服务器与每个客户端会话过程中的信息 |
application | javax.servlet.ServletContext | 应用程序对象,用来保存整个应用环境的信息 |
pageContext | javax.servlet.jsp.PageContext | 页面上下文对象,用于存储当前JSP页面的相关信息 |
config | javax.servlet.ServletConfig | 页面配置对象,JSP页面的配置信息对象 |
page | javax.servlet.jsp.HttpJspPage | 当前JSP页面对象,即this |
exception | java.lang.Throwable | 异常对象,用于处理JSP页面中的错误 |
2.与 Input/Output 有关的内置对象
与 Input/Output (输入/ / 输出)有关的隐含对象包括: request 对象、response 对象和 out 对象,这类对象主要用来作为客户端和服务器间通信的桥梁。
(1)request
(2)response
(3)out
out内置对象
方法 | 描述 |
---|---|
print/println(基本数据类型) | 输出一个基本数据类型的值 |
print/println(Object obj) | 输出一个对象的引用地址 |
print/println(String str) | 输出一个字符串的值 |
newLine() | 输出一个换行符 |
示例:
<%
int i=0;
java.util.Date date=new java.util.Date();
out.print(i);
out.newLine();
out.println(date);
%>
out对象缓冲区的方法及描述
方法 | 方法描述 |
---|---|
void clear() | 清除输出缓冲区的内容。若缓冲区为空,则产生IOException异常 |
void clearBuffer() | 清除输出缓冲区的内容。若缓冲区为空,不会产生IOException异常 |
void flush() | 直接将目前暂存于缓冲区的数据刷新输出 |
void close() | 关闭输出流。流一旦被关闭,则不能再使用out对象做任何操作。 |
int getBufferSize() | 获取目前缓冲区的大小(KB) |
int getRemaining() | 获取目前使用后还剩下的缓冲区大小(KB) |
boolean isAutoFlush() | 返回true表示缓冲区满时会自动刷新输出;false表示缓冲区满时不会自动清除并产生异常处理 |
演示:在取消自动刷新功能时,页面输出信息超过缓冲区指定大小的情况和使用out.flush()刷新方法后的情况。
创建outExample.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" autoFlush="false" buffer="2kb"%>
"UTF-8">
Insert title here
<%
for (int i = 0; i < 10000; i++) {
out.println("**************");
//out.flush();
}
%>
运行
3.与Context有关的内置对象
与 Context(上下文)有关的内置对象包括 session、application 和pageContext,其中:
(1)session
演示:
创建login.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
"UTF-8">
Insert title here
<%-- 错误信息判断输出 --%>
<%
String error = (String) request.getAttribute("eMess");
if (error != null && !error.equals("")) {
%>
"red"><%=error%>
<%
}
%>
创建loginParameter.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
"UTF-8">
Insert title here
<%
request.setCharacterEncoding("utf-8");
String uName = request.getParameter("userName");
String uPassword = request.getParameter("userPassword");
out.print("参数userName的值为:" + uName);
out.print("参数userPassword的值为:" + uPassword);
%>
创建loginValidate.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
"UTF-8">
Insert title here
<%
request.setCharacterEncoding("utf-8");
String uName = request.getParameter("userName");
String uPassword = request.getParameter("userPassword");
StringBuffer errorMsg = new StringBuffer();
if ("".equals(uName)) {
errorMsg.append("用户名不能为空!
");
}
if ("".equals(uPassword)) {
errorMsg.append("密码不能为空!
");
} else if (uPassword.length() < 6) {
errorMsg.append("密码长度不能小于6位
");
}
//判断是否登陆成功
if (errorMsg.toString().equals("")) {
//out.print("登陆成功");
session.setAttribute("userName", uName);
response.sendRedirect("main.jsp");
} else {
request.setAttribute("eMess", errorMsg.toString());
%>
<jsp:forward page="login.jsp">jsp:forward>
<%
}
%>
创建main.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
"UTF-8">
Insert title here
亲,欢迎您<%=(String) session.getAttribute("userName")%>。
"logout.jsp">安全退出
演示:使用application对象实现简单的页面留言板
创建MessageBoard.jsp
<%@page import="java.util.Vector"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
"UTF-8">
Insert title here
<%
//解决请求乱码问题
request.setCharacterEncoding("utf-8");
//获取form表单提交数据
String userName = request.getParameter("userName");
String message = request.getParameter("message");
//从application获取保存信息的集合
Vector bookGuest = (Vector) application.getAttribute("messageBook");
//判断是否已有留言
if (bookGuest == null) {
bookGuest = new Vector<>();
}
//保存该次用户留言
if (userName != null && message != null) {
String info = userName + "#" + message;
bookGuest.add(info);
application.setAttribute("messageBook", bookGuest);
}
//遍历集合,输出所有留言
if (bookGuest.size() > 0) {
for (String mess : bookGuest) {
String[] arr = mess.split("#");
out.print("姓名为:"
+ arr[0] + "
留言:" + arr[1] + "");
}
} else {
out.print("您还没有留言");
}
%>
方法 | 方法描述 |
---|---|
ServletRequest getRequest() | 获取当前JSP页面的请求对象 |
ServletResponse getResponse() | 获取当前JSP页面的响应对象 |
HttpSession getSession() | 获取和当前JSP页面有联系的会话对象 |
ServletConfig getServletConfig() | 获取当前JSP页面的ServletConfig对象 |
ServletContext getServletContext() | 获取当前JSP页面的运行环境对象 |
Object getPage() | 获取当前JSP页面的Servlet实体 |
Exception getException() | 获取当前JSP页面的异常对象,不过此页面的page指令的isErrorPage属性要设置为true |
JspWriter getOut() | 获取当前JSP页面的输出流 |
pageContext 对象 存取域 属性的方法及描述
方法 | 方法描述 |
---|---|
Object getAttribute(String name, int scope) | 获取范围为scope,名为name的属性对象 |
void setAttribute(String name, Object value, int scope) | 以名/值对的方式存储scope范围域属性 |
void removeAttribute(String name, int scope) | 从scope范围移除名为name的属性 |
Enumeration getAttributeNamesInScope(int scope) | 从scope范围中获取所有属性的名称 |
4.与Servlet 有关的内置对象
与Servlet有关的内置对象,它们包括page对象和config对象。Page对象表示JSP翻译后的Servlet对象; config 对象表示JSP翻译后的Servlet的ServletConfig对象。
(1)page
page 对象即 this,代表 JSP 本身,更准确地说它代表 JSP 被翻译后的Servlet ,因此它可以调用 Servlet 类所定义的方法。 page 对象的类型为 javax.servlet.jsp.HttpJspPage ,在实际应用中, page 对象很少在 JSP 中使用。
演示:
page对象获取页面page指令的info属性指定的页面说明信息
创建pageExample.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" info="page内置对象的使用"%>
"UTF-8">
Insert title here
<%=this.getServletInfo()%>
<%=((HttpJspPage) page).getServletInfo()%>
5.与Error有关的内置对象
与 Error 有关的内置对象只有一个成员: exception 对象。当 JSP 网页有错误时会产生异常, exception 对象就用来对这个异常做处理。
(1)exception
6.JSP的四种作用域
对象的生命周期和可访问性称为作用域(scope),在 JSP 中有四种作用域:页面域、请求域、会话域和应用域。
四种作用域的生命周期和可访问性介绍如下 :
JSP的四种作用域分别对应pageContex 、request 、session和application四个内置对象。四个内置对象都通过setAttribute (String name ,Object value) 方法来存储属性,通过getAttribute (String name) 来获取属性,从而实现属性对象在不同作用域的数据分享。
演示:
创建visitCount.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
"UTF-8">
Insert title here
<%
int pageCount = 1;
int sessionCount = 1;
int applicationCount = 1;
//页面域计数
if (pageContext.getAttribute("pageCount") != null) {
pageCount = (Integer) pageContext.getAttribute("pageCount");
pageCount++;
}
pageContext.setAttribute("pageCount", pageCount);
//会话域计数
if (session.getAttribute("sessionCount") != null) {
sessionCount = (Integer) session.getAttribute("sessionCount");
sessionCount++;
}
session.setAttribute("sessionCount", sessionCount);
//应用域计数
if (application.getAttribute("applicationCount") != null) {
applicationCount = (Integer) application.getAttribute("applicationCount");
applicationCount++;
}
application.setAttribute("applicationCount", applicationCount);
%>
页面域计数:<%=pageCount%>
会话域计数:<%=sessionCount%>
应用域计数:<%=applicationCount%>
运行
在 Web 应用开发时需要仔细考虑这些对象的作用域,按照对象的需要赋予适合的作用域,不要过大也不要过小。如果为一个只在页面内使用的对象赋予了应用域,这样显然毫无意义。同样,如果访问对象具有太多的限制,那么也会使应用变得更加复杂。因此需要仔细权衡每个对象及其用途,从而准确推断其作用域。
7.总结