jsp有哪些内置对象:9个对象详解
jsp有哪些内置对象,标准JSP一共提供9个内置对象,不需要手动new实例,JSP容器自动创建,可直接在脚本和表达式中调用,分别是request、response、session、application、page、pageContext、out、config、exception;不同对象负责不同通信域,request单次请求有效,session单用户会话周期有效,application作用于整个Web项目,exception仅在isErrorPage属性设为true的错误页面可用,普通JSP页面直接调用exception会抛出异常,这套体系适配JavaWebServlet规范,Tomcat、Jetty等主流容器都支持,学习JavaWeb开发、软考Java方向都会考察这组内置对象的作用域与常用方法。
jsp内置对象基础定义与作用域
request对应HttpServletRequest类型,承载浏览器发送的单次请求数据,你可以读取表单参数、请求头、客户端地址,作用域只覆盖一次用户请求,请求转发时对象可以保留,页面重定向会生成全新request实例。response对应HttpServletResponse,用来向客户端输出响应数据,设置响应头、跳转页面、写入cookie,页面输出内容底层都由response控制。session类型为HttpSession,保存单个用户会话数据,浏览器未关闭、会话未超时前数据持续存在,不同用户拥有独立session实例,服务器默认超时时间一般为30分钟。
application是ServletContext实例,全局Web应用对象,所有访问项目的用户共享同一个application,适合存放全局配置、网站统计数据,服务器重启后存储的数据会清空。page代表当前JSP页面本身,等价于this关键字,类型是Object,开发中使用频率很低。pageContext是JSP上下文核心对象,可以获取其他全部内置对象,同时管理四个作用域属性,page、request、session、application域都能通过它读写,是内置对象的统一入口。
out属于JspWriter类型,负责页面文本输出,直接在页面打印内容,自带缓冲区,缓冲区满或者页面结束时,内容才会推送给浏览器。config对应ServletConfig,读取当前JSP在web.xml中配置的初始化参数,项目极少使用。exception用来捕获页面抛出的异常,仅开启错误页标记后才能使用,普通页面调用会触发编译错误。
jsp内置对象作用域对比
| 内置对象 | 作用域范围 | 生命周期 | 常用场景 |
|---|---|---|---|
| page | 当前页面 | 页面执行结束销毁 | 页面局部临时变量 |
| request | 单次请求 | 请求处理完成销毁 | 表单传参,请求转发传值 |
| session | 单个用户会话 | 会话超时或手动销毁 | 登录状态,用户临时信息 |
| application | 整个Web应用 | 服务器启停 | 全局共享数据 |
选作用域优先遵循最小范围原则,能用request就不用session,能用session就不用application,减少服务器内存占用,降低多用户并发下的数据错乱概率。把用户登录信息存入application会造成所有用户共用登录状态,这是高频错误写法,上线后会出现用户串号的问题。
pageContext的独有能力,跨域读写属性。
pageContext可以统一调用setAttribute和getAttribute方法,第二个参数指定作用域常量,就能在四个域存取数据,不用分别调用各个对象的属性方法。你在开发过滤器、自定义标签时,pageContext是最常用对象,普通业务页面直接使用request、session即可,不必强行使用pageContext读写属性,会增加代码理解成本。
exception对象使用有硬性限制,必须在页面指令添加isErrorPage="true",否则无法编译。这个对象只能拿到当前页面抛出的异常堆栈,不能捕获其他页面的异常,需要搭配errorPage页面指令,在业务页面指定跳转的错误页面,才能把异常传递过去。生产环境不建议直接在页面打印exception堆栈信息,会泄露项目包结构、代码路径,容易被攻击者收集信息。
JSP内置对象本质是Servlet实例的封装,JSP页面编译后会转换成Servlet,内置对象就是Servlet中的局部变量,由容器自动实例化,不需要开发者手动创建对象。JSP2.0之后推荐使用EL表达式替代脚本直接操作内置对象,减少页面Java代码,降低维护难度,但是底层仍然依赖这9个内置对象提供数据。
JavaWeb相关考试,如计算机技术与软件专业技术资格考试,在Web程序设计考点,经常考察内置对象数量、对象对应的类型、作用域区分,你记忆时优先区分4个作用域对象,再记剩下5个辅助对象,就能覆盖绝大多数考题。
