Javaweb 学习记录—JSP内置对象

Javaweb 学习记录—JSP内置对象

 1.内置对象简介
 JSP内置对象也称隐含对象,是指在JSP页面中,不用声明就可以在脚本和表达式中直接使用的对象。
 JSP内置对象也称隐含对象,它提供了Web开发常用的功能,为了提高开发效率,JSP 规范预定义了内置对象。
 JSP内置对象有如下特点:

  • 内置对象由 Web 容器自动载入,不需要实例化;
  • 内置对象通过 Web容器来实现和管理;
  • 在所有的 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 对象,这类对象主要用来作为客户端和服务器间通信的桥梁。

  • request 对象表示客户端对服务器端发送的请求;
  • response 对象表示服务器对客户端的响应;
  • out 对象负责把处理结果输出到客户端。

(1)request

  • request 对象即请求对象,表示客户端对服务器发送的请求 , 主要用于接受客户端通过 HTTP 协议传送给服务器端的数据;
  • request 对象的类型为 javax.servlet.http.HttpServletRequest ,与Servlet 中的请求对象为同一对象;
  • request 对象的作用域为一次 request请求。
  • request 对象拥有 HttpServletRequest 接口的所有方法,其常用方法如下:
    • void setCharacterEncoding(String charset) :设置请求体参数的解码字符集;
    • String getParameter(String name) :根据参数名获取单一参数值;
    • String[] getParameterValues(String name) :根据参数名获取一组参数值;
    • void setAttribute(String name,Object value) :以名/ / 值的方式存储请求域属性;
    • Object getAttribute(String name):根据属性名获取存储的对象数据。

(2)response

  • response 对象即响应对象,表示服务器对客户端的响应。主要用来将JSP 处理后的结果传回到客户端。 response 对象类型为javax.servlet.http.HttpServletResponse ,与 Servlet 中的响应对象为同一对象。
  • response 对象拥有 HttpServletResponse 接口的所有方法,其常用的方法如下:
    • void setContentType(String name):设置响应内容的类型和字符编码;
    • void sendRedirect(String url) :重定向到指定的 URL 资源。

(3)out

  • out对象即输出对象,用来控制管理输出的缓冲区( buffer )和输出流( output stream)向客户端页面输出数据。
  • out对象类型为javax.servlet.jsp.JspWriter,与 HttpServletResponse接口的getWriter() 方法获得的PrintWriter对象功能相同,并都由java.io.Writer类继承而来。
  • 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对象的输出流中写入数据时,数据会先被存储在缓冲区中,在JSP默认配置下,缓冲区满时会被自动刷新输出。
  • JSP页面通过page指令的autoFlush属性和buffer属性配置缓冲区参数:
    • autoFlush属性表示是否自动刷新,默认值为true;
    • buffer属性表示缓冲区大小,默认值为8kb。 在此配置下,out 对象在输出缓冲区内容每达到8kb后,会自动刷新输出而不会产生异常处理。

演示:在取消自动刷新功能时,页面输出信息超过缓冲区指定大小的情况和使用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();
		}
	%>


运行
Javaweb 学习记录—JSP内置对象_第1张图片
 3.与Context有关的内置对象
 与 Context(上下文)有关的内置对象包括 session、application 和pageContext,其中:

  • session 对象表示浏览器与服务器的会话上下文环境;
  • application 对象表示应用程序上下文环境;
  • pageContext 对象表示当前 JSP页面下文环境。

(1)session

  • session 对象即会话对象,表示浏览器与服务器之间的一次会话。
  • 一次会话的含义是:从客户端浏览器连接服务器开始,在关闭浏览器或主动退出后,会话结束。这个过程可以包含浏览器与服务器之间的多次请求与响应。
  • session 对象的类型为 javax.servlet.http.HttpSession , session对象具有 HttpSession接口的所有方法,其常用方法如下:
    • void setAttribute(String name, Object value) :以名/值对的方式存储session
    • Object getAttribute(String name) :根据属性名获取属性值;
    • void invalidate() :使 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%> <% } %>
"loginValidate.jsp" method="post">

用户名:"text" name="userName" />

密  ; ;码:"password" name="userPassword" />

"submit" value="登陆" />

创建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">安全退出

运行
Javaweb 学习记录—JSP内置对象_第2张图片
Javaweb 学习记录—JSP内置对象_第3张图片
Javaweb 学习记录—JSP内置对象_第4张图片
Javaweb 学习记录—JSP内置对象_第5张图片
(2)application

  • application 对象即应用程序上下文对象,表示当前应用程序运行环境,用以获取应用程序上下文环境中的信息;
  • application 对象在容器启动时实例化,在容器关闭时销毁。作用域为整个 Web容器的生命周期;
  • application 对象实现了 javax.servlet.ServletContext 接口,具有ServletContext 接口的所有功能。application 对象常用方法如下:
    • void setAttribute(String name,Object value) :以名/值对的方式存储application 域属性;
    • Object getAttribute(String name):根据属性名获取属性值;
    • void removeAttribute(String name) :根据属性名从 application域中移除属性。

演示:使用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



	
"MessageBoard.jsp" method="post">

输入您的名字:"text" name="userName" />

输入您的留言:

"submit" value="提交">
<% //解决请求乱码问题 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("您还没有留言"); } %>

