前言
只有光头才能变强。
文本已收录至我的GitHub仓库,欢迎Star:https://github.com/ZhongFuCheng3y/3y
什么是JSP内置对象
JSP引擎在调用JSP对应的jspServlet时,会传递或创建9个与web开发相关的对象供jspServlet使用。JSP技术的设计者为便于开发人员在编写JSP页面时获得这些web对象的引用,特意定义了9个相应的变量,开发人员在JSP页面中通过这些变量就可以快速获得这9大对象的引用
细心的朋友会发现,我们没有在JSP页面上定义过out对象,却可以直接使用!其实out对象就是JSP内置对象之一。
九个内置对象:
out对象
out对象的API


request

response

config

session

注意:在page指令配置如下信息,session将不可使用
<%@page session="false" %>
application

page
exception
<%@ page contentType="text/html;charset=UTF-8" language="java" errorPage="error.jsp" %><html><head> <title></title></head><body><%--模拟空指针异常的错误--%><% String sss = null; sss.length();%></body></html>"java" errorPage="error.jsp" %>
<html>
<head>
<title></title>
</head>
<body>
<%--模拟空指针异常的错误--%>
<%
String sss = null;
sss.length();
%>
</body>
</html>
<%@ page contentType="text/html;charset=UTF-8" language="java" isErrorPage="true" %><html><head> <title>错误页面</title></head><body><% out.println("程序抛出了异常:" + exception);%></body></html>"java" isErrorPage="true" %>
<html>
<head>
<title>错误页面</title>
</head>
<body>
<%
out.println("程序抛出了异常:" + exception);
%>
</body>
</html>

pageContext
pageContext是内置对象中最重要的一个对象,它代表着JSP页面编译后的内容(也就是JSP页面的运行环境)!
pageContext获取8个内置对象
<%@ page contentType="text/html;charset=UTF-8" language="java" %><html><head> <title>获取八大内置对象</title></head><body><% System.out.println(pageContext.getSession()); System.out.println(pageContext.getRequest()); System.out.println(pageContext.getResponse()); System.out.println(pageContext.getException()); System.out.println(pageContext.getPage()); System.out.println(pageContext.getServletConfig()); System.out.println(pageContext.getServletContext()); System.out.println(pageContext.getOut());%></body></html>"java" %>
<html>
<head>
<title>获取八大内置对象</title>
</head>
<body>
<%
System.out.println(pageContext.getSession());
System.out.println(pageContext.getRequest());
System.out.println(pageContext.getResponse());
System.out.println(pageContext.getException());
System.out.println(pageContext.getPage());
System.out.println(pageContext.getServletConfig());
System.out.println(pageContext.getServletContext());
System.out.println(pageContext.getOut());
%>
</body>
</html>

pageContext作为域对象
<%@ page contentType="text/html;charset=UTF-8" language="java" %><html><head> <title>使用page域对象</title></head><body><% pageContext.setAttribute("name", "zhongfucheng");%><% String value = (String) pageContext.getAttribute("name"); System.out.println(value);%></body></html>"java" %>
<html>
<head>
<title>使用page域对象</title>
</head>
<body>
<%
pageContext.setAttribute("name", "zhongfucheng");
%>
<%
String value = (String) pageContext.getAttribute("name");
System.out.println(value);
%>
</body>
</html>

<%@ page contentType="text/html;charset=UTF-8" language="java" %><html><head> <title>request域对象设置属性</title></head><body><% //这是request域对象保存的内容 request.setAttribute("name","zhongfucheng");%><%--跳转到1.jsp中--%><jsp:forward page="1.jsp"/></body></html>"java" %>
<html>
<head>
<title>request域对象设置属性</title>
</head>
<body>
<%
//这是request域对象保存的内容
request.setAttribute("name","zhongfucheng");
%>
<%--跳转到1.jsp中--%>
<jsp:forward page="1.jsp"/>
</body>
</html>
<%@ page contentType="text/html;charset=UTF-8" language="java" %><html><head> <title>在page域对象获取属性</title></head><body><% //企图获取request域对象存进的属性 String value = (String) pageContext.getAttribute("name"); System.out.println(value);%></body></html>"java" %>
<html>
<head>
<title>在page域对象获取属性</title>
</head>
<body>
<%
//企图获取request域对象存进的属性
String value = (String) pageContext.getAttribute("name");
System.out.println(value);
%>
</body>
</html>

<%@ page contentType="text/html;charset=UTF-8" language="java" %><html><head> <title>在page域对象获取request域对象的属性</title></head><body><% //使用重载的方法获取request域对象的属性 String value = (String) pageContext.getAttribute("name",pageContext.REQUEST_SCOPE); System.out.println(value);%></body></html>"java" %>
<html>
<head>
<title>在page域对象获取request域对象的属性</title>
</head>
<body>
<%
//使用重载的方法获取request域对象的属性
String value = (String) pageContext.getAttribute("name",pageContext.REQUEST_SCOPE);
System.out.println(value);
%>
</body>
</html>

<%@ page contentType="text/html;charset=UTF-8" language="java" %><html><head> <title>使用findAttribute</title></head><body><% //使用findAttribute查找2.jsp中request域对象的属性 String value = (String) pageContext.findAttribute("name"); System.out.println(value);%></body></html>"java" %>
<html>
<head>
<title>使用findAttribute</title>
</head>
<body>
<%
//使用findAttribute查找2.jsp中request域对象的属性
String value = (String) pageContext.findAttribute("name");
System.out.println(value);
%>
</body>
</html>

引入和跳转
PageContext类中定义了一个forward方法和两个include方法来分别简化和替代RequestDispatcher.forward方法和include方法。

4种属性范围
到目前为止,我们已经学了4种属性范围了。
page【只在一个页面中保存属性,跳转页面无效】
requet【只在一次请求中保存属性,服务器跳转有效,浏览器跳转无效】
session【在一个会话范围中保存属性,无论何种跳转均有效,关闭浏览器后无效】
application【在整个服务器中保存,所有用户都可以使用】
setAttribute(String name, Object o )
getAttribute(String name)
removeAttribute(String name)
应用场景
request:如果客户向服务器发请求,产生的数据,用户看完就没用了,像这样的数据就存在request域,像新闻数据,属于用户看完就没用的
session:如果客户向服务器发请求,产生的数据,用户用完了等一会儿还有用,像这样的数据就存在session域中,像购物数据,用户需要看到自己购物信息,并且等一会儿,还要用这个购物数据结帐
servletContext:如果客户向服务器发请求,产生的数据,用户用完了,还要给其它用户用,像这样的数据就存在servletContext域中,像聊天数据
最后
乐于输出干货的Java技术公众号:Java3y。公众号内有200多篇原创技术文章、海量视频资源、精美脑图,不妨来关注一下!
