JSP有以下九种内置对象,包括:
request,请求对象
response,响应对象
pageContext,页面上下文对象
session,会话对象
application,应用程序对象
out,输出对象
config,配置对象
page,页面对象
exception,异常对象
从本质上讲,JSP的这些内置对象其实都是由特定的Java类所产生的,在服务器运行时根据情况自动生成。
对象名 |
类型 |
作用域 |
request |
javax.servlet.ServletRequest |
Request |
response |
javax.servlet.ServletResponse |
Page |
pageContext |
javax.servlet.jsp.PageContxt |
Page |
session |
javax.servlet.http.HttpSession |
Session |
application |
javax.servlet.ServletContext |
Application |
out |
javax.servlet.jsp.JspWriter |
Page |
config |
javax.servlet.ServletConfig |
Page |
page |
java.lang.Object |
Page |
exception |
java.lang.Throwable |
Page |
request对象代表的是来自客户端的请求,例如在form表单中填写的信息等,是最常用的对象。
关于它的方法使用较多的是getParameter、getParameterNames和getParameterValues,通过调用这几个方法来获取请求对象中所包含的参数的值。
request的setAttribute与getAttribute方法一般都是成对出现的,首先通过setAttribute方法设置属性与属性值,然后通过getAttribute方法根据属性获取到与该属性对应的对象值。
setAttribute与getAttribute方法都是在服务器端内部执行的,客户端不知道服务器端是否执行过这两个方法。
request的getParameter方法的作用是获取到客户端通过表单或url请求参数发送过来的参数值,是客户端与服务器端之间的交互,服务器端要想获取到客户端发送过来的数据,就需要使用getParameter方法来获取。
没有与getParameter方法对应的setParameter方法。
request对象内数据的存活范围就是在request对象的存活范围内,当客户端想服务器端发送一个请求,服务器向客户端返回一个响应后,该请求对象就被销毁了;
之后再向服务器端发送新的请求时,服务器会创建新的request对象,该request对象与之前的request对象没有任何关系,因此也无法获得在之前的request对象中所存放的任何数据。
response对象代表的是对客户端的响应,也就是说可以通过response对象来组织发送到客户端的数据。
但是由于组织方式比较底层,所以不建议一般人使用。
需要向客户端发送文字时直接用out对象即可。
session对象代表服务器与客户端所建立的会话,当需要在不同的JSP页面中保留客户信息的情况下使用,比如在线购物、客户轨迹跟踪等。
HTTP是无状态协议;
Web Server对每一个客户端请求都没有历史记忆;
session用来保存客户端状态信息。
浏览器不关闭,session对象会一直存在(姑且这样认为),且session对象只有一个。
如果浏览器关闭重启,会创建新的session对象。
application对象负责提供应用程序在服务器中运行时的一些全局信息,常用的方法有getMimeType和getRealPath等。
运用实例:网页访问计数器。
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <base href="<%=basePath%>"> <title>My JSP 'Counter.jsp' starting page</title> <meta http-equiv="pragma" content="no-cache"> <meta http-equiv="cache-control" content="no-cache"> <meta http-equiv="expires" content="0"> <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> <meta http-equiv="description" content="This is my page"> <!-- <link rel="stylesheet" type="text/css" href="styles.css"> --> </head> <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>
运行结果就是访问到该页面之后显示你是第几位访客,刷新之后数目会增加,更换浏览器或者更换客户端地址都会使其访问值正常递增。
application的存活范围比request和session都要大。
只要服务器没有关闭,application对象中的数据就会一直存在,在整个服务器的运行过程当中,application对象只有一个,它会被所有的用户共享。
其中getRealPath这个方法可以获取资源在服务器上的物理路径(绝对路径),常用来获取上传文件时要存储文件的路径。
out对象代表了向客户端发送数据的对象,与response对象不同,通过out对象发送的内容将是浏览器需要显示的内容,是文本一级的,可以通过out对象直接向客户端写一个由程序动态生成的HTML文件。
常用的方法除了print和println之外,还包括clear、clearBuffer、flush、getBufferSize和getRemaining,这是因为out对象内部包含了一个缓冲区,所以需要一些对缓冲区进行操作的方法。