运行
Javaweb 学习记录—JSP内置对象_第6张图片
Javaweb 学习记录—JSP内置对象_第7张图片
(3)pageContext

  • pageContext 即页面上下文对象,表示当前页面运行环境,用以获取当前 JSP 页面的相关信息;
  • pageContext 对象作用范围为当前 JSP页面;
  • pageContext对象类型为javax.servlet.jsp.PageContext,pageContext对象可以访问当前JSP页面所有内置对象,访问方法如下表:
方法 方法描述
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范围中获取所有属性的名称
  • 存取域属性的方法 setAttribute () 中 scope 参数被定义为四个常量,分别代表四种作用域范围
    • PAGE_SCOPE = 1 代表page 范围;
    • REQUEST_SCOPE = 2 代表request 范围;
    • SESSION_SCOPE = 3 代表session 范围;
    • APPLICATION_SCOPE = 4 代表application范围.

 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()%>

运行
Javaweb 学习记录—JSP内置对象_第8张图片
(2)config

  • config 对象即页面配置对象,表示当前 JSP 页面翻译后的 Servlet 的ServletConfig 对象,存放着一些初始的数据结构 。
  • config 对象实现于 java.servlet.ServletConfig 接口。config 对象和 page对象一样很少被用到。

 5.与Error有关的内置对象
 与 Error 有关的内置对象只有一个成员: exception 对象。当 JSP 网页有错误时会产生异常, exception 对象就用来对这个异常做处理。

(1)exception

  • exception 对象即异常对象,表示 JSP 页面产生的异常 。
  • 如果 一个 JSP 页面要应用此对象,必须将此页面中 page 指令的isErrorPage 属性值设为 true ,否则无法编译。
  • exception 对象是 java.lang.Throwable的对象。

 6.JSP的四种作用域
 对象的生命周期和可访问性称为作用域(scope),在 JSP 中有四种作用域:页面域、请求域、会话域和应用域。
四种作用域的生命周期和可访问性介绍如下 :

  • 页面域(pageContex),页面域的生命周期是指页面执行期间。存储在页面域的对象只对于它所在页面是可访问的。
  • 请求域( request ),请求域的生命周期是指一次请求过程,包括请求被转发(forward)或者被包含(include)的情况。存储在请求域中的对象只有在此次请求过程中才可以被访问。
  • 会话域(session),会话域的生命周期是指某个客户端与服务器所连接的时间;客户端在第一次访问服务器时创建会话,在关闭浏览器或主动退出后,会话结束。存储在会话域中的对象在整个会话期间(可能包含多次请求)都可以被访问。
  • 应用域(application),应用域的生命周期是指从服务器开始执行服务到服务器关闭为止,是四个作用域中时间最长的。存储在应用域中的对象在整个应用程序运行期间可以被所有 JSP和 Servlet 共享访问,在使用时要特别注意存储数据的大小和安全性,否则可能会造成服务器负载过重和线程安全性问题。

 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%>

运行
Javaweb 学习记录—JSP内置对象_第9张图片
Javaweb 学习记录—JSP内置对象_第10张图片
Javaweb 学习记录—JSP内置对象_第11张图片
 在 Web 应用开发时需要仔细考虑这些对象的作用域,按照对象的需要赋予适合的作用域,不要过大也不要过小。如果为一个只在页面内使用的对象赋予了应用域,这样显然毫无意义。同样,如果访问对象具有太多的限制,那么也会使应用变得更加复杂。因此需要仔细权衡每个对象及其用途,从而准确推断其作用域。

 7.总结

  • JSP 内置对象是指不用声明就可以在 JSP 页面的脚本和表达式中直接使用的对象。
  • request 对象即请求对象,表示客户端向服务器端发送的请求。 request 对象的类型为 javax.servlet.http.HttpServletRequest。
  • response 对象即响应对象,表示服务器对客户端的响应。 response 对象类型为 javax.servlet.http.HttpServletResponse。
  • out 对象即输出对象,用来控制管理输出的缓冲区(buffer)和输出流(output stream)向客户端页面输出数据。out 对象类型为javax.servlet.jsp.JspWriter。
  • session 对象即会话对象,表示浏览器与服务器之间的一次会话。 session 对象的类型为 javax.servlet.http.HttpSession 。
  • application 对象即应用程序上下文对象,表示当前应用程序运行环境,用以获取应用程序上下文环境中的信息。 application 对象类型为javax.servlet.ServletContext 。
  • pageContext 即页面上下文对象,表示当前页面运行环境,用以获取当前 JSP页面的相关信息。 pageContext 对象类型为 javax.servlet.jsp.PageContext 。
  • page 对象即 this ,代表 JSP 本身,更准确地说它代表 JSP 被翻译后的 Servlet ,因此它可以调用 Servlet 类所定义的方法。 page 对象的类型为javax.servlet.jsp.HttpJspPage 。
  • config 对象即页面配置对象,表示当前 JSP 页面翻译后的 Servlet 的ServletConfig 对象,存放着一些初始的数据结构。 config 对象类型为java.servlet.ServletConfig 。
  • exception 对象即异常对象,表示 JSP 页面产生的异常。 exception 对象是java.lang.Throwable。
  • JSP 中有四种作用域:页面域、请求域、会话域和应用域。
  • SP 的四种作用域分别对应 pageContex 、 request 、 session 和 application 四个内置对象。四个内置对象都通过 setAttribute(String name,Objectvalue) 方法来存储属性,通过 getAttribute(String name) 来获取属性,从而实现属性对象在不同作用域的数据分享。

你可能感兴趣的:(Javaweb 学习记录—JSP内置对象)