2.6 JSP脚本中的9个内置对象
2.6 JSP脚本中的9个内置对象
JSP
脚本中包含9个内置对象,这9个内置对象都是Servlet API
接口的实例,只是JSP
规范对它们进行了默认初始化(由JSP
页面对应Servlet
的_jspService
方法来创建这些实例)。也就是说,它们已经是对象,可以直接使用。9个内置对象依次如下
application
javax.servlet.ServletContext
的实例,该实例代表JSP
所属的Web
应用本身,可用于JSP
页面,或者在Servlet
之间交换信息。
常用的方法有:
getAttribute(String attName)
、setAttribute(String attName, String att Value)
getInitParameter(String paramName)
config
javax.servlet.ServletConfig
的实例,该实例代表该JSP
的配置信息。
常用的方法有:getInitParameter(String paramName)
,getInitParameterNames()
等方法。
事实上,JSP
页面通常无须配置,也就不存在配置信息。因此,该对象更多地在Servlet
中有效。
exception
java.lang.Throwable
的实例,该实例代表其他页面中的异常和错误。只有当页面是错误处理页面,即编译指令page
的isErrorPage
属性为true
时,该对象才可以使用。
常用的方法有:getMessage()
和printStackTrace()
等。
out
javax.servlet.jsp.JspWriter
的实例,该实例代表JSP
页面的输出流,用于输出内容,形成HTML
页面。
page
代表该页面本身,通常没有太大用处。也就是Servlet
中的this
,其类型就是生成的Servlet
类,能用page
的地方就可用this
pageContext
javax.servlet.jsp.PageContext
的实例,该对象代表该JSP
页面上下文,使用该对象可以访问页面中的共享数据。
常用的方法有:getServletContext()
和getServletConfig()
等。
request
javax.servlet.http.HttpServletRequest
的实例,该对象封装了一次请求,客户端的请求参数都被封装在该对象里。这是一个常用的对象,获取客户端请求参数必须使用该对象。
常用的方法有:
getParameter(String paramName)
、getParameterValues(String paramName)
、setAttribute(String attrName, Object attrValue)
、getAttribute(String attrName)
setCharacterEncoding(String env)
。
response
javax.servlet.http.HttpServletResponse
的实例,代表服务器对客户端的响应。通常很少使用该对象直接响应,而是使用out
对象,除非需要生成非字符响应。而response
对象常用于重定向。
常用的方法有:
getOutputStream()
、sendRedirect(java.lang.String location)
。
session
javax.servlet.http.HttpSession
的实例,该对象代表一次会话。当客户端浏览器与站点建立连接时,会话开始;当客户端关闭浏览器时,会话结束。
常用的方法有:
getAttribute(String attrName)
、setAttribute(String attrName, Object attrValue)
。
_jspService方法源码
进入Tomcat
的\work\Catalina\localhost\directive\org\apache\jsp
路径下,打开任意一个JSP
页面对应生成的Servlet
类文件,看到如下代码片段:
...... public void _jspService(final javax.servlet.http.HttpServletRequest request, final javax.servlet.http.HttpServletResponse response) throws java.io.IOException, javax.servlet.ServletException { ...... final javax.servlet.jsp.PageContext pageContext; javax.servlet.http.HttpSession session = null; final javax.servlet.ServletContext application; final javax.servlet.ServletConfig config; javax.servlet.jsp.JspWriter out = null; final java.lang.Object page = this; javax.servlet.jsp.JspWriter _jspx_out = null; javax.servlet.jsp.PageContext _jspx_page_context = null; try { response.setContentType("text/html; charset=UTF-8"); pageContext = _jspxFactory.getPageContext(this, request, response, "", true, 8192, true); _jspx_page_context = pageContext; application = pageContext.getServletContext(); config = pageContext.getServletConfig(); session = pageContext.getSession(); out = pageContext.getOut(); _jspx_out = out; ...... } ......
几乎所有的JSP
页面编译后Servlet
类都有如上所示的结构,上面Servlet
类的粗体字代码表明:request
、response
两个对象是_jspService
方法的形参,当Tomcat
调用该方法时会初始化这两个对象。
而page
、pageContext
、application
、config
、session
、out
都是_jspService
方法的局部变量,由该方法完成初始化。
JSP内置对象_jspService方法的形参或局部变量
通过上面的代码不难发现JSP
内置对象的实质:它们要么是_jspService
方法的形参,要么是_jspService
方法的局部变量,所以可以直接在JSP
脚本(脚本将对应于Servlet
的jspService
方法部分)中调用这些对象,无须创建它们。
JSP内置对象智能用于JSP小脚本,JSP输出表达式,不能用于JSP声明
由于JSP
内置对象都是在_jspService
方法中完成初始化的,因此只能在JSP
小脚本、JSP
输岀表达式中使用这些内置对象。千万不要在JSP
声明中使用它们!否则,系统将提示找不到这些变量。当编写JSP
页面时,一定不要仅停留在JSP
页面本身来看问题,这样可能导致许多误解,导致无法理解JSP
的运行方式。很多书籍上随意介绍这些对象,也是形成误解的原因之一
只有异常处理页面对应的Servlet中才会初始化exception对象
细心的读者可能已经发现了:上面的代码中并没有exception
内置对象,这与前面介绍的正好相符只有当页面的page
指令的isErrorPage
属性为true
时,才可使用exception
对象。也就是说,只有异常处理页面对应的Servlet
中才会初始化exception
对象