application:javax.servlet.ServletContext实例,代表JSP所属的WEB应用本身,可以用于JSP页面或在Servlet之间的信息交换
常用方法:getAttribute、setAttribute、getInitParameter
config:javax.servlet.servletConfig实例,该实例代表该JSP的配置信息。实际上,JSP页面无需配置,所以更多在Servlet上有效
常用方法:getInitParameter、getInitParameternames
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.PageCOntext实例,代表该JSP页面上下文,使用该对象可以访问页面中的共享数据。
常用方法:getServletContext、getServletConfig
request:javax.servlet.http.HttpServletRequest实例,该对像封装了一次请求,客户端的请求参数都在该对象中,获取客户端请求参数必须使用该参数
常用方法:getParameter、getParameterValues、setAttribute、getAttribute、setCharacterEncoding
response: javax.servlet.http.HttpServletResponse实例,代表服务器对客户端的相应,通常很少使用该对象直接响应,而是使用out对象,除非需要生成非字符响应
常用方法:getOutputStream、sendRedirect
session:javax.servlet.http.HttpSession实例,代表一次会话。当客户端浏览器与站点建立连接,会话开始;当客户端关闭浏览器,会话结束
常用方法:getAttribute、setAttribute
这9个内置对象都是ServletAPI接口的实例,只是JSP规范对它们进行了默认初始化(由_jspService()方法来创建这些实例)。
打开任一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, null, true, 8192, true); _jspx_page_context = pageContext; application = pageContext.getServletContext(); config = pageContext.getServletConfig(); session = pageContext.getSession(); out = pageContext.getOut(); _jspx_out = out; 通过以上代码可以看出JSP内置对象的实质:要么是_jspServic()方法的形参,要么是_jspService()方法的局部变量,所以可以直接在JSP脚本调用这些对象,无须创建它们。 上述代码之所以没有exception内置对象,是因为只有异常处理页面对应的Servlet才会初始化exception对象。作用一:让多个JSP、Servlet共享数据
通过setAttribute(String attrName,Object value)方法设置属性,该属性的值对整个Web应用有效,访问属性的方法为getAttribute(String attrName)。setAttribute()方法示例 <!-- 将i值自加后放入application的变量内 --> <% application.setAttribute("counter",String.valueOf(++i)); %> 可以把application理解成一个Map对象,任何JSP、servlet都可以把某个变量放入application中保存,并为之指定一个属性名;而该应用的其他JSP、Servlet就可以根据属性名来得到这个变量。运行结果:
从上面可以看出,写在后面的cccc在运行后却到了前面,这是因为直到JSP页面结束,out对象输入缓冲区的数据才真正写入到Servlet引擎提供的缓冲区中,而response.getWriter().write()则是直接将内容写到Servlet引擎提供的缓冲区中,Servlet引擎按照缓冲区数据存放的顺序输出内容。运行结果: