jsp九大内置对象是容器自动创建的隐式对象,包括request(封装http请求)、response(控制响应)、session(维持会话)、application(全局共享)、out(输出内容)、pagecontext(统一访问其他对象)、config(读取初始化参数)、page(当前servlet实例)和exception(错误页异常),分别对应servlet api中相应接口实例,作用域涵盖page、request、session、application四级。

要快速掌握JSP页面中无需声明就能直接调用的九大对象各自承担什么职责,必须区分它们的来源、作用域和典型使用场景。每个对象对应Servlet规范中的具体接口实例,且容器在页面编译时自动注入,不可手动new,也不可重命名。
request:封装一次HTTP请求的全部输入
它是HttpServletRequest实例,生命周期仅限于当前请求。用户提交的表单参数、URL查询字符串、请求头、Cookie、上传文件流等,全靠它获取。
常用操作:用request.getParameter("username")取文本框值;用request.getAttribute("userObj")取前一个Servlet转发过来的对象;用request.setCharacterEncoding("UTF-8")解决中文乱码——【这一步必须在第一次调用getParameter()之前执行,否则无效】。
注意:request.setAttribute()设的值只能被同一请求链路中的后续JSP或Servlet读到,跳转后即失效。
response:控制服务器返回给浏览器的内容
它是HttpServletResponse实例,作用域为当前JSP页面执行期。所有输出行为——设置响应头、重定向、写入二进制流、指定字符编码——都由它驱动。
方法一:设置响应类型与编码:response.setContentType("text/html; charset=UTF-8"),此行必须出现在任何out.print()之前,否则浏览器可能解析错乱。
方法二:强制跳转:response.sendRedirect("login.jsp"),该操作会清空缓冲区并发送302状态码,【执行后JSP后续代码仍会运行,需加return或if拦截】。
session:维持用户登录态与跨请求数据
它是HttpSession实例,由容器在用户首次访问时创建,ID存于Cookie或URL中。只要浏览器不关闭且未超时,同一浏览器窗口内所有请求共享该session。
第一步:存用户信息:session.setAttribute("loginUser", user),此处user可以是任意Java对象,包括List、Map甚至自定义类。
第二步:取值判断登录:if (session.getAttribute("loginUser") == null) { response.sendRedirect("login.jsp"); return; }。
第三步:销毁会话:session.invalidate(),登出时调用,清除所有属性并使ID失效。
application:全局共享资源的容器
它是ServletContext实例,整个Web应用只有一个,从服务器启动到关闭始终存在。适合存配置项、计数器、数据库连接池引用等长期有效数据。
例如:application.setAttribute("onlineCount", 1024),所有用户看到的是同一个值;application.getRealPath("/WEB-INF/config.txt")可获取服务器上真实文件路径。
注意:application修改操作非线程安全,多用户并发写入需自行加锁,比如用synchronized块包裹setAttribute。
out:向客户端输出HTML内容的专用通道
它是JspWriter对象,不是PrintWriter,底层带缓冲机制。JSP中所有表达式和最终都经由它写出。
关键点:调用out.flush()会强制把缓冲区内容发送给浏览器;out.clearBuffer()清空缓冲但不发送;out.close()不可手动调用——JSP容器会在页面执行结束时自动关闭,手动调用会导致后续输出异常。
pageContext:获取其他八大对象的统一入口
它是PageContext抽象类实例,唯一能通过它拿到request、response、session、application、out、config、page、exception这八个对象——例如pageContext.getRequest()等价于request变量本身。
更实用的是它的四大域查找能力:pageContext.findAttribute("name")会按page→request→session→application顺序搜索,省去逐个判断。
还可用于包含其他页面:pageContext.include("header.jsp"),效果类似<include></include>指令。
config:读取当前JSP或Servlet初始化参数
它是ServletConfig对象,封装了web.xml中为该JSP或Servlet配置的<init-param></init-param>。例如在web.xml里为某个JSP配了<param-name>cacheTime</param-name><param-value>3600</param-value>,则可用config.getInitParameter("cacheTime")读取。
注意:JSP中config默认不可见,需先通过pageContext.getServletConfig()获取,再调用getInitParameter方法。
page:代表当前JSP编译后的Servlet实例本身
它是当前页面对应的Servlet对象引用,类型为java.lang.Object,等价于Java中的this。极少单独使用,但在需要反射调用当前Servlet方法或获取其class时才显价值。
例如:page.getClass().getName()返回类似org.apache.jsp.index_jsp的类名;page.toString()输出该Servlet实例的内存地址。
exception:专用于错误处理页面捕获异常信息
它仅在page指令中设置了isErrorPage="true"的JSP中可用,类型为java.lang.Throwable。普通JSP里直接写exception.getMessage()会编译失败。
典型用法:开头,然后<p>错误原因:</p>,配合输出完整堆栈。









